본문 바로가기

Problem Solving/Baekjoon

[백준 1167 C++] 트리의 지름

트리의 지름 문제 링크 (백준(BOJ) 1167번 문제): https://www.acmicpc.net/problem/1167

 

1167번: 트리의 지름

트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2 ≤ V ≤ 100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. 정점 번호는 1부터 V까지

www.acmicpc.net

문제 설명

백준 1167번 트리의 지름 문제는 가중치가 있는 트리에서 노드 간에 거리가 가장 먼 트리의 지름을 구하는 문제이다. 

문제 풀이 

백준 1167번 트리의 지름 문제는 깊이 우선 탐색(Depth First Search) 혹은 너비 우선 탐색(Breadth First Search) 알고리즘을 사용하여 풀 수 있는 문제이다. 

 

첫 번째 시도 (시간 초과) 

처음 시도한 방법은 노드의 끝을 의미하는 리프 노드에서 다른 리프 노드 간에 거리가 최대인 값을 구하는 방식으로 구현을 하였다. 즉, 각 정점을 다 돌면서 Vector Size가 1 인 노드가 있는 경우, 리프 노드이므로 DFS 알고리즘을 돌려 최대인 값을 도출하는 방식으로 시도하였지만 정점이 100,000개로 입력이 주어져서 시간초과가 발생했다. 

 

두 번째 시도 (통과)

첫 번째 시도에서 각 리프 노드에서 DFS를 돌리는 것은 너무 시간이 오래 걸린다는 사실을 알게 되어, DFS를 최소한으로 돌리면서 트리의 지름을 구하는 방법을 생각하였다.

 

[핵심 아이디어]

그 결과 특정 노드 X 에서 DFS를 시행한 후, 특정 X에서 거리가 가장 먼 노드가 트리의 지름을 만드는 2개의 노드 중 하나라는 사실을 알게 되었다. 이후, 위 과정을 거쳐 나온 특정 X에서 거리가 가장 먼 노드에서 다시 DFS를 시행하게 되면, 트리의 지름 값을 얻을 수 있게 된다는 것이었다. 

 

그리하여, 총 2번의 DFS를 통해 지름의 길이를 알 수 있게 되는 것이다. 

이를 코드로 나타내면, 아래와 같이 나타낼 수 있다. 

 

'Problem Solving > Baekjoon' 카테고리의 다른 글

[백준 2638 C++] 치즈  (0) 2022.01.03
[백준 2407 C++] 조합  (0) 2021.12.30
[백준 1504 C++] 특정한 최단 경로  (0) 2021.12.28
[백준 1238 C++] 파티  (0) 2021.12.28
[백준 1149 C++] RGB 거리  (0) 2021.12.28