Skip to content

Commit b9f4f35

Browse files
committed
[Gold V] Title: 트리, Time: 104 ms, Memory: 9360 KB -BaekjoonHub
1 parent bc1e3a5 commit b9f4f35

File tree

2 files changed

+87
-0
lines changed

2 files changed

+87
-0
lines changed

백준/Gold/1068. 트리/README.md

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# [Gold V] 트리 - 1068
2+
3+
[문제 링크](https://www.acmicpc.net/problem/1068)
4+
5+
### 성능 요약
6+
7+
메모리: 9360 KB, 시간: 104 ms
8+
9+
### 분류
10+
11+
깊이 우선 탐색, 그래프 이론, 그래프 탐색, 트리
12+
13+
### 제출 일자
14+
15+
2025년 2월 25일 19:15:06
16+
17+
### 문제 설명
18+
19+
<p>트리에서 리프 노드란, 자식의 개수가 0인 노드를 말한다.</p>
20+
21+
<p>트리가 주어졌을 때, 노드 하나를 지울 것이다. 그 때, 남은 트리에서 리프 노드의 개수를 구하는 프로그램을 작성하시오. 노드를 지우면 그 노드와 노드의 모든 자손이 트리에서 제거된다.</p>
22+
23+
<p>예를 들어, 다음과 같은 트리가 있다고 하자.</p>
24+
25+
<p style="text-align: center"><img alt="" src="https://upload.acmicpc.net/560de878-d961-475e-ada4-e1f0774e5a84/-/preview/" style="width: 200px; height: 185px;"></p>
26+
27+
<p>현재 리프 노드의 개수는 3개이다. (초록색 색칠된 노드) 이때, 1번을 지우면, 다음과 같이 변한다. 검정색으로 색칠된 노드가 트리에서 제거된 노드이다.</p>
28+
29+
<p style="text-align: center"><img alt="" src="https://upload.acmicpc.net/d46ddf4e-1b82-44cc-8c90-12f76e5bf88f/-/preview/" style="width: 200px; height: 185px;"></p>
30+
31+
<p>이제 리프 노드의 개수는 1개이다.</p>
32+
33+
### 입력
34+
35+
<p>첫째 줄에 트리의 노드의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 0번 노드부터 N-1번 노드까지, 각 노드의 부모가 주어진다. 만약 부모가 없다면 (루트) -1이 주어진다. 셋째 줄에는 지울 노드의 번호가 주어진다.</p>
36+
37+
### 출력
38+
39+
<p>첫째 줄에 입력으로 주어진 트리에서 입력으로 주어진 노드를 지웠을 때, 리프 노드의 개수를 출력한다.</p>
40+

백준/Gold/1068. 트리/트리.js

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
let fs = require('fs');
2+
let input = fs.readFileSync('/dev/stdin').toString().split('\n');
3+
4+
let N = Number(input[0]);
5+
let nodeArr = input[1].split(' ').map(Number);
6+
let deletedNum = Number(input[2]);
7+
let count = 0;
8+
9+
let listArr = Array.from({ length: N }, () => []);
10+
let parentArr = Array(N).fill(-1); // 부모 노드 정보를 저장할 배열
11+
12+
// 🔹 인접 리스트 및 부모 정보 저장
13+
for (let i = 0; i < N; i++) {
14+
let k = nodeArr[i];
15+
if (k !== -1) {
16+
listArr[k].push(i);
17+
parentArr[i] = k; // 부모 정보 저장
18+
}
19+
}
20+
21+
// 🔹 DFS로 노드 삭제
22+
const dfs = (index) => {
23+
if (listArr[index] === null) return;
24+
25+
for (let child of listArr[index]) {
26+
dfs(child);
27+
}
28+
29+
listArr[index] = null; // 노드 삭제를 확실히 하기 위해 null로 변경
30+
};
31+
32+
dfs(deletedNum);
33+
34+
// 🔹 부모 노드에서 삭제된 노드 제거
35+
if (parentArr[deletedNum] !== -1) {
36+
let parent = parentArr[deletedNum];
37+
listArr[parent] = listArr[parent].filter(child => child !== deletedNum);
38+
}
39+
40+
// 🔹 리프 노드 개수 카운팅 (트리가 남아있는 경우)
41+
for (let i = 0; i < N; i++) {
42+
if (listArr[i] !== null && listArr[i].length === 0) {
43+
count++;
44+
}
45+
}
46+
47+
console.log(count);

0 commit comments

Comments
 (0)