Skip to content

Commit 80fa715

Browse files
Merge pull request #1981 from CodingTestStudy2/정진영
[정진영] Day06
2 parents 94f525b + 04e1427 commit 80fa715

1 file changed

Lines changed: 75 additions & 0 deletions

File tree

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
/**
2+
* @param {number} n
3+
* @param {number[][]} edges
4+
* @return {number[]}
5+
*/
6+
var sumOfDistancesInTree = function(n, edges) {
7+
/**
8+
dfs n 번 실행하면 O(n^2)이라서 시간초과..
9+
=> dp 결합해서 사용해야함...
10+
1. 아이디어: 트리에서 0번 노드를 루트, DFS 2번 실행
11+
첫번째 dfs: 각 노드의 서브트리 크기 count, 0번의 전체 거리 합 answer[0]
12+
두번째 dfs: 부모 노드의 거리 합 사용하여 자식 노드 거리합 구하기
13+
14+
answer[child] = answer[parent] - count[child] + (n-count[child])
15+
16+
부모에서 자식으로 기준을 옮기면, 자식의 서브트리 노드들은 1씩 가까워지고
17+
나머지 노드들은 1씩 멀어짐
18+
19+
2. 시간복잡도: O(V+E) 트리의 간선 수는 E = V - 1 이므로 O(n)
20+
3. 자료구조: 인접리스트, dfs, 트리 DP
21+
**/
22+
23+
const graph = Array.from({ length: n }, () => []);
24+
const count = new Array(n).fill(1); // 자기 자신도 포함하므로 1로 시작
25+
26+
const answer = new Array(n).fill(0); // i번 노드에서 다른 노드까지의 거리합
27+
28+
for (let i =0; i<edges.length; i++){
29+
const a = edges[i][0];
30+
const b = edges[i][1];
31+
32+
graph[a].push(b);
33+
graph[b].push(a);
34+
}
35+
36+
/*
37+
1. 각 노드의 서브트리 크기 count 를 구한다
38+
2. 0번 노드에서 모든 노드까지의 거리 합 answer[0]을 구한다
39+
*/
40+
function dfs1(node, parent, depth){
41+
answer[0] += depth;
42+
43+
for (let i = 0; i<graph[node].length; i++){
44+
const child = graph[node][i];
45+
46+
if (child == parent){
47+
continue;
48+
}
49+
50+
dfs1(child, node, depth + 1);
51+
52+
count[node] += count[child];
53+
}
54+
}
55+
56+
/*
57+
부모 노드 거리 합을 이용해ㅓ서 자식 노드의 거리 합을 구한다.
58+
*/
59+
function dfs2(node, parent){
60+
for (let i = 0; i<graph[node].length; i++){
61+
const child = graph[node][i];
62+
63+
if (child == parent){
64+
continue;
65+
}
66+
answer[child] = answer[node] - count[child] + (n - count[child]);
67+
68+
dfs2(child, node);
69+
}
70+
}
71+
dfs1(0, -1, 0);
72+
dfs2(0, -1);
73+
74+
return answer;
75+
};

0 commit comments

Comments
 (0)