
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. ์ฌ์ฉ ์ ํ ๋ผ๋ฒจ ์ค์์ ๊ฐ์ฅ ์์ ๊ฒ์? => A(0)
while pq:
cur_cost, cur_v = heapq.heappop(pq)
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๋ฅผ ํตํด ๋ค์๊ณผ ๊ฐ์ด ํด๊ฒฐํ์๋ค.
โ 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๋ฅผ ์ฌ์ฉ)
์ด ์ ์ ๊ณ ๋ คํ๋ฉด, ๊ธฐ์กด์ ๋ค์ต์คํธ๋ผ ํ ํ๋ฆฟ ์ฝ๋๋ฅผ ๋ณํํ ์ ๋ฐ์ ์๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
โ ๋ง์ง๋ง ์กฐ๊ฑด์ "๋ง์ฝ ๋ชจ๋ 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))
๐ข์ฐธ๊ณ ๋ก, ๋ณธ์ธ์ ํ์ด์ฌ์์ ์๋ฐ๋ก ์ฝํ ์ธ์ด๋ฅผ ๋ณ๊ฒฝํ ๊ฒ์ธ๋ฐ, ์๋ฐ์์๋ ์์ ๊ฐ์ ์ธํจํน ๊ธฐ๋ฅ์ด ์์ผ๋ฏ๋ก ์ค์ค๋ก ์ง ์ธ๋ฑ์ฑ ๊ธฐ๋ฒ์ ํ์ฉํ์.