글로벌 시대에 당연히 알고리즘의 영어 이름도 알아야겠다고 생각해서 검색해보았다. 그런데, 한국어로 검색했을 때는 대부분 트리 지름, 트리의 지름으로 키워드가 검색되었는데 영어로 검색했을 때는 Diameter of Binary Tree 였다. 트리의 지름 유형에서는 어쩌면 당연한 이야기일지도?
트리의 지름이란?
트리의 지름이란, 트리에서 임의의 두 점 사이의 거리 중 가장 긴 것을 말한다.
그런데 왜 지름이라고 하는 거지? 가장 긴 트리 사이의 경로라던가
백준 1967번 문제의 설명을 보면 좀 더 직관적으로 받아들일 수 있다.
풀이: 탐색 2번
1. 이진 트리가 있다.
2. 임의의 노드 p에서 DFS를 실행하여 p로부터 가장 먼 거리의 노드 a를 구한다.
3. 노드 a에서 DFS를 다시 실행하여 a로부터 가장 먼 거리의 노드 b를 구한다.
4. a→b 의 거리가 트리의 지름이다.
증명
(가정) 트리에서 $dis(u, v)$의 경로가 트리의 지름이다. 임의의 노드 x에서 가장 먼 노드는 y이다.
이때 케이스를 나눠보자.
$i.$ x가 u 또는 v인 경우
$ii.$ y가 u 또는 v인 경우
$iii.$ x, y, u, v가 서로 다른 경우
Case1. x가 u 또는 v인 경우
가정에 따라 x에서 가장 먼 노드인 y까지의 거리는 트리의 지름이다.
왜냐하면 x가 이미 트리 지름의 한 쪽 끝이기 때문에 dfs를 돌릴 경우 다른 트리의 끝 점으로 가는 것이 당연하다.
Case2. y가 u 또는 v인 경우
가정에 따라 x에서 가장 먼 노드인 y까지의 거리는 트리의 지름이다.
Case3. x, y, u, v가 서로 다른 경우
이 경우 다시 케이스를 두 가지로 나눌 수 있다.
$dis(u, v)$의 경로와 $dis(x, y)$의 경로가 한 점 이상 공유하는 경우
x에서 DFS를 수행할 경우 가정에 따라 가장 먼 노드는 y이다.
가장 먼 노드가 y라는 것은 $dis(x, t)$값은 고정되어 있으므로 d1, d2, d3를 비교하였을 때 최대값이 d3라는 의미이다.
이때, $d1 \neq d2$를 가정해보자.
$i.$ $d1 > d2$ 인 경우
우리는 위에서 $d3$가 최대임을 알아냈으므로 $d3 \geq d1 > d2$가 성립한다.
그런데 가정에 따라 $dis(u, v)$가 트리 지름이므로 $d1 + d2 > d1 + d3$임을 알 수 있다.
양변의 $d1$을 소거할 경우 $d2 > d3$이고 이는 위의 $d3 \geq d1 > d2$와 모순이다.
$ii.$ $d1 < d2$ 인 경우
마찬가지로 우리는 위에서 $d3$가 최대임을 알아냈으므로 $d3 \geq d2 > d1$가 성립한다.
그런데 가정에 따라 $dis(v, u)$가 트리 지름이므로 $d2 + d1 > d2 + d3$임을 알 수 있다.
양변의 $d2$을 소거할 경우 $d1 > d3$이고 이는 위의 $d3 \geq d2 > d1$와 모순이다.
따라서 귀류법을 통해 $d1 = d2 = d3$임을 알 수 있다.
따라서 이후 y에서 두 번째 dfs를 수행할 경우 y에서 가장 먼 정점까지의 거리를 구하면 2d로 트리의 지름과 같아지게 된다.
즉즉 트리의 지름을 구할 수 있게 된다.
$dis(u, v)$의 경로와 $dis(x, y)$의 경로가 한 점 이상 공유하지 않는 경우
x에서 DFS를 수행한다. 이때 가장 먼 노드가 y이려면
$dis(x, a)$가 고정이므로 $dis(a, y) \geq dis(a, b) + dis(b, v)$여야 한다.
그럼 노드 u에서 가장 먼 정점을 찾아보자.
$dis(u, b)$가 고정이므로 $dis(b, v) \geq dis(b, a) + dis(a, y)$여야 한다. (by. 가정)
이때 두 부등식을 더해보면
$dis(a, y) + dis(b, v) \geq dis(a, b) + dis(b, v) + dis(b, a) + dis(a, y)$
양변을 소거해보면
$0 \ge dis(a, b) + dis(b, a)$
이므로 모순이다.
Case3의 결론 :$dis(u, v)$의 경로와 $dis(x, y)$의 경로가 최소 한 점 이상 공유한다. 그리고 이때 귀류법에 의해 겹치는 경로에서부터 y, u, v까지의 거리가 모두 같고 이때 두 번째 dfs를 통해 트리의 지름을 구할 수 있다.
백준(BOJ) 문제
[백준 1967 | C++] 트리의 지름 :: 트리의 지름
[백준 1967 | C++] 트리의 지름 :: 트리의 지름
문제 링크 : 1967번: 트리의 지름관련 태그 : 트리, 그래프, 깊이우선탐색참고 자료 : 2025.01.05 - [STUDY/Algorithm] - [Algorithm] Diameter of Binary Tree : 트리의 지름 [알고리즘] Diameter of Binary Tree : 트리의 지
yeonee911.tistory.com
2025.01.06 - [BOJ] - [백준 1167 | C++] 트리의 지름 :: 트리의 지름
[백준 1167 | C++] 트리의 지름 :: 트리의 지름
문제 링크 : 1167번: 트리의 지름관련 태그 : 그래프 이론, 그래프 탐색, 트리, 깊이 우선 탐색참고 자료 : 2025.01.05 - [STUDY/Algorithm] - [알고리즘] Diameter of Tree : 트리의 지름 [알고리즘] Diameter of Binary
yeonee911.tistory.com
참고 자료 및 사이트
'STUDY > Algorithm' 카테고리의 다른 글
[알고리즘] Line-Segment Intersection : 선분 교차 판정 (1) | 2024.09.17 |
---|---|
[알고리즘] CCW (Counter Clock Wise) (0) | 2024.09.17 |
[알고리즘] Binary Search : 이분 탐색 (0) | 2024.08.20 |
[알고리즘] Repeated Squaring : 분할 정복을 이용한 거듭제곱 (0) | 2024.07.28 |