[Python] 1967 - 트리의 지름

2025. 4. 7. 22:36·Coding-Test/백준
728x90
반응형

[Gold IV] 트리의 지름 - 1967 

[문제 링크](https://www.acmicpc.net/problem/1967)

🗝️알고리즘 분류

  • 트리의 탐색
  • 깊이 우선 탐색(DFS)

💻문제 정의

주어진 트리에서 가장 멀리 떨어진 두 노드 사이의 길이를 구하는 문제이다.

 

💡접근 및 설계

문제에서 트리의 루트 노드는 항상 1번 노드라고 명시되어 있다. 따라서 루트 노드로 부터 가장 멀리 떨어진 노드를 찾고, 해당 노드에서 부터 가장 멀리 떨어진 노드를 찾은 다음, 두 노드 사이의 거리를 구하는 방식으로 접근하였다.

 

✏️알고리즘 풀이

graph = [[] for _ in range(N+1)] # 트리 초기화

for _ in range(N-1):
    a, b, c = map(int, input().split())
    graph[a].append([b, c])
    graph[b].append([a, c])

먼저 양방향 트리를 정의한다. a는 항상 b의 부모노드가 되고, c는 a와 b 사이의 길이를 나타낸다.

 

양방향 트리로 정의하는 이유는 DFS를 두 번 진행하기 때문이다. (루트 노드에서 한 번, 루트 노드와 가장 멀리 떨어진 노드에서 한 번)

 

# 방문(길이) 표시
visited = [-1 for _ in range(N+1)]
visited[1] = 0 # 루트 노드에선 길이 0

# DFS 탐색
def dfs(num, length):
    for a, b in graph[num]:
        if (visited[a] == -1):
            visited[a] = b + length # 현재의 길이와 하위 노드로 갈 때의 길이 합을 저장
            dfs(a, visited[a])

# 루트에서부터 모든 노드까지의 거리 탐색
dfs(1, 0)

start = visited.index(max(visited)) # 루트에서 부터 가장 멀리 떨어진 노드

visited = [-1 for _ in range(N+1)] # 방문 초기화
visited[start] = 0

dfs(start, 0) # start로부터 모든 노드까지의 거리 탐색

탐색을 시작할 노드와의 길이를 저장할 리스트를 정의한다. 첫 번째 탐색은 루트 노드 (1번 노드)에서 부터 시작할 것이니 visited[1]은 0으로 정의한다.

 

DFS 진행 과정에서, 자식 노드가 길이가 정의되지 않은(즉, 방문하지 않은) 노드일 경우 현재까지의 길이와 자식 노드까지의 길이를 더해준다.

 

이후 자식노드로 부터 DFS를 한다.

 

탐색이 종료되면 visited 리스트안에는 루트 노드로 부터 해당 노드까지의 길이가 각 인덱스 별로 저장되어 있다.

 

visited.index(max(visited))를 통해 길이가 가장 긴 값의 index를 가져온다. 해당 인덱스는 루트 노드와 가장 멀리 떨어진 노드의 번호가 된다.

 

해당 노드에서 부터 가장 멀리 떨어진 노드를 찾는 DFS를 진행한다.

 

🗒️전체 코드

# 1967 트리의 지름

import sys
input = sys.stdin.readline
sys.setrecursionlimit(1000000)

N = int(input())

graph = [[] for _ in range(N+1)] # 트리 초기화

for _ in range(N-1):
    a, b, c = map(int, input().split())
    graph[a].append([b, c])
    graph[b].append([a, c])

# 방문(길이) 표시
visited = [-1 for _ in range(N+1)]
visited[1] = 0 # 루트 노드에선 길이 0

# DFS 탐색
def dfs(num, length):
    for a, b in graph[num]:
        if (visited[a] == -1):
            visited[a] = b + length # 현재의 길이와 하위 노드로 갈 때의 길이 합을 저장
            dfs(a, visited[a])

# 루트에서부터 모든 노드까지의 거리 탐색
dfs(1, 0)

start = visited.index(max(visited)) # 루트에서 부터 가장 멀리 떨어진 노드

visited = [-1 for _ in range(N+1)] # 방문 초기화
visited[start] = 0

dfs(start, 0) # start로부터 모든 노드까지의 거리 탐색

print(max(visited)) # 가장 긴 길이가 트리의 지름이 된다.

 

Do_ProgrammingTest/TIL/1967_트리의 지름.md at main · Do-heewan/Do_ProgrammingTest

희완한 코딩테스트 준비. (Just do programming test like heewan.) - Do-heewan/Do_ProgrammingTest

github.com

 

728x90
반응형
저작자표시

'Coding-Test > 백준' 카테고리의 다른 글

[Python] 2580 - 스도쿠  (0) 2025.04.11
[Python] 9663 - N-Queen  (0) 2025.04.09
[Python] 15681 - 트리와 쿼리  (0) 2025.03.27
[Python] 2467 - 용액  (0) 2025.03.27
[Python] 2178 - 미로 탐색  (0) 2025.03.25
'Coding-Test/백준' 카테고리의 다른 글
  • [Python] 2580 - 스도쿠
  • [Python] 9663 - N-Queen
  • [Python] 15681 - 트리와 쿼리
  • [Python] 2467 - 용액
희완
희완
희완한 코딩일상
    반응형
  • 희완
    Code-Heewan
    희완
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Python
        • 가상환경
      • Coding-Test
        • 백준
        • 프로그래머스
        • 항해99
      • Data-Analysis
      • 웹 개발
        • django
      • AWS
      • 공모전
  • 링크

    • Github
  • hELLO· Designed By정상우.v4.10.3
희완
[Python] 1967 - 트리의 지름
상단으로

티스토리툴바