기록

프로그래머스_python_트리 트리오 중간값 본문

코딩테스트/python

프로그래머스_python_트리 트리오 중간값

youngyin 2022. 2. 2. 19:12

문제

https://programmers.co.kr/learn/courses/30/lessons/68937

 

코딩테스트 연습 - 트리 트리오 중간값

5 [[1,5],[2,5],[3,5],[4,5]] 2

programmers.co.kr

풀이

1. 트리의 지름

트리에서 어떤 두 노드를 선택해서 양쪽으로 쫙 당길 때, 가장 길게 늘어나는 경우가 있을 것이다.

이럴 때 트리의 모든 노드들은 이 두 노드를 지름의 끝 점으로 하는 원 안에 들어가게 된다.

이런 두 노드 사이 경로 길이를 트리의 지름이라고 한다.

https://www.acmicpc.net/problem/1967

 

1967번: 트리의 지름

파일의 첫 번째 줄은 노드의 개수 n(1 ≤ n ≤ 10,000)이다. 둘째 줄부터 n-1개의 줄에 각 간선에 대한 정보가 들어온다. 간선에 대한 정보는 세 개의 정수로 이루어져 있다. 첫 번째 정수는 간선이 연

www.acmicpc.net

2. 문제 풀이

  • 임의의 노드(1)에서 가장 먼 노드 X를 찾는다.
  • 노드 X에서 가장 먼 노드 Y를 찾는다.
    • 노드 Y가 두개 이상이면, 지름을 찾은 것이다.
  • 노드 Y에서 가장 먼 노드 Z를 찾는다.
    • 노드 Z가 두개 이상이면, 지름을 찾은 것이다.
    • 노드 Z가 한개 이하라면, 가장 가까운 노드를 선택해야 하므로 지름-1을 반환한다.

[EX1]

Find x : 1에서 가장 먼 노드는 4

Find y : 4에서 가장 먼 노드는 1

Find z : 1에서 가장 먼 노드는 4

return 2

 

1, 4, 3을 선택했을 때

(1, 4사이의 거리 = 3), (2, 4 사이의 거리 = 3), (1, 3 사이의 거리 = 2) 의 중간값은 

지름인 3-1 = 2이다.

[EX2]

Find x : 1에서 가장 먼 노드는 4, 3, 2

Find y : 4에서 가장 먼 노드는 3, 2, 1

return 2

코드

from collections import defaultdict
graph = defaultdict(list)

def search(root, n) : 
    stack = [(root, 0)]
    passed = [-1 for i in range(n+1)]
    weight = defaultdict(list)
    while stack :
        node, w = stack.pop()
        passed[node] = w
        weight[w].append(node)
        
        for c in graph[node] : 
            if passed[c] == -1 : 
                stack.append((c, w+1))
    return weight

def solution(n, edges):    
    for c, p in edges : 
        graph[c].append(p)
        graph[p].append(c)
    
    # 임의의 노드 1에서 가장 멀리 있는 노드 X를 찾는다.
    weight = search(1, n)
    diameter = max(weight)
    node_X = weight[diameter][0]
    
    # 노드 X에서 가장 먼 노드 Y를 찾는다.
    weight = search(node_X, n)
    diameter = max(weight)
    if len(weight[diameter])>=2 : return diameter
    
    # 노드 Y에서 가장 먼 노드 Z를 찾는다.
    node_Y = weight[diameter][0]
    weight = search(node_Y, n)
    diameter = max(weight)
    if len(weight[diameter])>=2 : return diameter
    return diameter-1

 

Comments