Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 1차원 DP
- 2차원 dp
- 99클럽
- @GeneratedValue
- @GenericGenerator
- @Transactional
- Actions
- Amazon EFS
- amazon fsx
- Android Studio
- ANSI SQL
- ApplicationEvent
- async/await
- AVG
- AWS
- Azure
- bind
- builder
- button
- c++
- c++ builder
- c03
- Callback
- case when
- CCW
- chat GPT
- CICD
- Collections
- Combination
- combinations
Archives
- Today
- Total
기록
프로그래머스_python_트리 트리오 중간값 본문
문제
https://programmers.co.kr/learn/courses/30/lessons/68937
풀이
1. 트리의 지름
트리에서 어떤 두 노드를 선택해서 양쪽으로 쫙 당길 때, 가장 길게 늘어나는 경우가 있을 것이다.
이럴 때 트리의 모든 노드들은 이 두 노드를 지름의 끝 점으로 하는 원 안에 들어가게 된다.
이런 두 노드 사이의 경로의 길이를 트리의 지름이라고 한다.
https://www.acmicpc.net/problem/1967
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
'코딩테스트 > python' 카테고리의 다른 글
프로그래머스_python_[1차] 추석 트래픽 (0) | 2022.02.07 |
---|---|
프로그래머스_python_징검다리 건너기 (0) | 2022.02.03 |
프로그래머스_python_빛의 경로 사이클 (0) | 2022.01.14 |
프로그래머스_python_순위 검색 (0) | 2022.01.12 |
프로그래머스_python_도둑질 (0) | 2022.01.10 |
Comments