
๐ 0~n-1๊น์ง ๋ฐฉํฅ์ด ์๋ ํธ๋ฆฌ์, ์ฐ๊ฒฐ๊ณ ๋ฆฌ
edges๊ฐ ์ฃผ์ด์ก์๋,
answer[i] = i๋ฒ์งธ ๋ ธ๋์ ๋ค๋ฅธ ๋ชจ๋ ๋ ธ๋๋ค๊ณผ ๊ฑฐ๋ฆฌ์ ํฉ๋ฅผ ๋ง์กฑํ๋ answer์ ๋ฆฌํดํ๊ธฐdef sumOfDistancesInTree(self, n: int, edges: List[List[int]]) -> List[int]: # n = 6, edges = [[0,1],[0,2],[2,3],[2,4],[2,5]]
answer,node_cnt ์์ฑanswer : ์ ๋ต์ฉ answer[i] = ๋ค๋ฅธ ๋ชจ๋ ๋
ธ๋๋ค๊ณผ์ ๊ฑฐ๋ฆฌ ํฉ
node_cnt : ํ์ฌ ์ ์ ์ ๋์ ๋
ธ๋ ๊ฐ์
๋ฃจํธ๋ฅผ ๊ธฐ์ค์ผ๋ก, ๋ฐ์์ ์๋ก์ฌ๋ผ์ค๋ฉด์ ๋ฐฐ์ด ์ฑ์ฐ๊ธฐ
answer[i]= answer[i์ ์์]+node_cnt[i์ ์์] ์ ํฉ
node_cnt[i]= i์ ์์๋ ธ๋๋ค ์ ์ ์ ์ +1 (์๊ธฐ์์ )
## dfs1()
//node_cnt
[6]#0 #root = 1+4+1=6
/ \
[1]#1 [4]#2 #1=1 #2=1+3 = 4
/ | \
[1][1][1]
//answer
[8]#0 #root = (0+1)+(3+4) =8
/ \
[0]#1 [3]#2 #1=> 0+(0*0) =0 #2=0+(3*1) = 3
/ | \
[0][0][0] #3,4,5=> 0+0 = 0
ํ๋ฒ ์ํํ์ผ๋ฉด,
node_cnt๋ ์์ฑ๋ ์ํ๊ณanswer[0]์ ๊ฐ (๋ฃจํธ) ๋ ๊ฑด๋ค์ง ์์๋ ๋จ๐
ํ์ง๋งanswer์๋ค๋ฅธ ๋ ธ๋๋ค์ ๋ฐ์์ ์ฌ๋ผ์จ ๊ฐ๋ง ๊ณ์ฐํ ์ํ์
๋ฐ๋ผ์, ์ด๋ฒ์๋ ์์์ ๋ด๋ ค๊ฐ๋ฉด์ ๋ฐฐ์ด์ ๊ฐฑ์ ํด์ค
answer[i]=(answer[i์๋ถ๋ชจ] - node_cnt[i]) + (n-node_cnt[i])
์๊ฐ์ ํด๋ณด์
๋ง์ผ 2๋ฒ ๋ ธ๋์ ๋ํ ์ ๋ต์ ๊ตฌํ๋ ค๋ฉด, ๋ฃจํธ๋ ธ๋์ 2๋ฒ์ ํ์ ๋ ธ๋๋ค์ ํ ๋๋ก ๊ตฌํด์ผ ํ๋ค
answer[0](๋ฃจํธ)๋ ์ด๋ฏธ 2๋ฒ์์ ์ฌ๋ผ์จ ๊ฐ์ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก, ์ด ๊ฐ๋ค์ ์ค๋ณต๋จ. ๋ฐ๋ผ์ node_cnt[i]๋งํผ์ ๋นผ์ค์ผ ํจ- ๋ฐ๋๋ก, 2๋ฒ์ ํ์ ๋ ธ๋๊ฐ ์๋ ์๋ค์, ๊ธธ์ด๊ฐ ํ๋์ฉ ๋์ด๋ ๊ฑฐ์ => (์ ์ฒด ๊ฐ์-node_cnt[2])๋ฅผ ํ๋ฉด 2๋ฒ์ ์ํ์ง ์์ ์ ๋ค ๊ฐ์๊ฐ ๋์ค๋, ์ด๋ฅผ ๋ํด์ค
## dfs2()
//node_cnt
[6]#0
/ \
[1]#1 [4]#2
/ | \
[1][1][1]
//answer (์์์๋ถํฐ ๊ณ์ฐ๋จ)
[8]#0 #root๋ ๊ทธ๋๋ก
/ \
[12]#1 [6]#2 #1=> (8-1)+(6-1)= 12 #2=>(8-4)+(6-4)=6
/ | \
[5][5][5] #3,4,5=> (6-1)+(6-1) = 5
์ด๋ฌ๋ฉด answer์ด ์์ฑ๋จ
class Solution:
def sumOfDistancesInTree(self, n: int, edges: List[List[int]]) -> List[int]:
tree = [[] for _ in range(n)]
answer = [0 for _ in range(n)]
node_cnt = [1 for _ in range(n)]
for a,b in edges:
tree[a].append(b)
tree[b].append(a)
def dfs(now, parent):
for child_node in tree[now]:
if child_node == parent:
continue;
dfs(child_node,now)
node_cnt[now] += node_cnt[child_node]
answer[now] += answer[child_node] + node_cnt[child_node]
dfs(0,-1)
def dfs2(now,parent):
for child_node in tree[now]:
if child_node == parent:
continue
answer[child_node] = (answer[now]-node_cnt[child_node]) + (n-node_cnt[child_node])
dfs2(child_node, now)
dfs2(0,-1)
return answer