Skip to content

Commit e9c1d6d

Browse files
committed
[Gold V] Title: 트리, Time: 8 ms, Memory: 79508 KB -BaekjoonHub
1 parent 8090ba5 commit e9c1d6d

2 files changed

Lines changed: 102 additions & 0 deletions

File tree

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+
메모리: 79508 KB, 시간: 8 ms
8+
9+
### 분류
10+
11+
그래프 이론, 그래프 탐색, 트리, 깊이 우선 탐색
12+
13+
### 제출 일자
14+
15+
2025년 5월 30일 19:57:13
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+
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import Foundation
2+
3+
class FileIO {
4+
@inline(__always) private var buffer: [UInt8] = Array(FileHandle.standardInput.readDataToEndOfFile()) + [0], byteIdx = 0
5+
6+
@inline(__always) private func readByte() -> UInt8 {
7+
defer { byteIdx += 1 }
8+
return buffer.withUnsafeBufferPointer { $0[byteIdx] }
9+
}
10+
11+
@inline(__always) func readInt() -> Int {
12+
var number = 0, byte = readByte(), isNegative = false
13+
while byte == 10 || byte == 32 { byte = readByte() }
14+
if byte == 45 { byte = readByte(); isNegative = true }
15+
while 48...57 ~= byte { number = number * 10 + Int(byte - 48); byte = readByte() }
16+
return number * (isNegative ? -1 : 1)
17+
}
18+
}
19+
20+
let io = FileIO()
21+
22+
let n = io.readInt()
23+
let parentList = (0..<n).map { _ in io.readInt() }
24+
let targetRemoveNode = io.readInt()
25+
26+
var leafNodeCount = [Int](repeating: 0, count: n)
27+
var graph = [[Int]](repeating: [Int](), count: n)
28+
29+
let parentRemovedNode = parentList[targetRemoveNode]
30+
31+
// 부모노드정보로 트리를 구성
32+
// 트리 구성 후 리프노드를 카운트
33+
// 루트노드의 리프노트카운트에서 해당 노드의 리프노드 카운트를 뺀 값이 정답
34+
var rootNode = 0
35+
36+
parentList.enumerated().forEach { node, parent in
37+
if parent == -1 {
38+
rootNode = node
39+
return
40+
}
41+
if node == targetRemoveNode {
42+
return
43+
}
44+
if parent == targetRemoveNode {
45+
return
46+
}
47+
graph[parent].append(node)
48+
}
49+
50+
func dfs(_ node: Int, _ targetRemoveNode: Int) -> Int {
51+
if graph[node].isEmpty {
52+
return 1
53+
}
54+
for childNode in graph[node] {
55+
leafNodeCount[node] += dfs(childNode, targetRemoveNode)
56+
}
57+
return leafNodeCount[node]
58+
}
59+
60+
let answer = targetRemoveNode == rootNode ? 0 : dfs(rootNode, targetRemoveNode)
61+
62+
print(answer)

0 commit comments

Comments
 (0)