๐ฉ ํ๋ก์ด๋ ์์ฌ ์๊ณ ๋ฆฌ์ฆ ํ์ด์ฌ ๊ตฌํ
ํ๋ก์ด๋ ์์ฌ์ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๊ฐ์ด ์ต๋จ๊ฑฐ๋ฆฌ ํน์ ์ต์๋น์ฉ์ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
ํ๋ก์ด๋ ์์ฌ์ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ๊ณผ๋ ๋ฌ๋ฆฌ ๋ชจ๋ ๋ ธ๋์์ ๋ค๋ฅธ ๋ชจ๋ ๋ ธ๋๋ค๊น์ง์ ์ต์ ๊ฑฐ๋ฆฌ(ํน์ ์ต์๋น์ฉ)์ ๊ตฌํ๊ธฐ ๋๋ฌธ์ "์ด๋๊ฐ๋ฅผ ๊ฒฝ์ ํ๋ค."๋ผ๋ ์กฐ๊ฑด์ด ์ฃผ์ด์ง ๋, ์ฌ์ฉ์ ๊ณ ๋ คํ๊ธฐ ์ข์ ์๊ณ ๋ฆฌ์ฆ ์ ๋๋ค.
๋ค๋ง, ์ถ๋ฐ์ (s), ๋์ฐฉ์ง์ (e), ๊ฒฝ์ ์ง(p)์ ๋ชจ๋ ๋ ธ๋๋ฅผ ๊ณ ๋ คํด์ผํ๋ฏ๋ก ์๊ฐ ๋ณต์ก๋๋ O(N^3)์ผ๋ก ํฐ ํธ ์ ๋๋ค.
์ฆ, ๋ฌธ์ ์์ ์ฃผ์ด์ง ๋ ธ๋(N)์ ์ต๋๊ฐ์ ๊ณ ๋ คํด ๋ฏธ๋ฆฌ ๊ณ์ฐํด ์ฌ์ฉํ ๊ฐ์น๊ฐ ์๋ ์๊ณ ๋ฆฌ์ฆ์ธ์ง ๊ณ ๋ คํด๋ด์ผํฉ๋๋ค.
โ๏ธ ํ๋ก์ด๋ ์์ฌ ์๊ณ ๋ฆฌ์ฆ
์ ๊ทธ๋ฆผ์ ๊ฒฝ์ฐ๋ ์ถ๋ฐ์ง์ ์ด 1๋ฒ ๋ ธ๋, ๋์ฐฉ์ง์ ์ด 4๋ฒ ๋ ธ๋์ธ ๊ฒฝ์ฐ ์ ๋๋ค.
1 -> 4๋ก ๊ฐ๋๊ฒ ๊ฒฝ์ ์ง ์์ด ๊ฐ๋ค๋ฉด ๋น์ฉ์ 4๊ฐ ๋ค๊ฒ๋ฉ๋๋ค.
๋ง์ฝ ๊ฒฝ์ ์ง๋ฅผ ์ ํํ๊ฒ ๋ ๋, 2๋ฒ์ ๊ฒฝ์ ์ง๋ก ์ ํํ๋ค๋ฉด ์ด ๋น์ฉ์ 3(2 + 1)์ด๊ณ 3์ ๊ฒฝ์ ์ง๋ก ์ ํํ๋ค๋ฉด ๋น์ฉ์ 2(1 + 1)์ด ๋ฉ๋๋ค.
๋ฐ๋ผ์ ์ ๊ทธ๋ฆผ์ ์ต์ ๋น์ฉ(ํน์ ์ต๋จ ๊ฑฐ๋ฆฌ)๋ 1 -> 3 -> 4๋ฅผ ์ ํํ 2๊ฐ ๋ฉ๋๋ค.
์ด์ ๋ถํฐ 1 -> 4๋ก ์ด๋ํ ๋ ๋ฐ์ํ๋ ์ต์๋น์ฉ์ 2๋ผ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
ํ๋ก์ด๋ ์์ฌ์ ์ด์ฒ๋ผ ๋ชจ๋ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํด์ ๋ค๋ฅธ ๋ ธ๋๊น์ง์ ์ต์๋น์ฉ์ ๊ณ์ ๊ฐฑ์ ํด์ฃผ๋ฉด์ ๋ชจ๋ ๋ ธ๋์์ ๋ชจ๋ ๋ ธ๋๊น์ง(๋ช ๋ฒ์ ๊ฒฝ์ฐํ๋์ง ์๊ด์์ด) ์ต์ ๋น์ฉ์ ์์๋ผ ์ ์์ต๋๋ค.
โ๏ธ ํ๋ก์ด๋ ์์ฌ ์๊ณ ๋ฆฌ์ฆ ์ฝ๋(ํ์ด์ฌ)
cost = [[INF] * n for _ in range(n)] # INF๋ก ๊ตฌ์ฑ๋ n x n ํ๋ ฌ, ๋
ธ๋๋ผ๋ฆฌ์ ์ต์ ๋น์ฉ์ ๋ด์ ๋ฐฐ์ด
for i in range(n): # ์๊ธฐ์์ -> ์๊ธฐ์์ ์ ๋น์ฉ์ 0์ด๋ฏ๋ก ์ด๊ธฐํ ํด์ค๋ค.
cost[i][i] = 0
# ํ๋ก์ด๋ ์์ฌ
for k in range(n): # ๊ฒฝ์ ์ง
for j in range(n): # ๋์ฐฉ์ง
for i in range(n): # ์ถ๋ฐ์ง
# ํ์ฌ i -> j๊น์ง๋๋ ๋น์ฉ์ด i -> k -> j์ ๋น์ฉ๋ณด๋ค ๋น์ธ๋ค๋ฉด ๋ ์ ๋ ดํ ๋น์ฉ์ผ๋ก ๊ฐฑ์
if cost[i][j] > cost[i][k] + cost[k][j]:
cost[i][j] = cost[i][k] + cost[k][j]
์ฌ๊ธฐ์ INF๋ ์ค๊ฐ ๊ฐ์ผ๋ก ์ฃผ์ด์ง ๋์ฌ ์ ์๋ ๊ฐ๋ณด๋ค ํฐ ๊ฐ์ผ๋ก ์ธํ ํฉ๋๋ค.
cost ๋ฐฐ์ด์ ์ถ๋ฐ์ง์ -> ๋์ฐฉ์ง์ ๊น์ง์ ๋น์ฉ์ ๋ด์ ๋์ 2์ฐจ์ ๋ฐฐ์ด ์ ๋๋ค.
์ถ๋ฐ์ , ๋์ฐฉ์ , ๊ฒฝ์ ์ง๋ฅผ ๋ชจ๋ ํ์ํ๋ 3์ฐจ์ for๋ฌธ์ ๋๋ฉด์ ํ์ฌ์ ๋น์ฉ(i -> j)๋ณด๋ค k๋ฅผ ๊ฒฝ์ฐํ๋ (i -> k -> j) ๋น์ฉ์ด ๋ ์ ๋ ดํ๋ค๋ฉด ๊ฐฑ์ ํด ์ฃผ๋ฉด ํ๋ก์ด๋ ์์ฌ ๊ตฌํ์ด ์๋ฃ ๋ฉ๋๋ค.
์ด๋, ๊ฒฝ์ ์ง๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ชจ๋ ๊ฒฝ์ฐ(์ถ๋ฐ, ๋์ฐฉ)์ ํ์ดํด์ผํ๋ฏ๋ก ์ต์๋จ for๋ฌธ์๋ ๊ฒฝ์ ์ง(k)๊ฐ ์์ผํฉ๋๋ค.
๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ, ๋ชจ๋ ๊ฒฝ์ฐ์์ ์ ๋๋ก ๊ฐฑ์ ๋์ง ์์ ์ ์์ต๋๋ค.
โ๏ธ ํ๋ก์ด๋ ์์ฌ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด๋ณด๊ธฐ(2021๋ ์นด์นด์ค ์ ์ ์ฑ์ฉ ์ฝ๋ฉ ํ ์คํธ)
https://programmers.co.kr/learn/courses/30/lessons/72413
ํ๋ก์ด๋ ์์ฌ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํด์ผํ๋ ๋ฌธ์ ์ธ 2021๋ ์นด์นด์ค ์ ์ ์ฑ์ฉ ์ฝ๋ฉํ ์คํธ ๋ฌธ์ ๋ฅผ ๊ฐ์ ธ์์ต๋๋ค.
๐ ์ ์ฒด ์ฝ๋
# ํฉ์น ํ์
# ํ๋ก์ด๋ ๋ง์ฌ
def solution(n, s, a, b, fares):
INF = 200 * 100000 + 1 # ์ต๋ ๋น์ฉ
cost = [[INF] * n for _ in range(n)] # INF๋ก ๊ตฌ์ฑ๋ n x n ํ๋ ฌ, ๋
ธ๋๋ผ๋ฆฌ์ ์ต์ ๋น์ฉ์ ๋ด์ ๋ฐฐ์ด
for i in range(n): # ์๊ธฐ์์ -> ์๊ธฐ์์ ์ ๋น์ฉ์ 0์ด๋ฏ๋ก ์ด๊ธฐํ ํด์ค๋ค.
cost[i][i] = 0
for f in fares:
start_node = f[0] - 1 # ๋
ธ๋์ ๋ฒํธ๊ฐ 1๋ถํฐ ์ฃผ์ด์ง๋ฏ๋ก index๋ฅผ ๋ง์ถ๊ธฐ ์ํด์ 1์ ๋นผ์ค๋ค.
end_node = f[1] - 1
price = f[2]
# ์
๋ ฅ์ผ๋ก ์ฃผ์ด์ง ์ถ๋ฐ์ <-> ๋์ฐฉ์ ์ ๋น์ฉ๋ค์ ๋์
ํด์ค๋ค.
cost[start_node][end_node] = price
cost[end_node][start_node] = price
# ํ๋ก์ด๋ ์์ฌ
for k in range(n): # ๊ฒฝ์ ์ง
for i in range(n): # ์ถ๋ฐ์
for j in range(n): # ๋์ฐฉ์
# ํ์ฌ i -> j๊น์ง๋๋ ๋น์ฉ์ด i -> k -> j์ ๋น์ฉ๋ณด๋ค ๋น์ธ๋ค๋ฉด ๋ ์ ๋ ดํ ๋น์ฉ์ผ๋ก ๊ฐฑ์
if cost[i][j] > cost[i][k] + cost[k][j]:
cost[i][j] = cost[i][k] + cost[k][j]
answer = INF
# ๋ชจ๋ ๊ฒฝ์ ์ง๋ฅผ ํ์ํ๋ฉฐ ์ต์ ์๊ธ์ ๊ฐฑ์
for k in range(n):
answer = min(answer, cost[s - 1][k] + cost[k][a - 1] + cost[k][b - 1])
return answer
'Programming > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Algorithm] Union - Find (Python ๊ตฌํ) (0) | 2022.05.10 |
---|---|
[Algorithm] ์ฌ๊ท๋ฅผ ํตํ ์์ด(permutation) ๊ตฌํ(+ python ๋ด์ฅ ํจ์ ์ด์ฉ) (0) | 2022.05.01 |
[Algoritm] ํ๋ ฌ ํ์ (Python ๊ตฌํ) (0) | 2022.04.23 |
[Algorithm] ์ต๋ ๊ณต์ฝ์, ์ต์ ๊ณต๋ฐฐ์ ๊ตฌํ๊ธฐ (0) | 2022.04.06 |
[Java] Kruskal's Algorithm ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ - ์ต์ ์ ์ฅ ํธ๋ฆฌ(MST) (0) | 2021.12.30 |