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