문제
트리에서 리프 노드란, 자식의 개수가 0인 노드를 말한다.
트리가 주어졌을 때, 노드 하나를 지울 것이다. 그 때, 남은 트리에서 리프 노드의 개수를 구하는 프로그램을 작성하시오. 노드를 지우면 그 노드와 노드의 모든 자손이 트리에서 제거된다.
예를 들어, 다음과 같은 트리가 있다고 하자.
![](https://blog.kakaocdn.net/dn/cY1Q72/btrJWVfQyxe/I4cRpN5z8iS8cgDMRbFbVK/img.png)
현재 리프 노드의 개수는 3개이다. (초록색 색칠된 노드) 이때, 1번을 지우면, 다음과 같이 변한다. 검정색으로 색칠된 노드가 트리에서 제거된 노드이다.
![](https://blog.kakaocdn.net/dn/DpsoN/btrJYesr4tb/SRfVumV5KCtbdGlvZ7kOTK/img.png)
이제 리프 노드의 개수는 1개이다.
입력
첫째 줄에 트리의 노드의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 0번 노드부터 N-1번 노드까지, 각 노드의 부모가 주어진다. 만약 부모가 없다면 (루트) -1이 주어진다. 셋째 줄에는 지울 노드의 번호가 주어진다.
출력
첫째 줄에 입력으로 주어진 트리에서 입력으로 주어진 노드를 지웠을 때, 리프 노드의 개수를 출력한다.
예제 입력 1 복사
5
-1 0 0 1 1
2
예제 출력 1 복사
2
예제 입력 2 복사
5
-1 0 0 1 1
1
예제 출력 2 복사
1
예제 입력 3 복사
5
-1 0 0 1 1
0
예제 출력 3 복사
0
예제 입력 4 복사
9
-1 0 0 2 2 4 4 6 6
4
예제 출력 4 복사
2
참고
https://jie0025.tistory.com/150
[BOJ - DFS] 1068번 : 트리 ( python )
https://www.acmicpc.net/problem/1068 1068번: 트리 첫째 줄에 트리의 노드의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 0번 노드부터 N-1번 노드까지, 각 노드의 부모가 주어진다.
jie0025.tistory.com
import sys
sys.stdin = open("2_4_20220817_백준_1068_트리.txt", "r")
n = int(input())
parentNode = list(map(int, input().split()))
delNode = int(input())
def DFS(d) :
parentNode[d] = -2 #지울 부모노드 -2 처리
print("지우는 부모노트 인덱스", d, "지우는 부모노드 번호", parentNode[d])
print(parentNode)
# 반복문을 통해 제거할 노드의 리프노드를 확인
for i in range(n) :
if d == parentNode[i] :
# 제거할 리프 노드의 부모 노드를 재귀적으로 탐색
DFS(i)
DFS(delNode)
print(parentNode)
count = 0
for i in range(n) :
##-2는 지우는 노드들 // i노드의 자식이 트리 안에 없으면 == 리프노드임
if parentNode[i] != -2 and i not in parentNode :
count += 1
print(count)
자바스크립트
const input = require("fs").readFileSync("input.txt").toString().split("\n");
const n = +input[0];
const parentNode = input[1].split(" ").map(Number);
const delNode = +input[2];
function DFS(d) {
parentNode[d] = -2;
for (let i = 0; i < n; i++) {
if (d === parentNode[i]) {
DFS(i);
}
}
}
function solution() {
DFS(delNode);
let count = 0;
for (let i = 0; i < n; i++) {
if (parentNode[i] !== -2 && !parentNode.includes(i)) {
count += 1;
}
}
console.log(count);
}
solution();
'코테풀이 > DFS 그래프' 카테고리의 다른 글
[백준 | 실버2] 2644: 촌수계산(그래프, DFS, 시작노드-끝노드 카운트) (0) | 2022.08.28 |
---|---|
[swea | 2814] 최장경로(DFS, 그래프) (0) | 2022.07.25 |
[백준 | 골드5] 트리(DFS, 트리, 그래프)