File tree Expand file tree Collapse file tree 2 files changed +87
-0
lines changed Expand file tree Collapse file tree 2 files changed +87
-0
lines changed Original file line number Diff line number Diff line change
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
+
Original file line number Diff line number Diff line change
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 ) ;
You can’t perform that action at this time.
0 commit comments