๐
ํ์ด์ฌ ์๊ณ ๋ฆฌ์ฆ ์ธํฐ๋ทฐ
์ฑ ์ ์ฐธ๊ณ ํ์ต๋๋ค.
ํธ๋ฆฌ์ ๋ชจ๋ ๋ ธ๋๋ฅผ ๋ฃจํธ๋ก ์ ํํ ์ ์์ต๋๋ค. ๊ฐ์ฅ ๋ฎ์ ๋์ด๊ฐ ๋๊ฒ ๋ฃจํธ๋ฅผ ์ ํํด์ ๋ฐํํ์ธ์.
์ฝ๊ฐ์ ์๊ฐ์ ์ ํ์ด ํ์ํ ๋ฌธ์ ์ด๋ค.
์ต์ ๋์ด๋ฅผ ๊ตฌํ๊ธฐ ์ํด ๋ฃจํธ๋ฅผ ์ ํํ๋ ๊ฒ์ด ์๋ ๋ฆฌํ ๋
ธ๋ ๋ถํฐ ์ญ์ ํด๋๊ฐ๋ฉด ๋จ์์๋ ๋
ธ๋๋ฅผ ํตํด ๋ฃจํธ ๋
ธ๋๋ฅผ ๊ตฌํ ์ ์๋ค.
class Solution:
def findMinHeightTrees(self, n: int, edges: List[List[int]]) -> List[int]:
if n <= 1:
return [0]
# ์๋ฐฉํฅ ๊ทธ๋ํ ๊ตฌ์ฑ
graph = collections.defaultdict(list)
for i, j in edges:
graph[i].append(j)
graph[j].append(i)
# ์ฒซ ๋ฒ์งธ ๋ฆฌํ ๋
ธ๋ ์ถ๊ฐ
leaves = []
for i in range(n + 1):
if len(graph[i]) == 1:
leaves.append(i)
# ๋ฃจํธ ๋
ธ๋๋ง ๋จ์ ๋๊น์ง ๋ฐ๋ณต ์ ๊ฑฐ
while n > 2: # 2๊ฐ ๋จ์์ ๋ ์๋ก๊ฐ ๋ฆฌํ๋
ธ๋๊ฐ ๋๋ฏ๋ก ๋ฐ๋ณต๋ฌธ์ ๋น ์ ธ๋์จ๋ค.
n -= len(leaves)
new_leaves = []
for leaf in leaves:
neighbor = graph[leaf].pop() # 1๊ฐ ์ฐ๊ฒฐ๋์๋ ๋
ธ๋๋ฅผ ๋นผ์ ๋ค์ ์กฐ๊ฑด ๋
ธ๋๋ก ์ ํํ๋ค.
graph[neighbor].remove(leaf) # ์ผ๋จ ๋ฆฌํ๋
ธ๋๋ฅผ ์ ์ธ์ํจ๋ค.
if len(graph[neighbor]) == 1: # ๋ค์ ์กฐ๊ฑด ๋
ธ๋์ ๊ฐ์ ๊ฐฏ์๊ฐ 1์ธ์ง(๋ฆฌํ๋
ธ๋) ๊ฒ์ฌํ๋ค.
new_leaves.append(neighbor)
leaves = new_leaves
return leaves
๋ฐ๋ณต์ 2๋ณด๋ค ํด ๋๊น์ง๋ง ์งํํ๋ ์ด์ ๋ ๋ ธ๋๊ฐ 2๊ฐ ๋จ์์ ๋๋ ์๋ก๊ฐ ๋ฆฌํ๋ ธ๋์ด๋ฏ๋ก ๋ ์งํํ๋ฉด ๋ฃจํธ๋ ธ๋๋ฅผ ๊ตฌํ ์ ์๋ค. ๋ํ ๋ ธ๋๊ฐ 1๊ฐ ๋จ์์ ๋๋ ๋ ์ด์ ๋ฆฌํ๋ ธ๋๋ ์๊ณ ์์ ์ด ๋ฐ๋ก ๋ฃจํธ๋ ธ๋์ด๋ฏ๋ก ๋ฐ๋ก ๋ฐํํ๋ฉด ๋๋ค.