1068번: 트리
문제 )
트리에서 리프 노드란, 자식의 개수가 0인 노드를 말한다.
트리가 주어졌을 때, 노드 하나를 지울 것이다. 그 때, 남은 트리에서 리프 노드의 개수를 구하는 프로그램을 작성하시오. 노드를 지우면 그 노드와 노드의 모든 자손이 트리에서 제거된다.
예를 들어, 다음과 같은 트리가 있다고 하자.
![](https://blog.kakaocdn.net/dn/uENxe/btrwzcOMjL4/76NfURQyllJFBCiIjT75Fk/img.png)
현재 리프 노드의 개수는 3개이다. (초록색 색칠된 노드) 이때, 1번을 지우면, 다음과 같이 변한다. 검정색으로 색칠된 노드가 트리에서 제거된 노드이다.
![](https://blog.kakaocdn.net/dn/lC7gH/btrwwrenNQx/44Ezb4YZUoQKf7MP3ws2P1/img.png)
이제 리프 노드의 개수는 1개이다.
입력 :
첫째 줄에 트리의 노드의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 0번 노드부터 N-1번 노드까지, 각 노드의 부모가 주어진다. 만약 부모가 없다면 (루트) -1이 주어진다. 셋째 줄에는 지울 노드의 번호가 주어진다.
출력 :
첫째 줄에 입력으로 주어진 트리에서 입력으로 주어진 노드를 지웠을 때, 리프 노드의 개수를 출력한다.
풀이)
문제를 풀며 생각보다 많이 헤맸는데 이유는 다음과 같다.
1. 트리를 이진 트리로만 생각했다.
2. 트리가 1개라고만 생각했다.
이 두가지 때문에 괜히 시간을 많이 잡아 먹은 것 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
def order(v):
global cnt
# 노드를 타고 밑으로 내려감
if tree[v]:
for i in tree[v]:
order(i)
# 더이상 연결된 노드가 없다면 cnt +1
else:
cnt += 1
n = int(input())
li = list(map(int, input().split()))
tree = [[] for i in range(n)]
# 제거할 노드
d = int(input())
a = [] # 루트 노드를 넣을 리스트
for i in range(n):
# 루트 노드 넣기
if li[i] == -1:
a.append(i)
# 트리 만들기 + 제거할 노드라면 넣지 않는다.
# 부모 노드와 자식노드의 연결을 끊음.
if li[i] != -1 and i != d:
tree[li[i]].append(i)
cnt = 0
# 각 루트 노드를 기준으로 order를 실행
for i in a:
if i != d:
order(i)
print(cnt)
|
cs |
출처 : https://www.acmicpc.net/problem/1068
1068번: 트리
첫째 줄에 트리의 노드의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 0번 노드부터 N-1번 노드까지, 각 노드의 부모가 주어진다. 만약 부모가 없다면 (루트) -1이 주어진다
www.acmicpc.net
'Develop > 백준 (python)' 카테고리의 다른 글
[백준] 14620번: 꽃길 (python) (0) | 2022.03.21 |
---|---|
[백준] 1969번: DNA (python) (0) | 2022.03.21 |
[백준] 2573번: 빙산 (python) (0) | 2022.03.19 |
[백준] 5014번: 스타트링크 (python) (0) | 2022.03.19 |
[백준] 9205번: 맥주 마시면서 걸어가기 (python) (0) | 2022.03.19 |