[LeetCode] 310. Minimum Height Trees

yunanยท2021๋…„ 2์›” 3์ผ
0
post-thumbnail

๐Ÿ”ฆ ๋ฌธ์ œ ๋งํฌ

๐Ÿ”Š ํŒŒ์ด์ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ธํ„ฐ๋ทฐ ์ฑ…์„ ์ฐธ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฌธ์ œ

ํŠธ๋ฆฌ์˜ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ฃจํŠธ๋กœ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋‚ฎ์€ ๋†’์ด๊ฐ€ ๋˜๊ฒŒ ๋ฃจํŠธ๋ฅผ ์„ ํƒํ•ด์„œ ๋ฐ˜ํ™˜ํ•˜์„ธ์š”.

โœ๏ธ ํ’€์ด


์•ฝ๊ฐ„์˜ ์ƒ๊ฐ์˜ ์ „ํ™˜์ด ํ•„์š”ํ•œ ๋ฌธ์ œ์ด๋‹ค.
์ตœ์†Œ ๋†’์ด๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฃจํŠธ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋ฆฌํ”„ ๋…ธ๋“œ ๋ถ€ํ„ฐ ์‚ญ์ œ ํ•ด๋‚˜๊ฐ€๋ฉด ๋‚จ์•„์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ํ†ตํ•ด ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. ๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„์ด๋ฏ€๋กœ ๋”•์…”๋„ˆ๋ฆฌ์— ์–‘์ชฝ ์—ฃ์ง€๋ฅผ ๋ชจ๋‘ ์ €์žฅํ•œ๋‹ค.
  2. ๋ชจ๋“  ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ๋Œ๋ฉด์„œ ๊ฐ„์„ ์ด ํ•˜๋‚˜์ธ ๋…ธ๋“œ๋ฅผ ์ฐพ์•„ ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•œ๋‹ค. (๋ฆฌํ”„๋…ธ๋“œ๋“ค)
  3. ์ฐพ์€ ๋ฆฌํ”„๋…ธ๋“œ๋ฅผ ๋”•์…”๋„ˆ๋ฆฌ์—์„œ ์‚ญ์ œํ•˜๊ณ  ๋ฌด๋ฐฉํ–ฅ์ด๋ฏ€๋กœ ๋ฐ˜๋Œ€ํŽธ ๋…ธ๋“œ์—์„œ๋„ ๋…ธ๋“œ์˜ ์‚ญ์ œ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.
  4. ์‚ญ์ œ๋ฅผ ์ง„ํ–‰ํ•œ ๋ฐ˜๋Œ€ํŽธ ๋…ธ๋“œ์˜ ๊ฐ„์„ ์˜ ๊ฐฏ์ˆ˜๊ฐ€ 1์ด๋ฉด ์ด ๋…ธ๋“œ๊ฐ€ ๋‹ค์‹œ ๋ฆฌํ”„ ๋…ธ๋“œ๊ฐ€ ๋œ๋‹ค.
  5. ์ „์ฒด ๋…ธ๋“œ์˜ ๊ฐฏ์ˆ˜๊ฐ€ 2๋ณด๋‹ค ๊ฐ™๊ฑฐ๋‚˜ ์ž‘์„ ๋•Œ ๊นŒ์ง€ ์ง„ํ–‰ํ•˜๋ฉฐ ๋ฐ˜๋ณต์„ ์ง„ํ–‰ํ•˜๊ณ  ๋‚จ์€ ๋ฆฌํ”„ ๋…ธ๋“œ๊ฐ€ ๋ฃจํŠธ ๋…ธ๋“œ๊ฐ€ ๋œ๋‹ค.

๐Ÿ›  ์ฝ”๋“œ


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๊ฐœ ๋‚จ์•˜์„ ๋•Œ๋„ ๋” ์ด์ƒ ๋ฆฌํ”„๋…ธ๋“œ๋„ ์—†๊ณ  ์ž์‹ ์ด ๋ฐ”๋กœ ๋ฃจํŠธ๋…ธ๋“œ์ด๋ฏ€๋กœ ๋ฐ”๋กœ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋œ๋‹ค.

๐ŸŽˆ ์ฐธ๊ณ 


Book ๋งํฌ

profile
Go Go

0๊ฐœ์˜ ๋Œ“๊ธ€