Solution
import collections
from typing import List
class Solution:
# μΈκ³½ λ
Έλ -> ν κ°μ μ΄μλ§ κ°μ§λ λ
Έλ, νΈλ¦¬μ λμ΄λ₯Ό μ΅μννλ λ
Έλλ€ μ€ νλμΌ μ μμ
# BFSλ‘ νμ -> μμ λ
ΈλλΆν° μμνμ¬ μΈμ ν λ
Έλλ₯Ό νμ μΆκ°νκ³ , νμμ λ
Έλλ₯Ό νλμ© κΊΌλ΄μ΄ νμ
# μ΅μ λμ΄ νμ λ°©λ² -> μΈκ³½ λ
Έλλ‘λΆν° μ§ννλ©΄μ λ
Έλλ€μ νμ, λͺ¨λ μΈκ³½ λ
Έλκ° νμμ μ κ±°λ λκΉμ§ λ°λ³΅
def findMinHeightTrees(self, n: int, edges: List[List[int]]) -> List[int]:
# κ·Έλνμ λ
Έλκ° νλλ§ μλ κ²½μ°
if n == 1:
return [0]
graph = collections.defaultdict(set)
# μΈμ 리μ€νΈ(graph) μμ±
for x, y in edges:
graph[x].add(y)
graph[y].add(x)
# μΈκ³½ λ
Έλ(outsides) ꡬνκΈ°
outsides = []
for node in graph:
if len(graph[node]) == 1:
outsides.append(node)
while n > 2: # λ
Έλκ° 2 μ΄νκ° λ λ μ€λ¨
# νμ¬ μΈκ³½ λ
Έλμ μλ₯Ό λΉΌμ€μΌλ‘μ¨ λ
Έλμ μ μ
λ°μ΄νΈ
n -= len(outsides)
# λ€μ λ¨κ³μ μΈκ³½ λ
Έλλ₯Ό λ΄λ 리μ€νΈ
new_outsides = []
for outside in outsides:
# νμ¬ μΈκ³½ λ
Έλμ μ΄μ λ
Έλ
# pop(): μ΄μ λ
Έλ μ€ νλλ₯Ό μ ν ν -> κ·Έ λ
Έλλ₯Ό μ΄μΈμ μ΄μλ€κ³Όμ μ°κ²°μ λμ
outside_neighbor = graph[outside].pop()
# μ΄μ λ
Έλμμ μ°κ²°μ λμ΄μ€ -> μ΄λ₯Ό ν΅ν΄ μΈκ³½ λ
Έλμ μ°κ²°λ κ² μ κ±°λ¨
graph[outside_neighbor].remove(outside)
# μΈκ³½ λ
ΈλμΈ κ²½μ°
if len(graph[outside_neighbor]) == 1:
# λ€μ λ¨κ³μ μΈκ³½ λ
Έλμ λ΄μ
new_outsides.append(outside_neighbor)
outsides = new_outsides
return outsides
Leave a comment