๊ณ ์ ์ด ๊ณ ์ ์ธ ์ด์ ๋, ๊ฒฐ์ฝ ์ง๋ฆฌ์ ๊ฐ๊น๋๋ก ๋ถ๋ณํจ์ด ์๋ง์ ๋ฐ๋ก์ ์ํด ๋ฌด๋์ง์ง ์์์์ด๋ค.
DP(๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ)
Floyd-Warchall(ํ๋ก์ด๋ ์์ฌ)
๊ทธ๋ฆฌ๋๋ ๋ง ๊ทธ๋๋ก ํ์๋ฒ์ด๋ค. ๊ฐ์ฅ ์ต๋์ ๊ฐ์น๋ฅผ ํ๋ํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ํํด๊ฐ๋ฉฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ. ์ด๋ ๋คํ ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๋ก ์๋ค.
๐์ฃผ์ํ ์ : ๊ฐ์ฅ ์ต๋์ ๊ฐ์น๋ฅผ ํ๋ํ๋ฉด ๋๋ค๋ ์ ์์ ์ฝ์ง๋ง, ๋ฌธ์ ์ ๋ฐ๋ผ ๋ง์ง๋ง ์ ํ์์์ ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๊ด๊ฑด์ด ๋ ์ ์๋ค.
์ด์งํ์ ๋๋ ์ด๋ถํ์์ด๋ผ๊ณ ๋ถ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฒด์ ์์๋ฅผ ์ฌ๊ท์ ์ผ๋ก ๋ฐ์ฉ ์ค์ฌ๋๊ฐ๋ฉฐ ์ํ๋ ๊ฐ์ ์ฐพ์๋๊ฐ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ํนํ ๋ฌธ์ ์์์ 100,000,000๊ฐ ์ด์์ ํ ์คํธ ์ผ์ด์ค, ์ฆ ํ์ ์ผ์ด์ค๊ฐ ์ฃผ์ด์ง ๊ฒฝ์ฐ๋ ๋์ฒด๋ก ์๊ฐ ์ด๊ณผ์ ๊ฑธ๋ฆฌ๋ฏ๋ก ๊น์ด๊ฐ 31๊น์ง ์ค์ด๋๋ ํจ๊ณผ์ ์ธ ํ์ ์๊ณ ๋ฆฌ์ฆ
def binary_search(k, start, end):
# ์ด ๋ k๋ ํ์ํ๊ณ ์ ํ๋ ๊ฐ์ด๋ค.
# ์ด์ํ ์ด๋ถํ์ ์ฌ์ฉํ์ง๋ง๊ณ ์ ์์ ๋ฐ๋ฅด์.
while start <= end:
mid = (start + end) // 2
if k == m_list[mid]:
result.append(k)
return
elif k > m_list[mid]:
start = mid+1
else:
end = mid-1
ํ์ํ ๋์์ ์ฒ์๊ณผ ๋์ ์ ํด๋๊ณ while๋ฌธ์ ํตํด ๋๊ฐ๊ฐ ์ผ์นํ๊ฑฐ๋, ๊ต์ฐจํ ๋๊น์ง ๋ฐ์ฉ ์ค์ฌ๋๊ฐ๋ ๊ฒ์ ๋ฐ๋ณตํ๋ค.
[๋ฐฑ์ค 2110๋ฒ: ๊ณต์ ๊ธฐ ์ค์น]:(https://www.acmicpc.net/problem/2110)
์ ๋ฌธ์ ์ ๊ฒฝ์ฐ ์ด์ง ํ์์ด ๊ฐ์ฅ ์ด์์ ์ด๊ณ ๋, ์ค์ฉ์ , ๊ทธ๋ ์ง๋ง ์ด์งํ์์ ์ ๊ทผ๋ฒ์ผ๋ก ๋ ์ฌ๋ฆฌ๊ธฐ ๊ฐ์ฅ ์ฝ์ง ์์๋ ํํ์ด๋ค.
๐์์ ๋งํ๋ฏ ์๋ฒฝํ๋ค ๋๋ผ๊ธฐ ์ ๊น์ง ์ด์ํ ํ์ด ๋ณด๊ณ ํนํ์ง ๋ง๊ณ ์ ์๋๋ก ํ์.
BFS(๋๋น์ฐ์ ํ์)๋ DFS(๊น์ด ์ฐ์ ํ์)์ ์ง์ ์ด๋ฃฌ๋ค. ํ์ฌ๊น์ง ํ์ ํ ๋ฐ๋ก๋ ํ๋ ฌ์์ ์ ์ผ์ฑ์ด ์๋ ๋ฌด์ธ๊ฐ์ ์ํ ๋จ๊ณ๋ณ ํ๋จ์ ์ด๋ฃจ์ด์ผ ํ ๊ฒฝ์ฐ ์ฐ์.
def bfs():
while queue:
x, y = queue.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if nx < 0 or ny < 0 or nx >= n or ny >= m:
continue
if graph[nx][ny] == -1:
continue
if graph[nx][ny] == 0 or graph[nx][ny] > (graph[x][y] + 1):
graph[nx][ny] = graph[x][y] + 1
queue.append((nx, ny))
์์์ ์ ์ ์ผ ๋จผ์ ํ์ ์ฝ์ ํ, ์ธ์ ํ ๋ ธ๋๊ฐ ์กฐ๊ฑด์ ๋ถํฉํ๋ค๋ฉด ๋ง์ฐฌ๊ฐ์ง๋ก ํ์ ์ฝ์
๐DFS์์ ์ฐจ์ด์ : dfs๋ ์คํ์ ์ด์ฉํ๊ฑฐ๋, ์์ ๊ฐ์ด ์กฐ๊ฑด์ ๋ง์กฑํ ๋ ธ๋์์ ์ฌ๊ท์์ผ๋ก ๊น๊ฒ ๋ค์ด๊ฐ๋ ๋ฐ์ ๋ฐํด, bfs๋ ํ์ ๋ค์ด์จ ์์๋๋ก ์ฒ๋ฆฌํ๋ค.
DFS(๊น์ด ์ฐ์ ํ์) ๊น์ด ์ฐ์ ํ์์ ํ์ ๋ฑ์ฅํ๋ ๋ค์ต์คํธ๋ผ์ ์ด๋์ ๋ ๊ถค๋ฅผ ๊ฐ์ดํ๋ค. ์ฐจ์ด์ ์ ๋น์ฉ์ด ๋ฐ๋ก ์ค์ ๋์ด ์์ง ์์ผ๋ฉด์, ๋ฐฉ๋ฌธ ๋ ธ๋์ ๊ดํ ์ ๋ณด๋ฅผ ํ์ํด์ผ ํ ๋ ์ฐ์ธ ๋ค๋ ์ ์ด๋ค.
def dfs(graph, v, visited):
visited[v] = True
print(v, end=' ')
for i in graph[v]:
if not visited[i]:
dfs(graph, i, visited)
์์ ์ฝ๋์์ ๋ณผ ์ ์๋ฏ DFS์ ํต์ฌ ์ฝ๋๋ BFS์ ๋นํด ๊ตฌํ์ด ์ฌ์ด ํธ์ด๋ค.
BFS์์ ํ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ฒ๋ผ DFS๋ ์คํ์ ์ฌ์ฉํ์ฌ ํ์ํ๋ค๋ ๊ฒ์ด ํต์ฌ์ธ๋ฐ,
๋ณดํต์ ๊ฒฝ์ฐ์์๋ ์คํ์ ์ฌ์ฉํ์ง ์๊ณ ์์ ๊ฐ์ด ์ฌ๊ท์ ๋ฐฉ์์ผ๋ก ํ์์ ํ๋ ๊ฒ์ด ๋ ํจ๊ณผ์ ์ด๋ค.
import sys
sys.setrecursionlimit(100000)
๐ํนํ ํ์ด์ฌ์์ ์ฌ๊ท์ ๊น์ด๊ฐ ๊น์ด์ง ๊ฒฝ์ฐ recursion error๋ฅผ ๋ฐ์์ํฌ ์ ์๋๋ฐ
์ฒ์ ๋ฌธ์ ๋ฅผ ๋ง์ฃผ์ณค์ ๋, ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ๊ณผ ๋ถํ ์ ๋ณต์ ํ๊ฐ๋ฆฌ์ง ๋ง์์ผ ํ๋ค.
- ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ - ๋ฌธ์ ๋ค์ด ์๋ก ์ํฅ์ ๋ฏธ์น๊ณ ์๋ค(ex. ํผ๋ณด๋์น ์์ด)
- ๋ถํ ์ ๋ณต - ๋ฌธ์ ๊ฐ ์์ ๋จ์๋ก ๋๋์ด ์ง ๋ฟ ์๋ก ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค(ex. ํต ์ ๋ ฌ)
- Top-Down(์ฃผ๋ก ๋ฉ๋ชจ์ด์ ์ด์ )
d = [0]*100
# ํผ๋ณด๋์น ํจ์(Fibonacci Function)๋ฅผ ์ฌ๊ทํจ์๋ก ๊ตฌํ(ํ๋ค์ด ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ)
def fibo(x):
# ์ข
๋ฃ์กฐ๊ฑด(1 ํน์ 2์ผ ๋ 1์ ๋ฐํ)
if x == 1 or x == 2:
return 1
# ์ด๋ฏธ ๊ณ์ฐํ ์ ์๋ ๋ฌธ์ ๋ผ๋ฉด ๊ทธ๋๋ก ๋ฐํ
if d[x] != 0:
return d[x]
# ์์ง ๊ณ์ฐํ์ง ์์ ๋ฌธ์ ๋ผ๋ฉด ์ ํ์์ ๋ฐ๋ผ์ ํผ๋ณด๋์น ๊ฒฐ๊ณผ ๋ฐํ
d[x] = fibo(x-1) + fibo(x-2)
return d[x]
- Bottom-Up(์ฃผ๋ก ๋ฐ๋ณต๋ฌธ ์ฌ์ฉ)
d = [0]*100
# ์ฒซ ๋ฒ์งธ ํผ๋ณด๋์น ์์ ๋ ๋ฒ์งธ ํผ๋ณด๋์น ์๋ 1
d[1] = 1
d[2] = 1
n = 99
for i in range(3, n+1):
d[i] = d[i-1] + d[i-2]
print(d[n])
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ํจ๊ณผ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์ถ๋ฐ์ ๊ณผ ๋์ ์ด ์๋ค๋ ๋ฐ์์ ํ๋ก์ด๋-์์ฌ๊ณผ ์ฐจ์ด์ ์ด ์๋ค. ํ๋ก์ด๋-์์ฌ๊ณผ์ ๋ชจ๋ ๋ ธ๋์์ ๋ชจ๋ ๋ ธ๋๊น์ง์ ์ต์๋น์ฉ์ ๊ตฌํจ. ๋ฌธ์ ์ค ์ธ๋ป ๋ณด๋ฉด BFS, DFS๋ก ํ์ด์ผํ ๊ฒ ๊ฐ์ ๊ฒฝ์ฐ๋ค์ด ์๋๋ฐ ํ๊ฐ๋ฆฌ์ง ๋ง์!
์ถ๋ฐ ๋ ธ๋์ ํ์ํ๋ ๋ ธ๋์์ ์ต์๊ฑฐ๋ฆฌ(๋น์ฉ)์ ๊ฐ๋ ๋ ธ๋๋ฅผ ํ์ํด์ผ ํ๋ค๋ ์ ์์ ์ฐ์ ์์ ํ(Priority Queue)
์ฆ, ํ(Heap) ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ๋ฉด ํจ๊ณผ์ ์ผ๋ก ๊ตฌํํ ์ ์๋ค. ์ด ๋ ํ์ ์ต์ ํ(Minimum Heap)์ด๋ค.
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]))
์ด ๋ Python์ ํ ๊ตฌ์กฐ์ ์ ์ฅ๋๋ ๋น์ฉ-๋ ธ๋๋ฒํธ์ ํต์ ๋ฌธ์ ์์ ์ ์๋๋ ๋ ธ๋๋ฒํธ-๋น์ฉ ๊ตฌ์กฐ๊ฐ ๋์ผํ์ง ์์์ผ๋ก ํ๊ฐ๋ฆฌ์ง ์๋๋ก ํ๋ค.
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ๋ณต์ก๋๋ O(ElogV)(์ด ๋, E๋ ๊ฐ์ ์ ์, V๋ ๋ ธ๋์ ์๋ฅผ ๊ฐ๋ฆฌํจ๋ค.)
์ ์ฒด ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๊ฒฐ๊ตญ E๊ฐ์ ์์๋ฅผ ํ์ ๋ฃ์๋ค๊ฐ ๋ชจ๋ ๋นผ๋ด๋ ์ฐ์ฐ๊ณผ ๊ฐ์ผ๋ฏ๋ก ๋จผ์ O(ElogE)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ๋๋ค.
์ด๋, ์ค๋ณต ๊ฐ์ ์ด ์๋ค๋ ์ ์ ํ์ E๋ ํญ์ V^2 ์ดํ์ด๋ค.(๋ชจ๋ ๋ ธ๋๋ผ๋ฆฌ ์ฐ๊ฒฐ๋์ด ์์ ๋ ๊ฐ์ ์ ์๋ ์๊ฐ๋ณต์ก๋ ์ V^2โก๏ธnP2 ์์ด์ ๋งค์ปค๋์ฆ)
๋ค์๋งํด logE๋ logV^2๋ณด๋ค ์๋ค. O(logV^2)๋ O(2logV)์ด๊ณ , ์ด๋ O(logV)์ด๋ค. ๊ฒฐ๋ก ์ ์ผ๋ก ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ O(ElogV)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ๋๋ค๊ณ ํ ์ ์๋ค.
ํ๋ก์ด๋ ์์ฌ ์๊ณ ๋ฆฌ์ฆ์ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋น์ทํด ๋ณด์ด์ง๋ง, ์์ ๋ค๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ๋๋ค. ๋ค์ต์คํธ๋ผ๊ฐ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ธ๋๋ถํฐ ํ์์ ์งํํ๋ค๋ฉด, ํ๋ก์ด๋ ์์ฌ์ ๋ชจ๋ ๋ ธ๋๋ฅผ ๋ชจ๋ ๋ ธ๋์ ๋ํด ๋น์ฉ ์ฐ์ถ์ ํ๋ค๋ ์ ์์ ๋ค๋ฅด๋ค.
# ์ ํ์์ ๋ฐ๋ผ ํ๋ก์ด๋ ์์
์๊ณ ๋ฆฌ์ฆ์ ์ํ
for k in range(1, n+1): # n๊ฐ์ ๊ฐ ๋
ธ๋๋ฅผ ๊ฑฐ์น๋ ๋ชจ๋ a-b์
์ n-1P2์ ์์ด์ ๋ํ O(n^2)์ ์ฐ์ฐ์ ์งํ
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])