ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

728x90
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

 

2250๋ฒˆ: ํŠธ๋ฆฌ์˜ ๋†’์ด์™€ ๋„ˆ๋น„

์ฒซ์งธ ์ค„์— ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ N(1 ≤ N ≤ 10,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ ์ค„๋งˆ๋‹ค ๋…ธ๋“œ ๋ฒˆํ˜ธ์™€ ํ•ด๋‹น ๋…ธ๋“œ์˜ ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ์™€ ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. ๏ฟฝ๏ฟฝ

www.acmicpc.net

 

๋ฌธ์ œ ํ’€์ด

 ํŠธ๋ฆฌ๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ, ๊ฐ€์žฅ ๋„“์ด๊ฐ€ ๋†’์€ ๊ฒฝ์šฐ์— ๋ ˆ๋ฒจ๊ณผ ๋„“์ด๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ์ด๋‹ค. ์ž…๋ ฅ ์˜ˆ์ œ์˜ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด 1์„ ๊ธฐ์ค€์œผ๋กœ left child๋ถ€ํ„ฐ ์ธ๋ฑ์Šค๊ฐ€ ํ• ๋‹น๋˜๊ณ , 1์˜ ์ธ๋ฑ์Šค๋ฅผ ํ• ๋‹นํ•œ ํ›„์— right child์˜ ์ธ๋ฑ์Šค๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ์ค‘์œ„ ์ˆœํšŒ๋ฅผ ํ†ตํ•ด ํŠธ๋ฆฌ์˜ ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ๋ฅผ ๋ถ€์—ฌํ•œ ๊ฒƒ์ด๋ผ๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ค‘์œ„ ์ˆœํšŒ์˜ ๊ฒฝ์šฐ ํŠธ๋ฆฌ ์ˆœํšŒ ๋ฌธ์ œ์—์„œ ๋‹ค๋ฃจ์—ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์„ ์ง„ํ–‰ํ•˜๋ฉด ๋‹ต์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

  • ํŠธ๋ฆฌ๋ฅผ ์ค‘์œ„ ์ˆœํšŒํ•˜๋ฉฐ ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ ๋ถ€์—ฌํ•˜๊ณ  ๋ ˆ๋ฒจ(depth) ๋ณ„๋กœ ๊ตฌ๋ถ„
  • ๋ ˆ๋ฒจ 1๋ถ€ํ„ฐ N๊นŒ์ง€ ์ธ๋ฑ์Šค์ฐจ๊ฐ€ ๊ฐ€์žฅ ๋งŽ์ด ๋‚˜๋Š” ๋ ˆ๋ฒจ๊ณผ, ์ธ๋ฑ์Šค ์ฐจ๋ฅผ ๋ฐ˜ํ™˜

 

์ฝ”๋“œ

from sys import stdin


def in_order(node, level):
    global idx
    left, right = graph[node].values()
    if left != -1:
        in_order(left, level + 1)

    node_per_level[level].append(idx)
    idx += 1

    if right != -1:
        in_order(right, level + 1)


if __name__ == '__main__':
    n = int(stdin.readline())
    graph = dict()
    parent_check = [False] * n
    node_per_level = [[] for _ in range(n)]
    idx = 1

    # ๊ทธ๋ž˜ํ”„ ์ •๋ณด ์ดˆ๊ธฐํ™”, Parent ์ •๋ณด ์ฒดํฌ
    for _ in range(n):
        node, left, right = map(int, stdin.readline().split())

        if left != -1:
            parent_check[left - 1] = True
        if right != -1:
            parent_check[right - 1] = True
        graph[node] = {'l': left, 'r': right}

    # root ๋…ธ๋“œ๋ฅผ ์ฐพ์Œ.
    root = parent_check.index(False) + 1

    # ์ค‘์œ„ ์ˆœํšŒ๋ฅผ ํ†ตํ•ด, ๊ฐ ๋ ˆ๋ฒจ๋ณ„๋กœ ์ธ๋ฑ์Šค๋ฅผ ๋ถ„๋ฅ˜ํ•จ
    in_order(root, 0)

    max_level, max_level_width = 0, 0

    # ๋ ˆ๋ฒจ ๋ณ„๋กœ ์ธ๋ฑ์Šค์˜ ์ฐจ๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ , ๊ฐ€์žฅ ํฐ ๊ฒฝ์šฐ๋ฅผ ์ฐพ์Œ
    for level, nodes in enumerate(node_per_level):
        if nodes:
            width = max(nodes) - min(nodes) + 1
            if max_level_width < width:
                max_level_width = width
                max_level = level + 1

    print(max_level, max_level_width)

 N์ด 1์ธ ๊ฒฝ์šฐ๋ฅผ ๋ฐ˜์˜ํ•˜์ง€ ๋ชปํ•ด, 92% ์ฏค์—์„œ ํ‹€๋ ธ๋‹ค๊ณ  ํ•˜์—ฌ N์ด 1์ธ ๊ฒฝ์šฐ๋„ ๋ฐ˜์˜ํ•˜์ž ๋งž์•˜์Šต๋‹ˆ๋‹ค!! ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.๐Ÿ˜€

728x90
๋ฐ˜์‘ํ˜•
๋Œ“๊ธ€
๊ธ€ ๋ณด๊ด€ํ•จ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€