[BOJ][๐ก5][๋ฐฑ์ค#01068] ํธ๋ฆฌ
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold V
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
ํธ๋ฆฌ์์ ๋ฆฌํ ๋ ธ๋๋, ์์์ ๊ฐ์๊ฐ 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๋ก ํ ์ ์๋ ๋ฌธ์ ์๋ค.
- ์
๋ ฅ์ ๋ฐ๋๋ค. ๋
ธ๋๋ค์ ์์๋ค์
arr
๋ก, ์ง์ฐ๋ ๋ ธ๋๋ฅผremove_node
๋ก ๋ช ๋ช ํ๋ค. - ์์ ๋
ธ๋๋ฅผ ์๋ฏธํ๋
children
2์ฐจ์ ๋ฐฐ์ด์ ๋๊ณ ,arr
์ ๊ฐ ๋ ธ๋๋ค์์ ๋ถ๋ชจ๋ฅผ ์ธ๋ฑ์ค๋ก ํ๋ list์ ์์๋ ธ๋์ ๋ฒํธ๋ฅผ ์ถ๊ฐํด ๋ฃ์๋ค. ์ด๋ ๊ฒ ๋๋ฉด, ๋ฆฌํ๋ ธ๋๋ ๋น ๋ฆฌ์คํธ๋ฅผ ๊ฐ์ง๊ฒ ๋๋ค. find_root
ํจ์๋ฅผ ํตํด ๋ฃจํธ ํจ์๋ฅผ ์ฐพ๋๋ฐ, ์ด๋arr
์์ -1์ธ ๋ ธ๋๋ฅผ ์ฐพ๋ ๊ฒ์ด๋ค. ์ด๋ฅผroot
๋ผ๊ณ ๋ช ๋ช ํ๋ค.find_children
ํจ์์ root๋ถํฐ ์์ํ๋ DFS๋ฅผ ์์ํ๋ค.find_children
ํจ์๋ parameter๋ก ์ ๋ฌ๋ฐ์ ๋ฒํธ์ ๋ ธ๋๋ก๋ถํฐ ์์ ๋ ธ๋๋ฅผ ์ํํ๋ฉฐ ์กฐํํ๋๋ฐ, ๊ธฐ์ค์ด ๋๋ ๋ถ๋ชจ ๋ ธ๋๊ฐ ์ ๊ฑฐ๋๋ ๋ ธ๋๋ผ๋ฉด ๋ฆฌํ๋ ธ๋๋ฅผ ๋ฐ์ง ์ ์๊ธฐ ๋๋ฌธ์ 0์ ๋ฐํํ๋ค.- ์์ ๋
ธ๋๋ฅผ ๋งค๋ฒ ๋ง์ฐฌ๊ฐ์ง๋ก
find_children
ํจ์๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉฐ ๋น ๋ฆฌ์คํธ๊ฐ ๋์ค๋ฉด 1์ ์ถ๊ฐํด ๋ฐํํ๋ ๊ฒ์ด๋ค. - ๊ทธ๋ฐ๋ฐ ์ด๋ 1์ ํ๋ฆ์ด๋ผ๋ฉด
remove_node
๋ฅผ ๋ง์ดํ์ ๋ ๋ฐ๋ก 0์ด ๋๋ ๊ฒ์ด ์๋, ๊ทธ ์ด์ ์ ๋ถ๋ชจ๋ ธ๋๊ฐ ๋ฆฌํ๋ ธ๋๊ฐ ๋๋ฏ๋กfound_remove_node
์ธ์๋ฅผ ํ์ธํ์ฌremove_node
๋ง์ ์์ ๋ ธ๋๋ก ๊ฐ์ง๋ ๋ถ๋ชจ ๋ ธ๋๊ฐ ์๋ ๊ฒฝ์ฐ 1์ ๋ฐํํ๋๋ก ํ์๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋๊ธ๋จ๊ธฐ๊ธฐ