https://github.com/Dev-Guccin
Guccin
https://github.com/Dev-Guccin
전체 방문자
오늘
어제
  • 분류 전체보기 (172)
    • 알고리즘 (140)
    • 삽질방지 (13)
    • SystemHacking (1)
    • 일상 (4)
    • 개발 (8)
    • 스프링 부트 REST API 개발일지 (5)
    • JPA (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • python3
  • 백준
  • LIS
  • 프로그래머스
  • 그리디
  • counter
  • 그래프
  • Python
  • BFS
  • 이분 탐색
  • 파이썬
  • 최단경로
  • 이분탐색
  • 다이나믹프로그래밍
  • 백트래킹
  • MST
  • heapq
  • 다이나믹 프로그래밍
  • 최소힙
  • 12015
  • 유니온 파인드
  • 다익스트라
  • DFS
  • 재귀
  • 큐
  • DP
  • 최대공약수
  • 재귀함수
  • 유클리드호제법
  • 스택

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
https://github.com/Dev-Guccin

Guccin

[python3] 1167 풀이 (트리의 지름, 트리, DFS)
알고리즘

[python3] 1167 풀이 (트리의 지름, 트리, DFS)

2022. 3. 25. 16:42

문제가 어려워서 힌트를 봤고 이해하고 나니 쉽게 풀 수 있었다.

트리가 주어진다. 이때 트리의 지름을 구하는 문제이다. 트리의 지름을 어떻게 구해야하는지 이해하지 못하면 풀수가 없다.

트리가 주어졌을대 트리의 지름을 구하기 위해서는 가장 끝점을 알아내야한다.
처음에는 각 노드마다 다익스트라를 할지 플로이드를 할지 고민했다. 그런데 주어지는 노드가 100,000개이기 때문에 구할 수가 없다. 따라서 다른 방법을 사용해야한다. 
그래서 이리저리 지지고 볶으니 한줄로 세우는 방법이면 되지 않을까 싶었다. 그래서 한줄로 세워보았다.

그런데 이렇게 세운다고 달라지지가 않았다. 더이상 고민하는게 무의미하여 찾아보니 아무 노드나 잡고 가장 먼것을 찾아본다. 그럼 지름의 끝 노드를 찾을 수 있었다. 만약 3번 노드에서 시작하는 경우 DFS로 5번이 가장 멀다는 것을 확인가능하다.

그런데 이때 백트래킹을 사용할수가 없어서 DFS로 모든 노드를 방문하며 각 노드별 값을 찾아준다.

그러면 5번 노드의 위치가 가장 긴것을 확인가능하다. 이제는 5번 노드를 시작으로 각 노드별 거리를 구해본다.

그럼 최종적으로 1번 위치에서 가장 높은 값을 가지므로 이 트리의 지름은 11이라고 판단할 수 있다. 원리는 쉬우나 이걸 떠올리기가 어려웠다. 이를 코드로 작성하면 아래와 같다.

N = int(input())
visited = {}
adj = {}
for i in range(N):
    tmp = list(map(int, input().split()))
    nodeNum = tmp[0]
    visited[nodeNum] = False
    i = 1
    while True:
        if tmp[i] == -1:
            break
        nextNode = tmp[i]
        i += 1
        weight = tmp[i]
        i += 1
        if nodeNum in adj:
            adj[nodeNum].append([nextNode, weight])
        else:
            adj[nodeNum] = [[nextNode, weight]]
final = [0, 0]


def DFS(node, total):
    global final
    if final[1] < total:
        final = [node, total]
    # weight가 가장 큰거 뽑기
    for nextItem in adj[node]:
        nextNode, weight = nextItem
        if visited[nextNode] != True:
            visited[nextNode] = True
            DFS(nextNode, total+weight)


visited[nodeNum] = True
DFS(nodeNum, 0)
node, weight = final
final = [0, 0]
for key in visited:
    visited[key] = False
visited[node] = True
DFS(node, 0)
print(final[1])
저작자표시 (새창열림)

'알고리즘' 카테고리의 다른 글

[python3] 백준 11000 (강의실 배정, 최소힙, 그리디)  (0) 2022.05.08
[python3] 백준 1991 (트리 순회, 트리, 재귀)  (0) 2022.03.26
[python] 조합을 DFS로 구하기  (0) 2022.03.25
[python3] Trie 구현  (0) 2022.03.19
[dp] 모듈러 분배법칙  (0) 2022.03.12
    '알고리즘' 카테고리의 다른 글
    • [python3] 백준 11000 (강의실 배정, 최소힙, 그리디)
    • [python3] 백준 1991 (트리 순회, 트리, 재귀)
    • [python] 조합을 DFS로 구하기
    • [python3] Trie 구현
    https://github.com/Dev-Guccin
    https://github.com/Dev-Guccin
    https://github.com/Dev-Guccin

    티스토리툴바