[BOJ][๐ŸŸก5][๋ฐฑ์ค€#01068] ํŠธ๋ฆฌ

์ž‘์„ฑ:    

์—…๋ฐ์ดํŠธ:

์นดํ…Œ๊ณ ๋ฆฌ:

ํƒœ๊ทธ: , , ,

๋ฌธ์ œ ์ถœ์ฒ˜

BAEKJOON Online Judge #1068


๋ฌธ์ œ

ํŠธ๋ฆฌ์—์„œ ๋ฆฌํ”„ ๋…ธ๋“œ๋ž€, ์ž์‹์˜ ๊ฐœ์ˆ˜๊ฐ€ 0์ธ ๋…ธ๋“œ๋ฅผ ๋งํ•œ๋‹ค. ํŠธ๋ฆฌ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋…ธ๋“œ ํ•˜๋‚˜๋ฅผ ์ง€์šธย ๊ฒƒ์ด๋‹ค. ๊ทธ ๋•Œ, ๋‚จ์€ ํŠธ๋ฆฌ์—์„œ ๋ฆฌํ”„ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ๋…ธ๋“œ๋ฅผ ์ง€์šฐ๋ฉด ๊ทธ ๋…ธ๋“œ์™€ ๋…ธ๋“œ์˜ ๋ชจ๋“  ์ž์†์ด ํŠธ๋ฆฌ์—์„œ ์ œ๊ฑฐ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠธ๋ฆฌ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž.

ํ˜„์žฌ ๋ฆฌํ”„ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋Š” 3๊ฐœ์ด๋‹ค. (์ดˆ๋ก์ƒ‰ ์ƒ‰์น ๋œ ๋…ธ๋“œ) ์ด๋•Œ, 1๋ฒˆ์„ ์ง€์šฐ๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€ํ•œ๋‹ค. ๊ฒ€์ •์ƒ‰์œผ๋กœ ์ƒ‰์น ๋œ ๋…ธ๋“œ๊ฐ€ ํŠธ๋ฆฌ์—์„œ ์ œ๊ฑฐ๋œ ๋…ธ๋“œ์ด๋‹ค.

์ด์ œ ๋ฆฌํ”„ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋Š” 1๊ฐœ์ด๋‹ค.


์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ํŠธ๋ฆฌ์˜ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค. N์€ 50๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” 0๋ฒˆ ๋…ธ๋“œ๋ถ€ํ„ฐ N-1๋ฒˆ ๋…ธ๋“œ๊นŒ์ง€, ๊ฐ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋งŒ์•ฝ ๋ถ€๋ชจ๊ฐ€ ์—†๋‹ค๋ฉด (๋ฃจํŠธ) -1์ด ์ฃผ์–ด์ง„๋‹ค. ์…‹์งธ ์ค„์—๋Š” ์ง€์šธ ๋…ธ๋“œ์˜ ๋ฒˆํ˜ธ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.


์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ ํŠธ๋ฆฌ์—์„œ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ ๋…ธ๋“œ๋ฅผ ์ง€์› ์„ ๋•Œ, ๋ฆฌํ”„ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.


์˜ˆ์ œ

์˜ˆ์ œ 1

์ž…๋ ฅ

5
-1 0 0 1 1
2


์ถœ๋ ฅ

2


์˜ˆ์ œ 2

์ž…๋ ฅ

5
-1 0 0 1 1
1


์ถœ๋ ฅ

1


์˜ˆ์ œ 3

์ž…๋ ฅ

5
-1 0 0 1 1
0


์ถœ๋ ฅ

0


์˜ˆ์ œ 4

์ž…๋ ฅ

9
-1 0 0 2 2 4 4 6 6
4


์ถœ๋ ฅ

2


My Sol

def main():
    def find_root():
        for n in range(N):
            if arr[n]==-1: return n

    def find_children(p):
        if p == remove_node: return 0
        ssum = 0
        found_remove_node = False
        for c in children[p]:
            if c == remove_node:
                found_remove_node = True
                continue
            ssum += find_children(c) if children[c] else 1

        if found_remove_node and ssum==0: return 1
        return ssum

    N = int(input())
    arr = list(map(int, input().split()))
    remove_node = int(input())

    children = [[] for _ in range(N+1)]
    for n in range(N):
        children[arr[n]].append(n)

    root = find_root()
    return find_children(root)

print(main())

ํŠธ๋ฆฌ์˜ ๋ถ€๋ชจ์ž์‹ ๋…ธ๋“œ ๊ตฌ์กฐ๋ฅผ ๊ณ ๋ คํ•ด DFS๋กœ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์˜€๋‹ค.

  1. ์ž…๋ ฅ์„ ๋ฐ›๋Š”๋‹ค. ๋…ธ๋“œ๋“ค์˜ ์ž์‹๋“ค์„ arr๋กœ, ์ง€์šฐ๋Š” ๋…ธ๋“œ๋ฅผ remove_node๋กœ ๋ช…๋ช…ํ–ˆ๋‹ค.
  2. ์ž์‹ ๋…ธ๋“œ๋ฅผ ์˜๋ฏธํ•˜๋Š” children 2์ฐจ์› ๋ฐฐ์—ด์„ ๋‘๊ณ , arr์˜ ๊ฐ ๋…ธ๋“œ๋“ค์—์„œ ๋ถ€๋ชจ๋ฅผ ์ธ๋ฑ์Šค๋กœ ํ•˜๋Š” list์— ์ž์‹๋…ธ๋“œ์˜ ๋ฒˆํ˜ธ๋ฅผ ์ถ”๊ฐ€ํ•ด ๋„ฃ์—ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด, ๋ฆฌํ”„๋…ธ๋“œ๋Š” ๋นˆ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.
  3. find_root ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฃจํŠธ ํ•จ์ˆ˜๋ฅผ ์ฐพ๋Š”๋ฐ, ์ด๋Š” arr์—์„œ -1์ธ ๋…ธ๋“œ๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ root๋ผ๊ณ  ๋ช…๋ช…ํ–ˆ๋‹ค.
  4. find_children ํ•จ์ˆ˜์— root๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” DFS๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค. find_children ํ•จ์ˆ˜๋Š” parameter๋กœ ์ „๋‹ฌ๋ฐ›์€ ๋ฒˆํ˜ธ์˜ ๋…ธ๋“œ๋กœ๋ถ€ํ„ฐ ์ž์‹ ๋…ธ๋“œ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ์กฐํšŒํ•˜๋Š”๋ฐ, ๊ธฐ์ค€์ด ๋˜๋Š” ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜๋Š” ๋…ธ๋“œ๋ผ๋ฉด ๋ฆฌํ”„๋…ธ๋“œ๋ฅผ ๋”ฐ์งˆ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— 0์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  5. ์ž์‹ ๋…ธ๋“œ๋ฅผ ๋งค๋ฒˆ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ find_children ํ•จ์ˆ˜๋ฅผ ๋”ฐ๋ผ๊ฐ€๋ฉฐ ๋นˆ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋‚˜์˜ค๋ฉด 1์„ ์ถ”๊ฐ€ํ•ด ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  6. ๊ทธ๋Ÿฐ๋ฐ ์ด๋•Œ 1์ž ํ๋ฆ„์ด๋ผ๋ฉด remove_node๋ฅผ ๋งž์ดํ–ˆ์„ ๋•Œ ๋ฐ”๋กœ 0์ด ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ๊ทธ ์ด์ „์˜ ๋ถ€๋ชจ๋…ธ๋“œ๊ฐ€ ๋ฆฌํ”„๋…ธ๋“œ๊ฐ€ ๋˜๋ฏ€๋กœ found_remove_node ์ธ์ž๋ฅผ ํ™•์ธํ•˜์—ฌ remove_node๋งŒ์„ ์ž์‹ ๋…ธ๋“œ๋กœ ๊ฐ€์ง€๋Š” ๋ถ€๋ชจ ๋…ธ๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ 1์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•˜์˜€๋‹ค.


๊ฒฐ๊ณผ

๋งž์•˜์Šต๋‹ˆ๋‹ค!!

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ