문제
트리의 일부를 서브 트리라고 한다. 주어진 이진 트리에서 노드 N을 루트로 하는 서브 트리에 속한 노드의 개수를 알아내는 프로그램을 만드시오.

주어지는 트리는 부모와 자식 노드 번호 사이에 특별한 규칙이 없고, 부모가 없는 노드가 전체의 루트 노드가 된다.
이런 경우의 트리는 부모 노드를 인덱스로 다음과 같은 방법으로 나타낼 수 있다. 자식 노드가 0인 경우는 노드가 자식이 없는 경우이다.
| 부모 | 1 | 2 | 3 | 4 | 5 | 6 |
| 자식1 | 6 | 1 | 0 | 0 | 3 | 4 |
| 자식2 | 0 | 5 | 0 | 0 | 0 | 0 |
입력
첫 줄에 테스트케이스의 수 T가 주어진다. 1<=T<=50
다음 줄부터 테스트 케이스의 별로 첫 줄에 간선의 개수 E와 N이 주어지고, 다음 줄에 E개의 부모 자식 노드 번호 쌍이 주어진다.
노드 번호는 1번부터 E+1번까지 존재한다. 1<=E<=1000, 1<=N<=E+1
출력
각 줄마다 "#T" (T는 테스트 케이스 번호)를 출력한 뒤, 답을 출력한다.
내가 쓴 코드
def preorder(root):
global cnt
if root:
# print(root)
preorder(left[root])
preorder(right[root])
cnt += 1
T = int(input())
for t in range(T):
# E : 간선 수, R : root
E, R = map(int, input().split())
arr = list(map(int, input().split()))
left = [0] * (E + 2)
right = [0] * (E + 2)
parent = [0] * (E + 2)
cnt = 0
for i in range(E):
p, c = arr[i*2], arr[i*2+1]
if left[p] == 0:
left[p] = c
else:
right[p] = c
parent[c] = p
preorder(R)
print(f'#{t+1} {cnt}')
분명 내가 혼자 풀어 쓴 코드인데 다 풀고나니까 갑자기 이해가 안됨. 이해하고 다시 올게..
-> 안넝..? 그냥 저기 preorder 함수 안에 있는 if문을 돌면 노드 하나가 존재하는거라 거기에 cnt+=1을 하면 cnt가 노드 수가 되는 거 같아. 하핫. 그럼 이만!
출력 결과
#1 3
#2 1
#3 3
728x90
반응형
'Algorithm > Python' 카테고리의 다른 글
| [BOJ #11721] 열 개씩 끊어 출력하기 (0) | 2024.02.20 |
|---|---|
| [SWEA #1231] 중위순회 (1) | 2024.02.20 |
| [BOJ #18258] 큐2 (0) | 2024.02.19 |
| [SWEA #11651] 큐 - 노드의 거리 (1) | 2024.02.16 |
| [SWEA #11650] 큐 - 피자굽기 (3) | 2024.02.16 |