834. Sum of Distances in Tree

KJHยท2024๋…„ 4์›” 28์ผ

LeetCode

๋ชฉ๋ก ๋ณด๊ธฐ
1/5

๋ฌธ์ œ๋งํฌ

์„ค๋ช…

๐Ÿ’€ 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]]

ํ’€์ด๊ณผ์ •

1. ๋ฐฐ์—ด 2๊ฐœ answer,node_cnt ์ƒ์„ฑ

answer : ์ •๋‹ต์šฉ answer[i] = ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ๋“ค๊ณผ์˜ ๊ฑฐ๋ฆฌ ํ•ฉ
node_cnt : ํ˜„์žฌ ์ •์ ์˜ ๋ˆ„์  ๋…ธ๋“œ ๊ฐœ์ˆ˜

2. root๋ฅผ ๊ธฐ์ค€์œผ๋กœ answer,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        

3.๊ฐ ๋…ธ๋“œ์˜ answer,node_cnt ์ฑ„์šฐ๊ธฐ

ํ•œ๋ฒˆ ์ˆœํšŒํ–ˆ์œผ๋ฉด, 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 

0๊ฐœ์˜ ๋Œ“๊ธ€