본문 바로가기

전체 글84

백준 1197번: 최소 스패닝 트리 (C++) 문제링크 https://www.acmicpc.net/problem/1197 풀이방법 해당 문제는 최소 신장 트리를 구하는 알고리즘을 사용하여 해결할 수 있다. 최소 신장 트리를 찾는 알고리즘에는 두 가지가 있다. 하나는 크루스칼 알고리즘 나머지 하나는 프림 알고리즘이다. 이 중 프림 알고리즘을 사용하여 해당 문제를 해결하였다. 최소 신장 트리를 찾는 알고리즘에 대한 개념이 없다면 아래 영상을 참고하자. https://www.youtube.com/watch?v=4wA3bncb64E&list=PLtqbFd2VIQv4O6D6l9HcD732hdrnYb6CY&index=28 코드 #include using namespace std; #define X first #define Y second int v, e; ve.. 2024. 2. 2.
백준 1766번: 문제집 (C++) 문제링크 https://www.acmicpc.net/problem/1766 백준 1766번 문제는 "문제집"이라는 제목으로 알려진 위상 정렬 문제입니다. 주어진 문제들을 풀기 위해 반드시 풀어야 하는 선행 문제들의 순서를 구하는 문제입니다. 풀이방법 이 문제는 위상 정렬 알고리즘을 사용하여 해결할 수 있습니다. 위상 정렬은 그래프의 노드들을 방향성을 유지하면서 정렬하는 알고리즘으로, 선후 관계가 있는 작업들을 순서대로 수행해야 할 때 유용하게 사용됩니다. 문제의 조건에 따르면 "문제를 풀기 전에 반드시 풀어야 하는 문제가 있다"는 조건이 있습니다. 이는 위상 정렬을 통해 문제를 풀어야 함을 의미합니다. 따라서 다음과 같은 접근 방법으로 문제를 해결할 수 있습니다. 입력으로 주어진 문제들의 선행 관계를 그.. 2024. 2. 2.
백준 2623번: 음악프로그램 (C++) 문제링크 https://www.acmicpc.net/problem/2252 풀이방법 해당 문제는 바킹독님 풀이를 참조하였다. 바킹독님 풀이 설명은 아래와 같다. 이 풀이에서는 출연자 순서를 그래프로 추상화한다. 가수 번호를 순차적으로 입력 받는데, 이들을 u에서 v로 가는 간선이라 가정하여 indegree 값을 계산한다.(indegree 배열: 다른 노드에서 해당 노드로 들어오는 간선의 수) 예제 입력 중 한 줄인 3 1 4 3에서 간선의 정보를 아래와 같이 설정한다. 1 -> 4 / 4 -> 3 (1에서 4로 가는 간선 / 4에서 3으로 가는 간선) 이 경우 4와 3의 indegree를 각각 1씩 증가시킨다. indegree는 0인 정점은 자신에게 들어오는 간선이 없다는 것이므로, 해당 정점들은 현재 .. 2024. 2. 2.
백준 2252번: 줄 세우기 (C++) 문제링크 https://www.acmicpc.net/problem/2252 풀이방법 해당 문제는 기본적으로 위상 정렬 알고리즘을 이용하여 쉽게 해결하였다. 학생 A가 학생 B앞의 서야 한다는 것은 A노드가 B노드를 가르키고 있다고 생각하여 그림을 그려보면 쉽게 이해가 갈 것이다. 그렇게 그린 그래프를 바탕으로 위상 정렬 알고리즘을 구현하면 된다. 위상 정렬 알고리즘에 대한 개념이 없다면 아래 영상을 참고하자 https://www.youtube.com/watch?v=Th-gLZUrd04&list=PLtqbFd2VIQv4O6D6l9HcD732hdrnYb6CY&index=27 해답 코드는 다음과 같다. 코드 #include using namespace std; vector adj[32005]; int deg[.. 2024. 2. 2.
백준 1240번: 노드사이의 거리 (C++) 문제링크 https://www.acmicpc.net/problem/15681 풀이방법 해당 문제를 해결한 sequence는 다음과 같다. 기본적으로 bfs를 사용했고 bfs를 통해서 각 노드를 탐색해 나가면서 시작 노드로부터의 거리를 전부 구하면 된다. vector adj[1005]; 변수를 통해서 특정 두 노드의 번호와 거리를 입력받는다. int bfs(int start, int end) 함수를 통해서 말그대로 start지점을 트리의 루트로 생각하고 탐색을 시작하여 end 지점까지의 거리를 구하기 위해서 dist 배열을 통해서 탐색해나가는 노드와의 거리를 계산해나간다. 최종적으로 dist[end]를 return하여 입력받은 두 노드 사이의 거리를 출력한다. 코드 #include using namespa.. 2024. 2. 2.
백준 15681번: 트리와 쿼리 (C++) https://www.acmicpc.net/problem/15681 풀이방법 해당 문제는 아래 설명되어있는 힌트를 토대로 문제를 해결하였다. 문제를 해결한 sequence는 다음과 같다. 우선 입력 받은 r값을 루트로 하는 트리를 구현한다. 이때 탐색하는 현재 노드의 자식 노드를 child변수를 이용하여 저장해 둔다. countSubtreeNodes함수를 사용하여 r기준으로 만들어지는 트리를 바탕으로 각 노드별로 만들 수 있는 서브 트리의 개수를 구하여 treeSize 배열 변수에 저장한다. 최종적으로 입력 받은 UTree를 treeSize배열 인덱스로 사용하여 원하는 출력 값을 얻어낸다. 코드 #include using namespace std; int n, r, q, u, v; vector adj[1.. 2024. 2. 2.
백준 4803번: 트리 (C++) https://www.acmicpc.net/problem/4803 풀이방법 개인적으로 문제를 푸는데 어려움이 있었다.. 첫 번째 이유는 문제가 잘 이해가 안 갔고, 두번째로 문제를 이해하고 나서 구현 방법 자체가 헷갈렸다. 첫 번째로 해당 문제를 이해하자면 n개의 정점으로 이루어진 그래프가 여러 개 존재하게 되는데 그 그래프 중에서 트리 형태의 그래프가 몇 개인지 맞추는 문제라고 볼 수 있다 이해가 안 가면 예시 입력을 바탕으로 그림을 그려보면 쉽게 이해가 갈 것이다. 두 번째로 구현 자체가 어려웠는데 bfs를 만들어서 풀 수 있다. 여기서 가장 중요한 포인트는 아래 코드 중에서 bfs함수 안쪽을 보면 if (nxt == prev) continue;의 의미는 bfs탐색 할 때 트리 같은 경우는 루트부터 .. 2024. 2. 2.
백준 1991번: 트리 순회 (C++) https://www.acmicpc.net/problem/1991 풀이방법 해당 문제는 트리 탐색 방법 중에서 재귀를 활용한 전위 순회(preorder traversal), 중위 순회(inorder traversal), 후위 순회(postorder traversal)를 코드로 구현하는 방법을 물어보는 문제다. 순회에 대한 3가지 개념을 이론적으로만 알고 있어도 특별히 어려움은 없으나, 문자열을 숫자로 변환해서 생각 하는게 조금, 아주조금 헷갈릴 수 있는 문제다. 허나 A=1이라는 가정하고 문제를 풀면 굉장히 쉽게 풀 수 있다. 해설 풀이는 아래와 같다. 코드 #include using namespace std; int p[100'005]; vector adj[100'005]; int n; void dfs.. 2024. 2. 2.