문제
트리에서 리프 노드란, 자식의 개수가 0인 노드를 말한다.
트리가 주어졌을 때, 노드 하나를 지울 것이다. 그 때, 남은 트리에서 리프 노드의 개수를 구하는 프로그램을 작성하시오. 노드를 지우면 그 노드와 노드의 모든 자손이 트리에서 제거된다.
예를 들어, 다음과 같은 트리가 있다고 하자.
입력
첫째 줄에 트리의 노드의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 0번 노드부터 N-1번 노드까지, 각 노드의 부모가 주어진다. 만약 부모가 없다면 (루트) -1이 주어진다. 셋째 줄에는 지울 노드의 번호가 주어진다.
출력
첫째 줄에 입력으로 주어진 트리에서 입력으로 주어진 노드를 지웠을 때, 리프 노드의 개수를 출력한다.
풀이
재귀함수를 통해 트리를 탐색한다.
dfs(num, arr)
- 요소의 값을 -2로 바꾼다.
arr
를 탐색하여 부모노드가num
인 요소를 찾아 다시 과정을 반복한다.- 과정이 끝나면 삭제된 노드
k
의 하위노드들은 모두 -2로 갱신되었으므로,arr
에서 값이 -2가 아니면서 부모가 없는 노드들의 개수를 센다.
import sys
def dfs(num, arr):
arr[num] = -2
for i in range(len(arr)):
if num == arr[i]:
dfs(i, arr)
n = int(sys.stdin.readline())
arr = list(map(int, sys.stdin.readline().split()))
k = int(sys.stdin.readline())
count = 0
dfs(k, arr)
count = 0
for i in range(len(arr)):
if arr[i] != -2 and i not in arr:
count += 1
print(count)