diff --git "a/leetcode3/\354\240\225\354\247\204\354\230\201/834. Sum of Distances in Tree" "b/leetcode3/\354\240\225\354\247\204\354\230\201/834. Sum of Distances in Tree" new file mode 100644 index 00000000..14575187 --- /dev/null +++ "b/leetcode3/\354\240\225\354\247\204\354\230\201/834. Sum of Distances in Tree" @@ -0,0 +1,75 @@ +/** + * @param {number} n + * @param {number[][]} edges + * @return {number[]} + */ +var sumOfDistancesInTree = function(n, edges) { + /** + dfs n 번 실행하면 O(n^2)이라서 시간초과.. + => dp 결합해서 사용해야함... + 1. 아이디어: 트리에서 0번 노드를 루트, DFS 2번 실행 + 첫번째 dfs: 각 노드의 서브트리 크기 count, 0번의 전체 거리 합 answer[0] + 두번째 dfs: 부모 노드의 거리 합 사용하여 자식 노드 거리합 구하기 + + answer[child] = answer[parent] - count[child] + (n-count[child]) + + 부모에서 자식으로 기준을 옮기면, 자식의 서브트리 노드들은 1씩 가까워지고 + 나머지 노드들은 1씩 멀어짐 + + 2. 시간복잡도: O(V+E) 트리의 간선 수는 E = V - 1 이므로 O(n) + 3. 자료구조: 인접리스트, dfs, 트리 DP + **/ + + const graph = Array.from({ length: n }, () => []); + const count = new Array(n).fill(1); // 자기 자신도 포함하므로 1로 시작 + + const answer = new Array(n).fill(0); // i번 노드에서 다른 노드까지의 거리합 + + for (let i =0; i