โ 1068 ํธ๋ฆฌ โ
import sys
input=sys.stdin.readline
N=int(input())
l=list(map(int,input().split()))
tree=[[] for _ in range(N)]
visited=[[] for _ in range(N)]
start_node = 51
ans = 0
def dfs(tree, visited, delete_node, start_node):
global ans
visited[start_node] = True
if len(tree[start_node]) == 0: #leaf-node
ans += 1
else:
len_child = len(tree[start_node])
if len_child == 1: #one child node
child = tree[start_node][0]
if child == delete_node: #one child is trimmed -> node itself will be leaf-node
ans+=1
else:
dfs(tree, visited, delete_node, child)
else: #two child nodes
for v in tree[start_node]:
if v != delete_node:
dfs(tree, visited, delete_node, v)
for child_node in range(len(l)):
parent_node = l[child_node]
if parent_node == -1:
start_node = child_node
else:
tree[parent_node].append(child_node)
delete_node=int(input())
if delete_node == start_node:
print(0)
else:
dfs(tree, visited, delete_node, start_node)
print(ans)
๐ฒ tree graph ๋ง๋ค๊ธฐ → root node(-1์ผ ๋) start node๋ก ์ฐพ๊ธฐ
๐ฒ
โ ์์ ๋ ธ๋๊ฐ ๊ณง ์ญ์ ํ ๋ ธ๋๋ผ๋ฉด ๋ ธ๋ ์์ ์์ผ๋ฏ๋ก 0 ์ถ๋ ฅ
โก ์ โ ์ด ์๋๋ผ๋ฉด dfs ์์
* leaf-node ํ๋ณ๋ฒ
→ ์์ ๋ ธ๋์ ๊ฐ์๊ฐ 0์ผ ๊ฒฝ์ฐ ํด๋น ๋ ธ๋๋ leaf-node → ๋ฐ๋ผ์ ๋ฐ๋ก ์ ์ญ๋ณ์ ans+=1
→ ์์ ๋ ธ๋์ ๊ฐ์๊ฐ 1์ผ ๊ฒฝ์ฐ
(1) ์์ ๋ ธ๋๊ฐ ์ญ์ ํ ๋ ธ๋๋ผ๋ฉด ํด๋น ๋ ธ๋๋ leaf-node → ์ ์ญ๋ณ์ ans+=1
(2) ์ญ์ ํ ๋ ธ๋๊ฐ ์๋๋ผ๋ฉด dfs ์์
→ ์์ ๋ ธ๋์ ๊ฐ์๊ฐ 2์ผ ๊ฒฝ์ฐ ์ญ์ ํ ๋ ธ๋๊ฐ ์๋ ์์ ๋ ธ๋๋ผ๋ฉด dfs ์์
๐ฒ dfs๋ฅผ ๋๋, ์ญ์ ํ ๋ ธ๋๊ฐ ๋ฑ 1๊ฐ๊ฐ ์์ผ๋ฏ๋ก ์ด ๋ถ๋ถ๋ง ์ฃผ์ํด์ if๋ฌธ์ ๋ง๊ฒ dfs ๋๋ฉด์ leaf-node ๊ฐ์ ์ธ์ด์ฃผ๋ ์ ํ
'BOJ > ๐ฅ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
โ Binary Search Advanced I - 2 Solvedโ (0) | 2023.12.29 |
---|---|
โ Coordinate Compression Advanced - 2 Solvedโ (0) | 2023.12.28 |
โ BFS&DFS Advanced I - 13 Solvedโ (0) | 2023.12.15 |
โ Greedy Upper-Advanced I - 1 Solvedโ (1) | 2023.10.18 |
โ BF Advanced I - 3 Solvedโ (0) | 2023.10.06 |
๋๊ธ