정점 개수 n과 무방향 간선 목록 edges로 이루어진 트리가 주어져요. 트리에서 가장 먼 두 정점 사이 경로의 길이(지나는 간선 수)를 반환해요. 이 값을 트리의 지름이라고 해요.
핵심은 이거예요. 어떤 정점을 지나는 가장 긴 경로는, 그 정점에서 자식 방향으로 가장 깊게 내려가는 두 갈래를 더한 거예요. 모든 정점에서 이 값을 구해 가장 큰 것이 지름이에요.
DFS 한 번으로 끝나요. 각 정점은 '내 아래로 가장 깊은 깊이'를 부모에게 돌려주고, 그 과정에서 '가장 깊은 두 갈래의 합'으로 지름 후보를 갱신해요.
예시
예시 1
예시 2
제한 사항
- 1 ≤ n ≤ 50,000
- edges.length는 n - 1이고, 그래프는 트리예요.
- 0 ≤ a, b < n
depth(v, parent)가 v에서 아래로 내려가는 최대 간선 수를 돌려주게 해요. 자식들의 깊이 중 가장 큰 둘을 기억해 그 합으로 지름 후보(best)를 갱신하고, 부모에게는 '가장 깊은 하나 + 1'을 돌려줘요. 마지막 best가 지름이에요.javascriptCopy codefunction treeDiameter(n, edges) {const adj = Array.from({ length: n }, () => []);for (const [a, b] of edges) {adj[a].push(b);adj[b].push(a);}let best = 0;function depth(v, parent) {let first = 0;let second = 0;for (const next of adj[v]) {if (next === parent) continue;const d = depth(next, v) + 1;if (d > first) {second = first;first = d;} else if (d > second) {second = d;}}best = Math.max(best, first + second);return first;}depth(0, -1);return best;}
이전 문제서브트리의 크기
다음 문제부분 문자열 찾기 (KMP)
예시 테스트만 실행 (Cmd/Ctrl+Enter)
숨김 테스트까지 채점 (Cmd/Ctrl+Shift+Enter)
에디터를 불러오고 있어요…
코드를 작성하고Ctrl↵를 눌러 예시 테스트를 확인해 보세요.