티스토리 뷰

알고리즘/백준

[BAEKJOON]1167 트리의 지름 - Python

응애~ 개발자 2022. 12. 28. 14:52
728x90
반응형

문제 요약

  • 알고리즘 분류:DFS, 트리
  • 난이도: Gold2
  • 문제내용:
    • 길이가 가장 긴 트리의 지름을 구해라
    • 노드개수 V, 그 다음 줄은 맨 앞에 노드 번호, 그 뒤는 -1 까지 노드와 연결된 노드 길이 여러개 준다.
 

1167번: 트리의 지름

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

www.acmicpc.net

문제풀이

   이번에는 문제 유형은 트리와 DFS 탐색 유형인 문제이다. 트리와 DFS관한 자세한 설명은 아래의 사이트에서 확인 해보면된다.

 

[알고리즘 이론] 트리(Tree)

이론 이번에 볼 자료구조는 트리이다. 트리는 연결리스트(Linked List)에서 노드간의 부모와 자식을 갖는 자료 구조이다. 연결리스트는 앞과 뒤로 이루어 져 있는데 트리는 계층별로 상하 관계로

jih3508.tistory.com

 

[알고리즘 이론] 깊이 우선 탐색(DFS)

이론 이번에 볼 자료구조는 깊이 우선 탐색(DFS)이다. 깊이 우선 탐색은 영어로 Depth First Search이고 줄어서 DFS라고 많이 부른다. 그래프 탐색 알고리즘 중 하나인데 그래프 말고도 트리에서도 적용

jih3508.tistory.com

문제 접근 방법

모든 노드를 출발점에서 길이를 구하면 O(V(V + E)) e가 최대개수가 V ^ 2 일수가 있어서 O(V ^ 3)이라는 시간 복잡도가 나올수있다.  그러면 노드 최대개수가 1,000개이면 시간 초과가 나올것이다.  이런 문제는 푸는 방법은 어떤 노드간에 거리가 긴  노드 한개를 탐색 한번만에 찾아 내면 O(V^2)시간 복잡도가 나올것이다.

 어떤 노드간에 거리가 긴  노드 한개를 탐색하는 방법은 아무 x노드에서 dfs탐색해서 거리가 가장 긴 노드를 탐색한 다음 그 노드로 부터 다시 dfs 탐색해서 거리가 긴것을 구하면 된다. 왜 그런지는 여기 사이트에서 참조하면될거 같다.

https://blog.myungwoo.kr/112

 

트리의 지름 구하기

트리에서 지름이란, 가장 먼 두 정점 사이의 거리 혹은 가장 먼 두 정점을 연결하는 경로를 의미한다. 선형 시간안에 트리에서 지름을 구하는 방법은 다음과 같다: 1. 트리에서 임의의 정점 $x$를

blog.myungwoo.kr

 위에는 왜그런지 증명하는 것이고 문제 예제로 간단하게 설명하겠다.

 예제 1번을 트리로 나타 내는 것이다. 그러면 리프 노드는 1, 5, 2중 하나만 선택 하면된다.

 위 표는 각 노드 간의 거리를 나타낸 것이고 각 노드마다 거리 긴것은 노란색으로 표시했다. 위 표를 보면 5를 제외 하면 가장 멀리 있는 노드는 5이다. 그러면 우리가 알수있는 것은 어떤 x노드에서 y까지 가장 멀리 있는 노드는 한 개빼고는 같기 때문에 아무 노드에서 시작해서 가장 멀리있는 노드를 찾아낸 다음 그 노드에서 가장 멀리있는 노드와의 거리를 출력하면된다.

정리

  1. 아무 노드 x를 지정해서 dfs탐색해서 가장 멀리 있는 노드를 가져온다.
  2. 가장 멀리있는 노드를 시작해서 dfs탐색한 다음 가장 긴 거리를 출력한다.

 

Code

V = int(input())

def dfs(start):
    stack = [start]
    distance = [0] * (V + 1)
    while stack:
        node = stack.pop()
        for next_node, weight in tree[node]:
            if distance[next_node] == 0 and next_node != start:
                distance[next_node] = distance[node] + weight
                stack.append(next_node)
    return distance.index(max(distance)) ,max(distance)

tree = {i : [] for i in range(1, V + 1)}
for _ in range(V):
    node, *array = map(int, input().split())
    for i in range(len(array)//2):
        tree[node].append((array[i * 2], array[i * 2 +1]))

node = dfs(3)[0]

print(dfs(node)[1])

 

728x90
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함