티스토리 뷰
728x90
반응형
문제 요약
- 알고리즘 분류:DFS, 트리
- 난이도: Gold2
- 문제내용:
- 길이가 가장 긴 트리의 지름을 구해라
- 노드개수 V, 그 다음 줄은 맨 앞에 노드 번호, 그 뒤는 -1 까지 노드와 연결된 노드 길이 여러개 준다.
문제풀이
이번에는 문제 유형은 트리와 DFS 탐색 유형인 문제이다. 트리와 DFS관한 자세한 설명은 아래의 사이트에서 확인 해보면된다.
문제 접근 방법
모든 노드를 출발점에서 길이를 구하면 O(V(V + E)) e가 최대개수가 V ^ 2 일수가 있어서 O(V ^ 3)이라는 시간 복잡도가 나올수있다. 그러면 노드 최대개수가 1,000개이면 시간 초과가 나올것이다. 이런 문제는 푸는 방법은 어떤 노드간에 거리가 긴 노드 한개를 탐색 한번만에 찾아 내면 O(V^2)시간 복잡도가 나올것이다.
어떤 노드간에 거리가 긴 노드 한개를 탐색하는 방법은 아무 x노드에서 dfs탐색해서 거리가 가장 긴 노드를 탐색한 다음 그 노드로 부터 다시 dfs 탐색해서 거리가 긴것을 구하면 된다. 왜 그런지는 여기 사이트에서 참조하면될거 같다.
위에는 왜그런지 증명하는 것이고 문제 예제로 간단하게 설명하겠다.
예제 1번을 트리로 나타 내는 것이다. 그러면 리프 노드는 1, 5, 2중 하나만 선택 하면된다.
위 표는 각 노드 간의 거리를 나타낸 것이고 각 노드마다 거리 긴것은 노란색으로 표시했다. 위 표를 보면 5를 제외 하면 가장 멀리 있는 노드는 5이다. 그러면 우리가 알수있는 것은 어떤 x노드에서 y까지 가장 멀리 있는 노드는 한 개빼고는 같기 때문에 아무 노드에서 시작해서 가장 멀리있는 노드를 찾아낸 다음 그 노드에서 가장 멀리있는 노드와의 거리를 출력하면된다.
정리
- 아무 노드 x를 지정해서 dfs탐색해서 가장 멀리 있는 노드를 가져온다.
- 가장 멀리있는 노드를 시작해서 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
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[BAEKJOON]2263 트리의 순회- Python (0) | 2023.01.02 |
---|---|
[BAEKJOON]1918 후위 표기식 - Python (0) | 2022.12.29 |
[BAEKJOON]2377 Pottery - Visual Basic (0) | 2022.12.28 |
[BAEKJOON]2206 벽 부수고 이동하기 - Python (0) | 2022.12.26 |
[BAEKJOON]2377 Pottery - FreeBASIC (0) | 2022.12.24 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 그리디
- 동적 계획법
- 조합
- spring-boot
- 백트레킹
- JSCODE
- DP
- BFS
- LeetCode
- 백준
- 문자열
- DFS
- 파이썬
- 동적계획법
- 알고리즘
- Python
- 넓이 우선 탐색
- 이론
- java
- Programmerse
- 누적합
- 그래프
- 자바
- 수학
- 구현
- Greedy
- 재귀호출
- 배열
- BaekJoon
- level2
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함