์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- di
- ํ๋ IT&E
- ์ด๋ ธํ ์ด์
- datepicker
- Dialog
- fontstyle
- tcp
- uri
- udp
- AndroidStudio
- 2024-08-20
- ๊ฐ์ฒด์งํฅํ๋ก๊ทธ๋๋ฐ
- ์ฑ์ฉํ์ ํ
- Android Studio
- ๊ธฐ์ด100์
- Kotlin
- reflection
- Python
- URN
- Factory Method Pattern
- url
- menutab
- http method
- FACTORY
- OpenAPI
- IOC
- swagger
- 2024-08-21
- ์ฝ๋์
- OOP
dingdong coding
[ ์ด๊ฒ์ด ์ฝ๋ฉํ ์คํธ๋ค with ํ์ด์ฌ ] ์ต๋จ ๊ฒฝ๋ก ๋ณธ๋ฌธ
[ ์ด๊ฒ์ด ์ฝ๋ฉํ ์คํธ๋ค with ํ์ด์ฌ ] ์ต๋จ ๊ฒฝ๋ก
๐ถ ๊ฐ๋ฐ๊ฐ๋ฐ ๐พ 2022. 5. 2. 16:50
• ์ต๋จ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ : ๊ฐ์ฅ ์งง์ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ
• ๋ค์ํ ๋ฌธ์ ์ํฉ
• ํ ์ง์ ์์ ๋ค๋ฅธ ํ ์ง์ ๊น์ง์ ์ต๋จ๊ฒฝ๋ก
• ํ ์ง์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ง์ ๊น์ง์ ์ต๋จ๊ฒฝ๋ก
• ๋ชจ๋ ์ง์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ง์ ๊น์ง์ ์ต๋จ๊ฒฝ๋ก
• ๊ฐ ์ง์ ์ ๊ทธ๋ํ์์ ๋ ธ๋๋ก ํํ
• ์ง์ ๊ฐ ์ฐ๊ฒฐ๋ ๋๋ก๋ ๊ทธ๋ํ์์ ๊ฐ์ ์ผ๋ก ํํ
๋ค์ต์คํธ๋ผ ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ
• ํน์ ํ ๋ ธ๋์์ ์ถ๋ฐํ์ฌ ๋ค๋ฅธ ๋ชจ๋ ๋ ธ๋๋ก ๊ฐ๋ ์ต๋จ๊ฒฝ๋ก๋ฅผ ๊ณ์ฐํฉ๋๋ค.
• ๋ค์ต์คํธ๋ผ ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ์ ์์ ๊ฐ์ ์ด ์์ ๋ ์ ์์ ์ผ๋ก ๋์ํฉ๋๋ค.
• ํ์ค ์ธ๊ณ์ ๋๋ก(๊ฐ์ )์ ์์ ๊ฐ์ ์ผ๋ก ํํ๋์ง ์์ต๋๋ค.
• ๋ค์ต์คํธ๋ผ ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ์ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ถ๋ฅ๋ฉ๋๋ค.
• ๋งค ์ํฉ์์ ๊ฐ์ฅ ๋น์ฉ์ด ์ ์ ๋ ธ๋๋ฅผ ์ ํํด ์์์ ๊ณผ์ ์ ๋ฐ๋ณตํฉ๋๋ค.
• ์๊ณ ๋ฆฌ์ฆ์ ๋์๊ณผ์ 1. ์ถ๋ฐ ๋ ธ๋๋ฅผ ์ค์ ํฉ๋๋ค. 2. ์ต๋จ๊ฑฐ๋ฆฌ ํ ์ด๋ธ์ ์ด๊ธฐํํฉ๋๋ค. 3. ๋ฐฉ๋ฌธํ์ง ์๋ ๋ ธ๋ ์ค์์ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋ ธ๋๋ฅผ ์ ํํฉ๋๋ค. 4. ํด๋น ๋ ธ๋๋ฅผ ๊ฑฐ์ณ ๋ค๋ฅธ ๋ ธ๋๋ก ๊ฐ๋ ๋น์ฉ์ ๊ณ์ฐํ์ฌ ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ์ ๊ฐฑ์ ํฉ๋๋ค. 5. ์ ๊ณผ์ ์์ 3๋ฒ๊ณผ 4๋ฒ์ ๋ฐ๋ณตํฉ๋๋ค.
• ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ ๋ ธ๋์ ๊ฐํ ํ์ฌ๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
• ์ฒ๋ฆฌ ๊ณผ์ ์์ ๋ ์งง์ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ผ๋ฉด '์ด์ ๋ถํฐ๋ ์ด ๊ฒฝ๋ก๊ฐ ์ ์ผ ์งง์ ๊ฒฝ๋ก์ผ'๋ผ๊ณ ๊ฐฑ์ ํฉ๋๋ค.
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ํน์ง
• ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ : ๋งค ์ํฉ์์ ๋ฐฉ๋ฌธํ์ง ์์ ๊ฐ์ฅ ๋น์ฉ์ด ์ ์ ๋ ธ๋๋ฅผ ์ ํํด ์์์ ๊ณผ์ ์ ๋ฐ๋ณตํฉ๋๋ค.
• ๋จ๊ณ๋ฅผ ๊ฑฐ์น๋ฉฐ ํ ๋ฒ ์ฒ๋ฆฌ๋ ๋ ธ๋์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ ๊ณ ์ ๋์ด ๋ ์ด์ ๋ฐ๋์ง ์์ต๋๋ค.
• ํ ๋จ๊ณ๋น ํ๋์ ๋ ธ๋์ ๋ํ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ํ์คํ ์ฐพ๋ ๊ฒ์ผ๋ก ์ดํดํ ์ ์์ต๋๋ค.
• ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ํํ ๋ค์ ํ ์ด๋ธ์ ๊ฐ ๋ ธ๋๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ ์ ๋ณด๊ฐ ์ ์ฅ๋ฉ๋๋ค.
• ์๋ฒฝํ ํํ์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ค๋ฉด ์์ค์ฝ๋์ ์ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ๋ ๋ฃ์ด์ผ ํฉ๋๋ค.
๊ฐ๋จํ ๊ตฌํ ๋ฐฉ๋ฒ
# ๊ฐ๋จํ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ
import sys
input = sys.stdin.readline
INF = int(1e9) # ๋ฌดํ์ ์๋ฏธํ๋ ๊ฐ์ผ๋ก 10์ต์ ์ค์
# ๋
ธ๋์ ๊ฐ์, ๊ฐ์ ์ ๊ฐ์๋ฅผ ์
๋ ฅ๋ฐ๊ธฐ
n, m = map(int, input().split())
# ์์ ๋
ธ๋ ๋ฒํธ๋ฅผ ์
๋ ฅ๋ฐ๊ธฐ
start = int(input())
# ๊ฐ ๋
ธ๋์ ์ฐ๊ฒฐ๋์ด ์๋ ๋
ธ๋์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๋ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค๊ธฐ
# ๋
ธ๋์ ๋ฒํธ๋ฅผ ์ธ๋ฑ์ค๋ก ํ์ฌ ๋ฐ๋ก ๋ฆฌ์คํธ์ ์ ๊ทผํ ์ ์๋๋ก
graph = [[] for i in range(n + 1)]
# ๋ฐฉ๋ฌธํ ์ ์ด ์๋์ง ์ฒดํฌํ๋ ๋ชฉ์ ์ ๋ฆฌ์คํธ ๋ง๋ค๊ธฐ
visited = [False] * (n + 1)
# ์ต๋จ ๊ฑฐ๋ฆฌ ํ
์ด๋ธ์ ๋ชจ๋ ๋ฌดํ์ผ๋ก ์ด๊ธฐํ
distance = [INF] * (n + 1)
# ๋ชจ๋ ๊ฐ์ ์ ๋ณด๋ฅผ ์
๋ ฅ๋ฐ๊ธฐ
for _ in range(m): # m : ๊ฐ์ ์ ๊ฐ์
a, b, c = map(int, input().split())
# a๋ฒ ๋
ธ๋์์ b๋ฒ ๋
ธ๋๋ก ๊ฐ๋ ๋น์ฉ์ด c๋ผ๋ ์๋ฏธ
# ๋ฐฉ๋ฌธํ์ง ์๋ ๋
ธ๋ ์ค์์, ๊ฐ์ฅ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ์งง์ ๋
ธ๋์ ๋ฒํธ๋ฅผ ๋ฐํ
def get_smallest_node():
min_value = INF
index = 0 # ๊ฐ์ฅ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ์งง์ ๋
ธ๋(์ธ๋ฑ์ค)
for i in range(1, n+1):
if distance[i] < min_value and not visited[i]:
min_value = distance[i]
index = i
return index
def dijkstra(start):
# ์์ ๋
ธ๋์ ๋ํด์ ์ด๊ธฐํ
distance[start] = 0
visited[start] = True
for j in graph[start]:
distance[j[0]] = j[1]
# ์์ ๋
ธ๋๋ฅผ ์ ์ธํ ์ ์ฒด n-1 ๊ฐ์ ๋
ธ๋์ ๋ํด ๋ฐ๋ณต
for i in range(n-1):
# ํ์ฌ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋
ธ๋๋ฅผ ๊บผ๋ด์, ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
now = get_smallest_node()
visited[now] = True
# ํ์ฌ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ๋
ธ๋๋ฅผ ํ์ธ
for j in graph[now]:
cost = distance[now] + j[1]
# ํ์ฌ ๋
ธ๋๋ฅผ ๊ฑฐ์ณ์ ๋ค๋ฅธ ๋
ธ๋๋ก ์ด๋ํ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ ์งง์ ๊ฒฝ์ฐ
if cost < distance[j[0]]:
distance[j[0]] = cost
# ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ ์ํ
dijkstra(start)
# ๋ชจ๋ ๋
ธ๋๋ก ๊ฐ๊ธฐ ์ํ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅ
for i in range(1, n+1):
# ๋๋ฌํ ์ ์๋ ๊ฒฝ์ฐ, ๋ฌดํ(INFINITY)์ด๋ผ๊ณ ์ถ๋ ฅ
if distance[i] == INF:
print("INFINITY")
# ๋๋ฌํ ์ ์๋ ๊ฒฝ์ฐ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅ
else:
print(distance[i])
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ : ๊ฐ๋จํ ๊ตฌํ ๋ฐฉ๋ฒ ์ฑ๋ฅ ๋ถ์
• ์ด O(V)๋ฒ์ ๊ฑธ์ณ์ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋ ธ๋๋ฅผ ๋งค๋ฒ ์ ํ ํ์ํด์ผํฉ๋๋ค.
• ๋ฐ๋ผ์ ์ ์ฒด ์๊ฐ ๋ณต์ก๋๋ O(V²)์ ๋๋ค.
• ์ผ๋ฐ์ ์ผ๋ก ์ฝ๋ฉํ ์คํธ์ ์ต๋จ ๊ฒฝ๋ก ๋ฌธ์ ์์ ์ ์ฒด ๋ ธ๋์ ๊ฐ์๊ฐ 5,000๊ฐ ์ดํ๋ผ๋ฉด ์ด ์ฝ๋๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
• ํ์ง๋ง ๋ ธ๋์ ๊ฐ์๊ฐ 10,000๊ฐ๋ฅผ ๋์ด๊ฐ๋ ๋ฌธ์ ๋ผ๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์?
๊ฐ์ ๋ ๊ตฌํ ๋ฐฉ๋ฒ
์ฐ์ ์์ ํ(Priority Queue)
• ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฅ ๋จผ์ ์ญ์ ํ๋ ์๋ฃ๊ตฌ์กฐ ์ ๋๋ค.
• ์๋ฅผ ๋ค์ด ์ฌ๋ฌ ๊ฐ์ ๋ฌผ๊ฑด ๋ฐ์ดํฐ๋ฅผ ์๋ฃ๊ตฌ์กฐ์ ๋ฃ์๋ค๊ฐ ๊ฐ์น๊ฐ ๋์ ๋ฌผ๊ฑด ๋ฐ์ดํฐ๋ถํฐ ๊บผ๋ด์ ํ์ธํด์ผํ๋ ๊ฒฝ์ฐ์ ์ฐ์ ์์ ํ๋ฅผ ์ด์ฉํ ์ ์์ต๋๋ค.
• Python, C++, Java๋ฅผ ํฌํจํ ๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํํ๋ก ์ง์ํฉ๋๋ค.
์๋ฃ๊ตฌ์กฐ | ์ถ์ถ๋๋ ๋ฐ์ดํฐ |
์คํ(Stack) | ๊ฐ์ฅ ๋์ค์ ์ฝ์ ๋ ๋ฐ์ดํฐ |
ํ(Queue) | ๊ฐ์ฅ ๋จผ์ ์ฝ์ ๋ ๋ฐ์ดํฐ |
์ฐ์ ์์ ํ(Priority Queue) | ๊ฐ์ฅ ์ฐ์ ์์๊ฐ ๋์ ๋ฐ์ดํฐ |
ํ (Heap)
• ์ฐ์ ์์ ํ(Priority Queue)๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์๋ฃ๊ตฌ์กฐ ์ค ํ๋์ ๋๋ค.
• ์ต์ ํ(Min Heap)๊ณผ ์ต๋ ํ(Max Heap)์ด ์์ต๋๋ค.
• ๋ค์ต์คํธ๋ผ ์ต๋จ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ์ ํฌํจํด ๋ค์ํ ์๊ณ ๋ฆฌ์ฆ์์ ์ฌ์ฉ๋ฉ๋๋ค.
์ฐ์ ์์ ํ ๊ตฌํ ๋ฐฉ์ | ์ฝ์ ์๊ฐ | ์ญ์ ์๊ฐ |
๋ฆฌ์คํธ | O(1) | O(N) |
ํ(Heap) | O(logN) | O(logN) |
• ๋จ๊ณ๋ง๋ค ๋ฐฉ๋ฌธํ์ง ์๋ ๋ ธ๋ ์ค์์ ์ต๋จ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋ ธ๋๋ฅผ ์ ํํ๊ธฐ ์ํด ํ(Heap) ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํฉ๋๋ค.
• ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ด ๋์ํ๋ ๊ธฐ๋ณธ์๋ฆฌ๋ ๋์ผํฉ๋๋ค.
• ํ์ฌ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ธ๋๋ฅผ ์ ์ฅํด ๋๊ธฐ ์ํด์ ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ์ด์ฉํ๋ค๋ ์ ์ด ๋ค๋ฆ ๋๋ค.
• ํ์ฌ์ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋ ธ๋๋ฅผ ์ ํํด์ผ ํ๋ฏ๋ก ์ต์ ํ์ ์ฌ์ฉํฉ๋๋ค.
import heapq
import sys
input = sys.stdin.readline
INF = int(1e9) # ๋ฌดํ์ ์๋ฏธํ๋ ๊ฐ์ผ๋ก 10์ต์ ์ค์
# ๋
ธ๋์ ๊ฐ์, ๊ฐ์ ์ ๊ฐ์๋ฅผ ์
๋ ฅ๋ฐ๊ธฐ
n, m = map(int, input().split())
# ์์ ๋
ธ๋ ๋ฒํธ๋ฅผ ์
๋ ฅ๋ฐ๊ธฐ
start = int(input())
# ๊ฐ ๋
ธ๋์ ์ฐ๊ฒฐ๋์ด ์๋ ๋
ธ๋์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๋ ๋ฆฌ์คํธ ๋ง๋ค๊ธฐ
graph = [[] for i in range(n + 1)]
# ์ต๋จ ๊ฑฐ๋ฆฌ ํ
์ด๋ธ์ ๋ชจ๋ ๋ฌดํ์ผ๋ก ์ด๊ธฐํ
distance = [INF] * (n + 1)
# ๋ชจ๋ ๊ฐ์ ์ ๋ณด๋ฅผ ์
๋ ฅ๋ฐ๊ธฐ
for _ in range(m):
a, b, c = map(int, input().split())
# a๋ฒ ๋
ธ๋์์ b๋ฒ ๋
ธ๋๋ก ๊ฐ๋ ๋น์ฉ์ด c๋ผ๋ ์๋ฏธ
graph[a].append((b, c))
def dijkstra(start):
q = []
# ์์ ๋
ธ๋๋ก ๊ฐ๊ธฐ ์ํ ์ต๋จ ๊ฒฝ๋ก๋ 0์ผ๋ก ์ค์ ํ์ฌ, ํ์ ์ฝ์
heapq.heappush(q, (0, start))
distance[start] = 0
while q: # ํ๊ฐ ๋น์ด์์ง ์๋ค๋ฉด
# ๊ฐ์ฅ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ์งง์ ๋
ธ๋์ ๋ํ ์ ๋ณด ๊บผ๋ด๊ธฐ
dist, now = heapq.heappop(q)
# ํ์ฌ ๋
ธ๋๊ฐ ์ด๋ฏธ ์ฒ๋ฆฌ๋ ์ ์ด ์๋ ๋
ธ๋๋ผ๋ฉด ๋ฌด์
if distance[now] < dist:
continue
# ํ์ฌ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ์ธ์ ํ ๋
ธ๋๋ค์ ํ์ธ
for i in graph[now]:
cost = dist + i[1]
# ํ์ฌ ๋
ธ๋๋ฅผ ๊ฑฐ์ณ์ ๋ค๋ฅธ ๋
ธ๋๋ก ์ด๋ํ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ ์งง์ ๊ฒฝ์ฐ
if cost < distance[i[0]]:
distance[i[0]] = cost
heapq.heappush(q, (cost, i[0]))
# ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ํ
dijkstra(start)
# ๋ชจ๋ ๋
ธ๋๋ก ๊ฐ๊ธฐ ์ํ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅ
for i in range(1, n+1):
# ๋๋ฌํ ์ ์๋ ๊ฒฝ์ฐ, ๋ฌดํ(INFINITY)์ด๋ผ๊ณ ์ถ๋ ฅ
if distance[i] == INF:
print("INFINITY")
# ๋๋ฌํ ์ ์๋ ๊ฒฝ์ฐ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅ
else:
print(distance[i])
๊ฐ์ ๋ ๊ตฌํ๋ฐฉ๋ฒ ์ฑ๋ฅ ๋ถ์
• ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ๋ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ ๋ณต์ก๋๋ O(ElogV)์ ๋๋ค.
• ๋ ธ๋๋ฅผ ํ๋์ฉ ๊บผ๋ด ๊ฒ์ฌํ๋ ๋ฐ๋ณต๋ฌธ(while๋ฌธ)์ ๋ ธ๋์ ๊ฐ์ V ์ด์์ ํ์๋ก๋ ์ฒ๋ฆฌ๋์ง ์์ต๋๋ค.
• ๊ฒฐ๊ณผ์ ์ผ๋ก ํ์ฌ ์ฐ์ ์์ ํ์์ ๊บผ๋ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ๋ ธ๋๋ค์ ํ์ธํ๋ ์ดํ์๋ ์ต๋ ๊ฐ์ ์ ๊ฐ์(E)๋งํผ ์ฐ์ฐ์ด ์ํ๋ ์ ์์ต๋๋ค.
• ์ง๊ด์ ์ผ๋ก ์ ์ฒด ๊ณผ์ ์ E๊ฐ์ ์์๋ฅผ ์ฐ์ ์์ ํ์ ๋ฃ์๋ค๊ฐ ๋ชจ๋ ๋นผ๋ด๋ ์ฐ์ฐ๊ณผ ๋งค์ฐ ์ ์ฌํฉ๋๋ค.
• ์๊ฐ ๋ณต์ก๋๋ฅผ O(ElogE)๋ก ํ๋จํ ์ ์์ต๋๋ค.
• ์ค๋ณต ๊ฐ์ ์ ํฌํจํ์ง ์๋ ๊ฒฝ์ฐ์ ์ด๋ฅผ O(ElogV)๋ก ์ ๋ฆฌํ ์ ์์ต๋๋ค.
• O(ElogE) → O(ElogV²) → O(2ElogV) → O(ElogV)
ํ๋ก์ด๋ ์์ ์๊ณ ๋ฆฌ์ฆ
• ๋ชจ๋ ๋ ธ๋์์ ๋ค๋ฅธ ๋ชจ๋ ๋ ธ๋๊น์ง์ ์ต๋จ๊ฒฝ๋ก๋ฅผ ๋ชจ๋ ๊ณ์ฐํฉ๋๋ค.
• ํ๋ก์ด๋ ์์ (Floyd-Warshall)์๊ณ ๋ฆฌ์ฆ์ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋จ๊ณ๋ณ๋ก ๊ฑฐ์ณ ๊ฐ๋ ๋ ธ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์๊ณ ๋ฆฌ์ฆ์ ์ํํฉ๋๋ค.
• ๋ค๋ง ๋งค ๋จ๊ณ๋ง๋ค ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋ ์ค์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ๋ ๋ ธ๋๋ฅผ ์ฐพ๋ ๊ณผ์ ์ด ํ์ํ์ง ์์ต๋๋ค.
• ํ๋ก์ด๋ ์์ ์ 2์ฐจ์ ํ ์ด๋ธ์ ์ต๋จ ๊ฑฐ๋ฆฌ ์ ๋ณด๋ฅผ ์ ์ฅํฉ๋๋ค.
• ํ๋ก์ด๋ ์์ ์๊ณ ๋ฆฌ์ฆ์ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ์ ํ์ ์ํฉ๋๋ค.
• ๊ฐ ๋จ๊ณ๋ง๋ค ํน์ ํ ๋ ธ๋ k๋ฅผ ๊ฑฐ์ณ ๊ฐ๋ ๊ฒฝ์ฐ๋ฅผ ํ์ธํฉ๋๋ค.
• a์์ b๋ก ๊ฐ๋ ์ต๋จ ๊ฑฐ๋ฆฌ๋ณด๋ค a์์ k๋ฅผ ๊ฑฐ์ณ b๋ก ๊ฐ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ ์งง์ ์ง ๊ฒ์ฌํฉ๋๋ค.
INF = int(1e9) #๋ฌดํํจ์ ์๋ฏธํ๋ ๊ฐ์ผ๋ก 10์ต์ ์ค์
# ๋
ธ๋์ ๊ฐ์ ๋ฐ ๊ฐ์ ์ ๊ฐ์๋ฅผ ์
๋ ฅ๋ฐ๊ธฐ
n = int(input())
m = int(input())
#2์ฐจ์ ๋ฆฌ์คํธ(๊ทธ๋ํ ํํ)๋ฅผ ๋ง๋ค๊ณ , ๋ชจ๋ ๊ฐ์ ๋ฌดํ์ผ๋ก ์ด๊ธฐํ
graph = [[INF]*(n+1) for _ in range(n+1)]
#์๊ธฐ ์์ ์์ ์๊ธฐ ์์ ์ผ๋ก ๊ฐ๋ ๋น์ฉ์ 0์ผ๋ก ์ด๊ธฐํ
for a in range(1, n+1):
for b in range(1, n+1):
if a==b:
graph[a][b] = 0
# ๊ฐ ๊ฐ์ ์ ๋ํ ์ ๋ณด๋ฅผ ์
๋ ฅ๋ฐ์, ๊ทธ ๊ฐ์ผ๋ก ์ด๊ธฐํ
for _ in range(m):
# A์์ B๋ก ๊ฐ๋ ๋น์ฉ์ C๋ผ๊ณ ์ค์
a, b, c = map(int, input().split())
graph[a][b] = c
# ์ ํ์์ ๋ฐ๋ผ ํ๋ก์ด๋ ์์
์๊ณ ๋ฆฌ์ฆ์ ์ํ
for k in range(1, n+1) :
for a in range(1, n+1):
for b in range(1, n+1):
graph[a][b] = min(graph[a][b], graph[a][k] + graph[k][b])
# ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅ
for a in range(1, n+1) :
for b in range(1, n+1):
# ๋๋ฌํ ์ ์๋ ๊ฒฝ์ฐ, ๋ฌดํ (INFINITY)์ด๋ผ๊ณ ์ถ๋ ฅ
if graph[a][b] == INF:
print("INFINITY", end=" ")
# ๋๋ฌํ ์ ์๋ ๊ฒฝ์ฐ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅ
else:
print(graph[a][b], end=" ")
print()
ํ๋ก์ด๋ ์์ ์๊ณ ๋ฆฌ์ฆ ์ฑ๋ฅ ๋ถ์
• ๋ ธ๋์ ๊ฐ์๊ฐ N๊ฐ์ผ ๋ ์๊ณ ๋ฆฌ์ฆ ์์ผ๋ก N๋ฒ์ ๋จ๊ณ๋ฅผ ์ํํฉ๋๋ค.
• ๊ฐ ๋จ๊ณ๋ง๋ค O(N²)์ ์ฐ์ฐ์ ํตํด ํ์ฌ ๋ ธ๋๋ฅผ ๊ฑฐ์ณ ๊ฐ๋ ๋ชจ๋ ๊ฒฝ๋ก๋ฅผ ๊ณ ๋ คํฉ๋๋ค.
• ๋ฐ๋ผ์ ํ๋ก์ด๋ ์์ ์๊ณ ๋ฆฌ์ฆ์ ์ด ์๊ฐ ๋ณต์ก๋๋ O(N³)์ ๋๋ค.
๊ฐ์ ๋ฐ ์ถ์ฒ