class Solution:
def makeSize(self, currentNode, visit, graph, size):
visit[currentNode] = 1
currentNodeTreeSize, currentNodeDistanceAcc = 0, 0
for nextNode in graph[currentNode]:
if visit[nextNode] == 0:
nextNodeTreeSize, nextNodeDistanceAcc = self.makeSize(nextNode, visit, graph, size)
currentNodeTreeSize, currentNodeDistanceAcc = currentNodeTreeSize + nextNodeTreeSize, currentNodeDistanceAcc + nextNodeTreeSize + nextNodeDistanceAcc
size[currentNode] = currentNodeTreeSize + 1
return currentNodeTreeSize + 1, currentNodeDistanceAcc
def sumOfDistancesInTree(self, n: int, edges: List[List[int]]) -> List[int]:
graph = [[] for _ in range(n)]
for n1, n2 in edges:
graph[n2].append(n1)
graph[n1].append(n2)
ans = [0 for _ in range(n)]
size = [0 for _ in range(n)]
ans[0] = self.makeSize(0, [0 for _ in range(n)], graph, size)[1]
que = [0]
while que:
currentNode = que.pop(0)
for nextNode in graph[currentNode]:
if not ans[nextNode]:
ans[nextNode] = ans[currentNode] + n - 2 * size[nextNode]
que.append(nextNode)
return ans
임의의 노드를 루트로 지정한 뒤
트리를 타고 내려가면서 각 노드의 서브트리 크기를 저장합니다.
트리를 타고 내려가면서 루트노드의 DistanceAcc를 구합니다.
구하는 로직은
루트 노드의 DistanceAcc를 구하면 BFS를 이용해서 각 노드의 distanceAcc를 구합니다.
구하는 방법