[Leetcode]Network Delay Time

Icarus<Wing>ยท2024๋…„ 9์›” 9์ผ
post-thumbnail

https://leetcode.com/problems/network-delay-time/description/

๐Ÿ“ข๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด BFS+Priority Queue์ธ ๊ฒƒ์€ ์•Œ์•˜์ง€๋งŒ, ๊ทธ๊ฒƒ๋ณด๋‹ค ๋” ์ค‘์š”ํ•œ ๊ฒƒ์„ ๊ฐ„๊ณผํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์šฐ์„  "๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ผ๋ฒจ๋งํ•œ ์ดํ›„์—์•ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ข…๋ฃŒ"๋ฅผ ์™œ ํ•ด์•ผํ•˜๋Š”์ง€ ๋‹ค์Œ ๊ทธ๋ž˜ํ”„๋ฅผ ๋ณด๋ฉด์„œ ๋ถ„์„ํ•ด๋ณด์ž.

๋‹ค์ต์ŠคํŠธ๋ผ์˜ ์›๋ฆฌ


๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทธ๋ž˜ํ”„๊ฐ€ ์ฃผ์–ด์ง€๊ณ  ์‹œ์ž‘์ ์€ A, ๋„์ฐฉ์ ์€ H๋ผ ํ•˜์ž.

์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค
1. ๊ฐ๊ฐ์˜ ์ ์— ๋ผ๋ฒจ์„ ๋งค๊ฒจ ์ค„ ๊ฒƒ์ด๋‹ค. ์‹œ์ž‘์ ์˜ ๋ผ๋ฒจ์€ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , ๋‚˜๋จธ์ง€ ์ ๋“ค์€ โˆž๋กœ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค.
2. ์‚ฌ์šฉ ์•ˆ ํ•œ ๋ผ๋ฒจ ์ค‘ ์ œ์ผ ์ž‘์€ ๋ผ๋ฒจ์„ ์ฐพ๊ณ , ํ•ด๋‹น ๋ผ๋ฒจ์„ ์‚ฌ์šฉํ–ˆ๋‹ค๊ณ  ํ‘œ์‹œํ•ด์ค€๋‹ค.
3. ํ•ด๋‹น ์ ์— ์ธ์ ‘ํ•œ ์ ๋“ค์˜ ๋ผ๋ฒจ๋“ค์„ ์—…๋ฐ์ดํŠธ ํ•ด์ค€๋‹ค. (์ด๋ฏธ ๋ผ๋ฒจ ๋˜์–ด ์žˆ๋Š” ๊ฐ’๋ณด๋‹ค ์ž‘์œผ๋ฉด ๊ทธ ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ๊ณ , ํฌ๋ฉด ์—…๋ฐ์ดํŠธ ํ•˜์ง€ ์•Š๋Š”๋‹ค.)
๊ทธ๋ฆฌ๊ณ  2~3์˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.
4. ๋ชจ๋“  ๋ผ๋ฒจ์„ ์‚ฌ์šฉํ–ˆ์œผ๋ฉด ์ข…๋ฃŒํ•œ๋‹ค.

๋‹ค์ต์ŠคํŠธ๋ผ์˜ ์ง„ํ–‰

๐Ÿ“ข์šฐ๋ฆฌ๋Š” ์œ„์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆœ์„œ๋ฅผ ํ•˜๋‚˜์”ฉ ๊ทธ๋ฆผ์œผ๋กœ ์‚ดํŽด๋ณผ๊ป€๋ฐ, ๊ทธ์™€ ๋™์‹œ์— ์œ„์˜ ์ˆœ์„œ๊ฐ€ ์ด์ „ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ๋‹ค๋ค˜๋˜ ์ฝ”๋“œ๋กœ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋ฌ๋Š”์ง€๋„ ์‚ดํŽด๋ณผ ๊ฒƒ์ด๋‹ค.

1. ์‹œ์ž‘ ์  A ๋ผ๋ฒจ์€ 0์œผ๋กœ ์ดˆ๊ธฐํ™”

  • ๐Ÿ’ป์šฐ์„ ์ˆœ์œ„ ํ์— ์‹œ์ž‘๋…ธ๋“œ ์ถ”๊ฐ€
heapq.heappush(pq, (0, start))
  1. ๋‚˜๋จธ์ง€ ๋ผ๋ฒจ์€ โˆž๋กœ ์ดˆ๊ธฐํ™”


1. ์‚ฌ์šฉ ์•ˆ ํ•œ ๋ผ๋ฒจ ์ค‘์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๊ฒƒ์€? => A(0)

  • ๐Ÿ’ป์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ๋…ธ๋“œ ์ถ”์ถœ
while pq:
	cur_cost, cur_v = heapq.heappop(pq)
  1. A(0) ์‚ฌ์šฉ ์ฒ˜๋ฆฌ, A(0) ์ธ์ ‘ ์ ์˜ ๋ผ๋ฒจ ์—…๋ฐ์ดํŠธ: B(โˆž) -> B(2), D(โˆž) -> D(1)
  • ๐Ÿ’ป๋ฐฉ๋ฌธ ์—ฌ๋ถ€ ํ™•์ธ & ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์šฐ์„ ์ˆœ์œ„ ํ์— ์ถ”๊ฐ€
if cur_v not in costs:
	costs[cur_v] = cur_cost
    for next_v, cost in graph[cur_v]:
    	next_cost = cur_cost + cost
        heapq.heappush(pq, (next_cost, next_v))

๋ชจ๋“  ๋ผ๋ฒจ๋“ค์ด ์—…๋ฐ์ดํŠธ ๋˜์—ˆ์œผ๋ฏ€๋กœ, ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ข…๋ฃŒ๋˜๊ณ , costs์— ์ถ”๊ฐ€ํ•œ ๊ฒƒ๋“ค ์ค‘ ๋„์ฐฉ์ ์˜ ์ตœ์†Œ ๋น„์šฉ์„ ๋ฆฌํ„ดํ•˜๋ฉด ๋œ๋‹ค.


๋‹ค์‹œ ๋ฌธ์ œ๋กœ ๋Œ์•„์™€์„œ, ์ด์ „์— ํ–ˆ๋˜ 3๋‹จ๊ณ„ ์ ˆ์ฐจ๋ฅผ ์ ์šฉํ•ด์„œ ๋จผ์ € ๋ฌธ์ œ ํ•ด์„ ๋‹จ๊ณ„๋ถ€ํ„ฐ ํ•ด๋ณด์ž.

๐Ÿ“œ๋ฌธ์ œ ํ•ด์„

1~N๊นŒ์ง€ ๋ผ๋ฒจ๋ง๋œ N๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ์ฃผ์–ด์กŒ๋‹ค.
times[i]={u, v, w}: u๋Š” source node, v๋Š” target node, ๊ทธ๋ฆฌ๊ณ  w๋Š” ์‹ ํ˜ธ๊ฐ€ source๋กœ๋ถ€ํ„ฐ target๊นŒ์ง€ ์ด๋™ํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„
-> V=(u,v), E=w

์šฐ๋ฆฌ๋Š” k๋ฒˆ ๋…ธ๋“œ๋กœ๋ถ€ํ„ฐ ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ผ ๊ฒƒ์ด๋‹ค. N๊ฐœ์˜ ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ์‹ ํ˜ธ๋ฅผ ๋ฐ›๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์ตœ์†Œ ์‹œ๊ฐ„์„ ๋ฆฌํ„ดํ•˜๋ผ. ๋งŒ์•ฝ ๋ชจ๋“  N๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ์‹ ํ˜ธ๋ฅผ ๋ฐ›๋Š”๊ฒŒ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด, -1์„ ๋ฆฌํ„ดํ•˜๋ผ.
-> n: ์ด ๋…ธ๋“œ ๊ฐœ์ˆ˜, k: ์‹ ํ˜ธ๊ฐ€ ์ถœ๋ฐœํ•˜๋Š” ๋…ธ๋“œ ๋ฒˆํ˜ธ

๋‚˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด์„ํ•˜๋Š” ๊ณผ์ • ์ค‘์—์„œ ์˜๋ฌธ์ด ๋“  ์ ์„ chatgpt๋ฅผ ํ†ตํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•ด๊ฒฐํ•˜์˜€๋‹ค.

Q&A

โ“ N๊ฐœ์˜ ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ์‹ ํ˜ธ๋ฅผ ๋ฐ›๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์ตœ์†Œ ์‹œ๊ฐ„์„ ๋ฆฌํ„ดํ•˜๋ผ?
โ— ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ•ต์‹ฌ์€ ์šฐ์„ ์ˆœ์œ„ ํ(min heap)๋ฅผ ํ†ตํ•ด ํ•ญ์ƒ ํ˜„์žฌ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ง„ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜๊ณ , ๊ทธ ๋…ธ๋“œ๋กœ๋ถ€ํ„ฐ ์ธ์ ‘ ๋…ธ๋“œ๋“ค์„ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ๊ฒฝ๋กœ๋ฅผ ์—…๋ฐ์ดํŠธํ•ด ๋‚˜๊ฐ€๋‹ˆ๊นŒ, ๊ฒฐ๊ตญ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ผ๋ฒจ๋งํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ๊ทธ ์ค‘ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๋ฆฌํ„ดํ•˜๋ผ๋Š” ๋œป

๐Ÿ’กํŒŒ๋ผ๋ฏธํ„ฐ๋กœ n๊ฐœ์˜ ๋…ธ๋“œ๋ฅผ ์ฃผ์—ˆ๋Š”๋ฐ, Example 3์—์„œ times = [[1,2,1]], n = 2, k = 2 ์ผ€์ด์Šค๊ฐ€ ์ฃผ์–ด์ง€๊ณ , ๊ทธ์— ๋Œ€ํ•œ Output์€ -1์ด๋‹ค.
์ด๊ฒŒ ๋ฌด์Šจ ์˜๋ฏธ๋ƒ๋ฉด G=(V=(1,2), E=1)๋กœ ๊ทธ๋ž˜ํ”„๊ฐ€ ์ฃผ์–ด์กŒ๋Š”๋ฐ, ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด๋Š” ๋…ธ๋“œ๋Š” 2๋ฒˆ ๋…ธ๋“œ๋ผ์„œ ๋ชจ๋“  2๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ์‹ ํ˜ธ๋ฅผ ๋ฐ›๋Š”๊ฒŒ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— -1์„ ๋ฆฌํ„ดํ–ˆ๋‹ค๋Š” ๋œป์ด๋‹ค.
(โˆต๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ Directed graph๋ฅผ ์‚ฌ์šฉ)

์ด ์ ์„ ๊ณ ๋ คํ•˜๋ฉด, ๊ธฐ์กด์˜ ๋‹ค์ต์ŠคํŠธ๋ผ ํ…œํ”Œ๋ฆฟ ์ฝ”๋“œ๋ฅผ ๋ณ€ํ˜•ํ•  ์ˆ˜ ๋ฐ–์— ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

โš™์ฝ”๋“œ ์„ค๊ณ„

  1. k๋ฒˆ ๋…ธ๋“œ๋กœ ๋ถ€ํ„ฐ ์‹ ํ˜ธ๋ฅผ ์œ๋‹ค -> ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ heapq.heappush(pq, (0, k))
  2. times๋Š” 2์ฐจ์› ๋ฐฐ์—ด

Q&A

โ“ ๋งˆ์ง€๋ง‰ ์กฐ๊ฑด์˜ "๋งŒ์•ฝ ๋ชจ๋“  N๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ์‹ ํ˜ธ๋ฅผ ๋ฐ›๋Š”๊ฒŒ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด, -1์„ ๋ฆฌํ„ดํ•˜๋ผ."์„ ์–ด๋–ป๊ฒŒ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•˜์ง€? & ๋ฐฉํ–ฅ์ด ๋‹ค๋ฅธ edge๋Š” ์‹ ํ˜ธ๊ฐ€ ๋„๋‹ฌํ•˜์ง€ ๋ชปํ•˜๋‹ˆ๊นŒ ์ด๊ฒƒ์„ ์–ด๋–ป๊ฒŒ -1๋กœ ๋ฆฌํ„ดํ•˜๊ฒŒ ๋งŒ๋“ค์ง€?
โ— ๋‘˜๋‹ค ์šฐ์„ ์ˆœ์œ„ ํ๊ฐ€ ๋น„์–ด์žˆ์œผ๋ฉด ๊ทธ๋ƒฅ -1์„ ๋ฆฌํ„ดํ•˜๋ฉด ๋จ. (โˆต๋ฐฉํ–ฅ์ด ๋‹ค๋ฅธ edge๋Š” ์‹ ํ˜ธ๊ฐ€ ๋„๋‹ฌํ•˜์ง€ ๋ชปํ–ˆ๋‹ค๋Š” ๊ฒƒ์€ ๊ฒฐ๊ตญ ๋ชจ๋“  N๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ์‹ ํ˜ธ๋ฅผ ๋ฐ›๋Š”๊ฒŒ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ง)

๐Ÿ’ป์ฝ”๋“œ ๊ตฌํ˜„

class Solution(object):
    def networkDelayTime(self, times, n, k):
        costs = {}
        pq = []
        heapq.heappush(pq, (0, k))  # ์‹œ์ž‘ ๋…ธ๋“œ ์ถ”๊ฐ€

        while pq:
            cur_cost, cur_v = heapq.heappop(pq)
            if cur_v not in costs:
                costs[cur_v] = cur_cost
                if len(costs) == n: # ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ–ˆ์œผ๋ฉด ์ตœ์†Œ ๋น„์šฉ์„ ๋ฆฌํ„ด
                    return cur_cost
                # ์ธ์ ‘ ๋…ธ๋“œ ํƒ์ƒ‰(๋จผ์ € ๋ฐฉ๋ฌธ์„ ํ•ด์•ผ ํƒ์ƒ‰ ์‹œ์ž‘)
                for path in times:  # path is row
                    if cur_v == path[0]:  # ์‹œ์ž‘ ๋…ธ๋“œ์ธ์ง€ ํ™•์ธ
                        cost = path[2]
                        next_v = path[1]
                        next_cost = cur_cost + cost
                        heapq.heappush(pq, (next_cost, next_v))
        return -1 # ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด -1์„ ๋ฆฌํ„ด

        # for next_v, cost in graph[cur_v]:
        # next_cost = cur_cost + cost
        # heapq.heappush(pq, (next_cost, next_v))

์œ„์˜ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ณผ์ • ์ค‘์—์„œ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์•„๋‹Œ, 2์ฐจ์› ๋ฐฐ์—ด์˜ times๊ฐ€ ์ฃผ์–ด์กŒ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ์ฝ”๋“œ ํ…œํ”Œ๋ฆฟ์— ๋…น์ผ์ง€์— ๋Œ€ํ•ด ๋ฌด์ฒ™ ๊ณ ๋ฏผ์„ ๋งŽ์ด ํ–ˆ์—ˆ๋Š”๋ฐ ๊ทธ๋ƒฅ ์ธ๋ฑ์‹ฑํ•ด์„œ ๊ฐ๊ฐ์˜ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•ด์ฃผ์—ˆ๋‹ค.

๐Ÿง์ฐธ๊ณ ๋กœ, ํŒŒ์ด์ฌ์€ iterableํ•œ ๊ฐ์ฒด(ํŠœํ”Œ, ๋ฆฌ์ŠคํŠธ)์˜ ์›์†Œ๋“ค์„ ์ง์ ‘ ๋ณ€์ˆ˜์— ํ• ๋‹น์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

for v, next_v, cost in times:
    if v == cur_v:
        next_cost = cur_cost + cost
        heapq.heappush(pq, (next_cost, next_v))

๐Ÿ“ข์ฐธ๊ณ ๋กœ, ๋ณธ์ธ์€ ํŒŒ์ด์ฌ์—์„œ ์ž๋ฐ”๋กœ ์ฝ”ํ…Œ ์–ธ์–ด๋ฅผ ๋ณ€๊ฒฝํ•  ๊ฒƒ์ธ๋ฐ, ์ž๋ฐ”์—์„œ๋Š” ์œ„์™€ ๊ฐ™์€ ์–ธํŒจํ‚น ๊ธฐ๋Šฅ์ด ์—†์œผ๋ฏ€๋กœ ์Šค์Šค๋กœ ์ง  ์ธ๋ฑ์‹ฑ ๊ธฐ๋ฒ•์„ ํ™œ์šฉํ•˜์ž.

profile
๋ชจ๋“  ์ฝ”๋“œ์—๋Š” ์ด์œ ๊ฐ€ ์žˆ๊ธฐ์— ์›์ธ์„ ํŒŒ์•…ํ•  ๋•Œ๊นŒ์ง€ ์ง‘์š”ํ•˜๊ฒŒ ํƒ๊ตฌํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

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