File tree Expand file tree Collapse file tree 2 files changed +19
-1
lines changed
Expand file tree Collapse file tree 2 files changed +19
-1
lines changed Original file line number Diff line number Diff line change @@ -18,11 +18,14 @@ const inputs = input
1818 . slice ( 1 )
1919 . map ( ( v ) => v . split ( " " ) . map ( ( v2 ) => Number ( v2 ) ) ) ;
2020
21+ // n: 노드의 개수
2122const n = Number ( input . trim ( ) . split ( "\n" ) [ 0 ] ) ;
23+ // dp: dp[i][0] = i번 노드가 얼리어답터가 아닐 때, dp[i][1] = i번 노드가 얼리어답터일 때
2224const dp = Array . from ( { length : n + 1 } , ( ) =>
2325 Array . from ( { length : 2 } , ( ) => 0 )
2426) ;
2527
28+ // 양방향 그래프
2629const map = { } ;
2730const visited = Array . from ( { length : n + 1 } , ( ) => false ) ;
2831inputs . forEach ( ( v ) => {
@@ -37,13 +40,18 @@ const dfs = (cur) => {
3740 dp [ cur ] [ 0 ] = 0 ;
3841 dp [ cur ] [ 1 ] = 1 ;
3942
43+ // 현재 노드의 자식 노드들을 탐색
4044 for ( const node of map [ cur ] ) {
4145 if ( visited [ node ] ) continue ;
4246 dfs ( node ) ;
47+ // 현재 노드가 얼리어답터가 아닐 때, 자식 노드는 얼리어답터여야 한다.
4348 dp [ cur ] [ 0 ] += dp [ node ] [ 1 ] ;
49+ // 현재 노드가 얼리어답터일 때, 자식 노드는 얼리어답터일 수도 있고 아닐 수도 있다.
50+ // 따라서 최소를 구하므로 자식 노드가 얼리어답터일 때와 아닐 때 중 작은 값을 더해준다.
4451 dp [ cur ] [ 1 ] += Math . min ( dp [ node ] [ 0 ] , dp [ node ] [ 1 ] ) ;
4552 }
4653} ;
4754
4855dfs ( 1 ) ;
56+ // 최상위 노드인 1번 노드가 얼리어답터일 때와 아닐 때 중 작은 값을 출력
4957console . log ( Math . min ( dp [ 1 ] [ 0 ] , dp [ 1 ] [ 1 ] ) ) ;
Original file line number Diff line number Diff line change @@ -14,29 +14,39 @@ const input = process.execArgv.includes("--stack-size=65536")
1414
1515const inputs = input . trim ( ) . split ( "\n" ) ;
1616let cnt = 0 ;
17+ // n: 노드의 개수
1718const n = Number ( inputs [ 0 ] ) ;
1819const arr = inputs . slice ( 1 ) . map ( ( v ) => v . split ( " " ) . map ( ( v2 ) => Number ( v2 ) ) ) ;
20+ // 양방향 그래프
1921const map = { } ;
2022arr . forEach ( ( v ) => {
2123 if ( map [ v [ 0 ] ] ) map [ v [ 0 ] ] . push ( v [ 1 ] ) ;
2224 else map [ v [ 0 ] ] = [ v [ 1 ] ] ;
2325 if ( map [ v [ 1 ] ] ) map [ v [ 1 ] ] . push ( v [ 0 ] ) ;
2426 else map [ v [ 1 ] ] = [ v [ 0 ] ] ;
2527} ) ;
28+ // 부모 노드를 저장할 배열
2629const parents = Array . from ( { length : n + 1 } , ( ) => 0 ) ;
30+ // 방문 여부를 저장할 배열
2731const visited = Array . from ( { length : n + 1 } , ( ) => false ) ;
2832
33+ // 1번 노드부터 탐색 시작
2934const que = [ [ 1 , map [ 1 ] ] ] ;
3035
3136while ( que . length > 0 ) {
37+ // cur: nodeArr 의 부모노드 , nodeArr: 부모 노드와 연결된 노드들의 배열
3238 const [ cur , nodeArr ] = que . shift ( ) ;
33-
3439 visited [ cur ] = true ;
3540
3641 for ( const node of nodeArr ) {
42+ // 이미 방문한 노드라면 continue
3743 if ( visited [ node ] ) continue ;
44+ // 특정 노드번호의 부모노드를 parents 라는 부모 배열에 저장
3845 parents [ node ] = cur ;
46+ // 현재 노드가 부모노드가 되어서 다음 노드를 탐색
3947 que . push ( [ node , map [ node ] ] ) ;
4048 }
4149}
50+
51+ // 출력
4252console . log ( parents . slice ( 2 ) . reduce ( ( a , v ) => a + v + "\n" , "" ) ) ;
You can’t perform that action at this time.
0 commit comments