๊ฑฐ์ค๋ฆ๋
๋น์ ์ ์์์ ์ ๊ณ์ฐ์ ๋์์ฃผ๋ ์ ์์ด๋ค. ์นด์ดํฐ์๋ ๊ฑฐ์ค๋ฆ๋์ผ๋ก ์ฌ์ฉํ 500์, 100์, 50์, 10์ ์ง๋ฆฌ ๋์ ์ด ๋ฌดํ์ด ์กด์ฌํ๋ค. ์๋์๊ฒ ๊ฑฐ์ฌ๋ฌ ์ค์ผ ํ ๋์ด N์์ผ ๋ ๊ฑฐ์ฌ๋ฌ ์ค์ผ ํ ๋์ ์ ์ต์ ๊ฐ์๋ฅผ ๊ตฌํ๋ผ. ๋จ ๊ฑฐ์ฌ๋ฌ ์ค์ผ ํ ๋ N์ ํญ์ 10์ ๋ฐฐ์์ด๋ค.
ํด์ค
์ธ์ ํ๋ ฌ ๋ฐฉ์๊ณผ ์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์์ผ๋ก ํํํ ์ ์๋ค
์๋ฅผ ๋ค์ด 0๋ฒ ๋ ธ๋์ 1๋ฒ ๋ ธ๋๊ฐ 7์ ๊ธธ์ด๋ก ์ฐ๊ฒฐ๋์ด ์๊ณ , 0๋ฒ ๋ ธ๋์ 2๋ฒ ๋ ธ๋๊ฐ 5์ ๊ธธ์ด๋ก ์ฐ๊ฒฐ๋์ด ์๋ค๋ฉด
์ธ์ ํ๋ ฌ์ [ [0, 7, 5], [7, 0, INF], [5, INF, 0] ]
์ธ์ ๋ฆฌ์คํธ [[(1,7),(2,5)], [(0,7)], [(0,5)]]
๋ฉ๋ชจ๋ฆฌ ์ธก๋ฉด์์๋ ์ธ์ ๋ฆฌ์คํธ๊ฐ ๋ ํจ์จ์ ์ด๋ค
ํ์ง๋ง ์ฐ๊ฒฐ ์ ๋ณด๋ฅผ ์ป๋ ์๋๋ ์ธ์ ํ๋ ฌ์ด ๋ ํจ์จ์ ์ด๋ค
def solution(arr):
stack = []
visited = [0] * len(arr)
# ์์์ stack์ ๋ฃ๊ธฐ
stack.append(1)
visited[1] = 1
# stack์ ์์๊ฐ ์์ ๋ ๊น์ง ๋ฐ๋ณต
while len(stack) > 0:
v = stack[-1]
print(v)
# ๋ฐฉ๋ฌธํ ์ ์๋ ์ธ์ ๋
ธ๋ ํ์ธ
flag = False
for i in arr[v]:
if visited[i] == 0:
visited[i] = 1
flag = True
stack.append(i)
break
# ๋ฐฉ๋ฌธํ ์ ์๋ ์ธ์ ๋
ธ๋ ์์ผ๋ฉด pop
if flag is False:
stack.pop()
def solution(start, arr):
# Visited ์ ์
visited = [False] * len(arr)
visited[start] = True
# ๊ฐ ๋
ธ๋ ๋ณ๋ก ๋ฐฉ๋ฌธํ๋ DFS ํจ์ ์ ์
def DFS(loc, arr, visited):
visited[loc] = True
# ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋
ธ๋ ํ์
for i in arr[loc]:
# ๋ฐ๊ฒฌ ์ ๋ฐฉ๋ฌธ
if not visited[i]:
DFS(i,arr, visited)
DFS(start,arr, visited)
from collections import deque
def solution(start, arr):
queue = deque([start])
visited = [False] * len(arr)
visited[start] = True
while len(queue) > 0:
v = queue.popleft()
for i in arr[v]:
if visited[i] == 0:
queue.append(i)
visited[i] = True
arr = [7,5,9,0,3,1,6,2,4,8]
# i๋ฒ์งธ ์ ์ ์ ๋ ฌ๋์ด ์๋ค๊ณ ์๊ฐ
# i๋ฒ์งธ ํ์ ๊ฐ๋ค ์ค ๊ฐ์ฅ ์์ ๊ฐ์ '์ ํ'ํด์ i๋ฒ์งธ๋ก ์ด๋
for i in range(len(arr)):
min_index = i
for j in range(i+1, len(arr)):
if arr[min_index] > arr[j]:
min_index = j
# ๊ฐ์ฅ ์์ ๊ฐ์ i๋ฒ์งธ๋ก ์ด๋
arr[i], arr[min_index] = arr[min_index], arr[i] # swap
arr = [7,5,9,0,3,1,6,2,4,8]
# 0๋ฒ์ ์ ๋ ฌ๋์ด ์๋ค๊ณ ์๊ฐ
# i๋ฒ์งธ ๊ฐ์ ์ผ์ชฝ ๊ฐ๋ค๊ณผ ๋น๊ตํ๋ฉฐ ์ ์ ํ ์์น์ '์ฝ์
'
for i in range(1, len(arr)):
for j in range(i,0,-1):
if arr[j] < arr[j-1]:
arr[j], arr[j-1] = arr[j-1], arr[j]
else:
break
arr = [5,7,9,0,3,1,6,2,4,8]
def quickSort(arr, start, end):
pivot = start
left = start + 1
right = end
while left <= right:
while right > start and arr[right] >= arr[pivot]:
right -= 1
while left < end and arr[left] <= arr[pivot]:
left += 1
if left > right:
arr[right], arr[pivot] = arr[pivot], arr[right]
break
else:
arr[left], arr[right] = arr[right], arr[left]
quickSort(arr, right+1, end)
quickSort(arr, start, right-1)
arr = [7,5,9,0,3,1,6,2,9,1,4,8,0,5,2]
count = [0] * (max(arr) + 1)
for i in range(len(arr)):
count[arr[i]] += 1
sorted()๋ ๋ณํฉ ์ ๋ ฌ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋์ด ์์ผ๋ฉฐ ํต ์ ๋ ฌ๋ณด๋ค๋ ๋๋ฆด ์ ์์ง๋ง O(NlogN)์ ๋ณด์ฅํ๋ค
๋ฆฌ์คํธ ๋ด๋ถ์ sort() ํจ์๋ก๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค
sorted(), sort()์ ๋งค๊ฐ๋ณ์๋ก key๋ฅผ ์ค ์ ์๋๋ฐ ์ด๋ ์ ๋ ฌ์ ๊ธฐ์ค์ ๋ํ๋ด๋ ํจ์๋ฅผ ์ ๋ ฅ๋ฐ๋๋ค
์ฝ๋ฉํ ์คํธ์์๋ 3๊ฐ์ง์ ์ ๋ ฌ ๋ฌธ์ ๋ก ๊ตฌ๋ถ๋ ์ ์๋ค
์์ฐจ ํ์์ ๋ฆฌ์คํธ ์์ ์๋ ํน์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ธฐ ์ํด ์์์๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ์ฐจ๋ก๋๋ก ํ์ธํ๋ ๋ฐฉ๋ฒ์ด๋ค
์ด์ง ํ์์ ๋ด๋ถ ๋ฐ์ดํฐ๊ฐ ์ ๋ ฌ๋์ด ์์ด์ผ๋ง ์ฌ์ฉํ ์ ์๋ค
์ฐพ์ผ๋ ค๋ ๋ฐ์ดํฐ์ ์ค๊ฐ ์ง์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ๋น๊ตํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ์ด๋ค
def binSearch(arr, target, start, end):
if start > end:
return none
mid = (start + end) // 2
if arr[mid] == target:
return mid
elif arr[mid] > target:
return binSearch(arr, target, start, mid - 1)
else:
return binSearch(arr, target, mid+1, end)
ํ์ ๋ฒ์๊ฐ 2000๋ง์ ๋์ด๊ฐ๋ฉด ์ด์ง ํ์์ผ๋ก ์ ๊ทผํ๋ ๊ฒ์ด ์ข๋ค
dp = [0] * 100
def fibo(x):
if x == 1 or x == 2:
return 1
if dp[x] != 0:
return dp[x]
dp[x] = fibo(x-1) + fibo(x-2)
return dp[x]
์ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ๋ค์์ ๊ฒฝ์ฐ์ ์ ์ฉํ ์ ์๋ค
dp = [0] * 100
def fibo(x):
if x == 1 or x == 2:
return 1
if dp[x] != 0:
return dp[x]
dp[x] = fibo(x-1) + fibo(x-2)
return dp[x]
๋ค์ด๋ด๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ํ์ฉํ๋ ๊ฒฝ์ฐ O(N)์ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๊ฒ ๋๋ค
์ด๋ ํ ๋ค์ด ๋ฐฉ์์ผ๋ก ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์์ ๋ฌธ์ ๋ฅผ ํธ์ถํ๋ค
dp = [0] * 100
dp[1] = 1
dp[2] = 2
n = 99
for i in range(3, n+1):
dp[i] = dp[i-1] + dp[i-2]
์ด ๋ฐฉ์์ ๋ฐํ ์ ๋ฐฉ์์ด๋ค
์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ์ ๋ค์ํ ์ ํ์ด ์กด์ฌํ๋ค
๋ณดํต ๊ทธ๋ํ๋ฅผ ์ด์ฉํด ํํํ๋ค
๋ค์ต์คํธ๋ผ์ ํ๋ก์ด๋ ์์ ์๊ณ ๋ฆฌ์ฆ ์ ํ์ ๋ํด ์์๋ณด์
๊ทธ๋ํ์์ ์ฌ๋ฌ ๊ฐ์ ๋ ธ๋๊ฐ ์์ ๋, ํน์ ํ ๋ ธ๋์์ ์ถ๋ฐํ์ฌ ๋ค๋ฅธ ๋ ธ๋๋ก ๊ฐ๋ ๊ฐ๊ฐ์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํด์ฃผ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค
๋ค์ต์คํธ๋ผ ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ์ ์์ ๊ฐ์ ์ด ์์ ๋ ์ ์์ ์ผ๋ก ๋์ํ๋ค
๋ค์ต์คํธ๋ผ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ถ๋ฅํ ์ ์๋ค
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ๊ณผ์ ์์ ๊ฐ ๋ ธ๋์ ๋ํ ํ์ฌ๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ ์ ๋ณด๋ฅผ ํญ์ 1์ฐจ์ ๋ฆฌ์คํธ์ ์ ์ฅํ๋ฉฐ ๋ฆฌ์คํธ๋ฅผ ๊ณ์ ๊ฐฑ์ ํ๋ค๋ ํน์ง์ด ์๋ค
๊ตฌํํ๊ธฐ ์ฝ์ง๋ง ๋๋ฆฐ ์ฝ๋์ ๊ตฌํํ๊ธฐ ์ด๋ ต์ง๋ง ๋น ๋ฅธ ์ฝ๋ ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ๊ตฌํ ๊ฐ๋ฅํ๋ค
def dijkstra(arr):
cur = 1
visited = [0] * (N+1)
costs = [INF] * (N+1)
costs[1] = 0
def getSmallest():
minValue = INF
index = -1
for idx in range(1,N+1):
if costs[idx] < minValue and visited[idx] == 0:
minValue = costs[idx]
index = idx
return index
for i in range(1,len(costs)-1):
cur = getSmallest()
visited[cur] = 1
for j in range(1,N+1):
# cur์์ j ๊น์ง ๊ฐ๋ฆฌ
if j != cur:
for k in arr:
if k[0] == cur and j == k[1]:
costs[j] = min(costs[j], costs[cur]+k[2])
def dijkstr(arr):
start = 1
costs = [INF] * (N+1)
costs[1] = 0
q = []
heapq.heappush(q,(0,start))
while q:
dist, cur = heapq.heappop(q)
if distance[cur] < dist:
continue
for j in arr:
if j[0] == cur:
if costs[j[1]] > (dist + j[2]):
costs[j[1]] = dist + j[2]
heapq.heappush(q,(dist + j[2], j[1]))
๋ชจ๋ ์ง์ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ง์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํด์ผ ํ๋ ๊ฒฝ์ฐ ์ฌ์ฉํ ์ ์๋ค
๋จ๊ณ๋ง๋ค ํด๋น ๋ ธ๋๋ฅผ ๊ฑฐ์ณ๊ฐ๋ ๊ฒฝ๋ก๋ฅผ ํ์ธํ๋ฉฐ ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ์ ๊ฐฑ์ ํ๋ค
๋ฐ๋ผ์ ํ์ฌ ๋ ธ๋๋ฅผ ์ ์ธํ N-1๊ฐ์ ๋ ธ๋ ์ค ๋ ๋ ธ๋๋ฅผ ์ ํํ์ฌ ๋ ๋ ธ๋ ์ฌ์ด์ ํ์ฌ ๋ ธ๋๋ฅผ ๊ฑฐ์ณ ๊ฐ๋ ๋น์ฉ์ ๊ณ์ฐํ๋ค
๋ฐ๋ผ์ ์ ์ฒด N๊ฐ์ ๋ ธ๋์ ๋ํด N-1 P 2๋ฒ์ ์ฐ์ฐ์ด ์ํ ๋๊ธฐ์ O(N^3)์ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค
K ๋ฒ ๋จ๊ณ์ ๋ํ ์ ํ์์ ๋ค์๊ณผ ๊ฐ๋ค
def floydWarshall(arr):
dist = [[INF for j in range(N+1)] for i in range(N+1)]
# ๊ฑฐ๋ฆฌ ํ
์ด๋ธ ์ด๊ธฐํ
for i in range(1,N+1):
dist[i][i] = 0
for k in arr:
if k[0] == i:
dist[i][k[1]] = k[2]
for i in range(1,N+1):
# i๋ฒ ๋
ธ๋๋ฅผ ๊ฑฐ์ณ๊ฐ๋ ๊ฒฝ์ฐ
for start in range(1,N+1):
if start == i:
continue
for end in range(1,N+1):
if end == i or end == start:
continue
print(start,"์์",end,"๊น์ง",i,"๋ฅผ ๊ฑฐ์นจ :",dist[start][end],dist[start][i]+dist[i][end])
dist[start][end] = min(dist[start][end], dist[start][i] + dist[i][end])
print(dist)
๊ณตํต ์์๊ฐ ์๋ ์งํฉ
์๋ก์ ์๋ฃ๊ตฌ์กฐ๋ union, find ์ฐ์ฐ์ผ๋ก ๊ตฌ์ฑ๋๋ค
์๋ก์ ์๋ฃ๊ตฌ์กฐ๋ ํธ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํ๋๋ค
Ex) ์ ์ฒด ์งํฉ : {1,2,3,4,5,6}
์ฌ๊ธฐ์ ๊ฐ ์์๋ ๋ ธ๋, ๊ฐ union ์ฐ์ฐ์ ๊ฐ์ ์ผ๋ก ํํํ๋ค
union A,B
1. A์ B์ ๋ถ๋ชจ๋
ธ๋ A`, B` ์ ๊ฐ๊ฐ ์ฐพ๋๋ค
2. A`์ B`์ ๋ถ๋ชจ๋
ธ๋๋ก ์ค์ ํ๋ค (๊ฐ์ด ๋ ์์ ๋ฃจํธ๊ฐ ๋ฃจํธ๊ฐ ๋๋๋ก ํ๋ค)
1 5
2 4 6
3
๋ถ๋ชจ ํ ์ด๋ธ์ ์ ์งํ์ฌ ๊ฐ ์์๋ง๋ค์ ๋ถ๋ชจ๋ฅผ ์ ์ฅํ๋ค
parentTable = [i for i in range(1,N+1)]
def findParent(a, parentTable):
if parentTable[a] != a:
parentTable[a] = findParent(parentTable[a], parentTable)
return parentTable[a]
def union(a,b):
aParent = findParent(a)
bParent = findParent(b)
if aParent > bParent:
parentTable[aParent] = bParent
else:
parentTable[bParent] = aParent
๊ฐ๊ฐ์ ์์์ ์ต์ข ๋ฃจํธ๋ฅผ ์ฐพ๊ฒ ๋๋ฉด ์๋ก์๋ฅผ ํ๋จํ ์ ์๋ค
๊ฐ ์์์ ๋ฃจํธ๋ฅผ ์ฐพ๋ ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ ๋ณต์ก๋๋ O(V)์ด๋ค
๋ฐ๋ผ์ union์ฐ์ฐ์ด M์ด๋ผ๊ณ ํ ๋ ์ ์ฒด ๋ณต์ก๋๋ O(VM)์ด๋ค
์์ถ ๊ธฐ๋ฒ์ ํตํด์ findParent๋ฅผ ์ฌ๊ท์ ์ผ๋ก ์ฌ์ฉํ ๋ parentTable์ ์ ๋ฐ์ดํธํ์ฌ ๊ฐ์ ํ ์ ์๋ค
์๋ก์ ํ๋ณ๋ฒ์ ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ์์ ์ฌ์ดํด์ ํ๋ณํ๋๋ฐ ์ฌ์ฉํ ์ ์๋ค
๋ฐฉํฅ ๊ทธ๋ํ์์ ์ฌ์ดํด์ DFS๋ฅผ ์ฌ์ฉํ ์ ์๋ค๊ณ ํ๋ค
๊ฐ์ ์ ํ๋์ฉ ํ์ธํ๋ฉด์ ๋ ๋ ธ๋๊ฐ ํฌํจ๋์ด ์๋ ์งํฉ์ ํฉ์น๋ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ฉด ์ฌ์ดํด์ ํ๋ณํ ์ ์๋ค
ํ๋์ ๊ทธ๋ํ๊ฐ ์์ ๋ ๋ชจ๋ ๋ ธ๋๋ฅผ ํฌํจํ๋ฉด์ ์ฌ์ดํด์ด ์กด์ฌํ์ง ์๋ ๋ถ๋ถ ๊ทธ๋ํ๋ฅผ ์๋ฏธํ๋ค
์ต์ํ์ ๋น์ฉ์ผ๋ก ์ ์ฅ ํธ๋ฆฌ๋ฅผ ์ฐพ์์ผํ๋ ๊ฒฝ์ฐ ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ ์ ์๋ค
๊ฐ์ฅ ์ ์ ๋น์ฉ์ผ๋ก ๋ชจ๋ ๋์๋ฅผ ์ฐ๊ฒฐํ๋ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ถ๋ฅํ ์ ์๋ค
๋ชจ๋ ๊ฐ์ ์ ๋น์ฉ์์ผ๋ก ์ ๋ ฌํ๊ณ ๊ฐ์ฅ ๋น์ฉ์ด ์ ์ ๊ฐ์ ๋ถํฐ ํฌํจํ๋ค
์ด๋, ์ฌ์ดํด์ด ์๊ธฐ๋ ๊ฐ์ ์ ํฌํจํ์ง ์๋๋ค
ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ O(ElogE)์ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค
def find_parent(x, parent):
if parent[x] != x:
parent[x] = find_parent(parent[x], parent)
return parent[x}
def union(parent, a, b):
aParent = find_parent(a, parent)
bParent = find_parent(b, parent)
if aParent < bParent:
parent[bParent] = aParent
else:
parent[aParent] = bParent
def kruskal(n, edges):
# ๋น์ฉ์ด ์ ์ ์์๋ก ๋ฐฉ๋ฌธ
parent = [i for i in range(n+1)]
edges.sort()
total = 0
for cost, a, b in edges:
# ์ฌ์ดํด์ด ์๊ธฐ๋ ๊ฒฝ์ฐ ํฌํจํ์ง ์์
if find_parent(a, parent) != find_parent(b,parent):
union(parent, a, b)
total += cost
์์ ์ ๋ ฌ์ ๋ฐฉํฅ ๊ทธ๋ํ์ ๋ชจ๋ ๋ ธ๋๋ฅผ ๋ฐฉํฅ์ฑ์ ๊ฑฐ์ค๋ฅด์ง ์๋๋ก ์์๋๋ก ๋์ดํ๋ ๊ฒ์ด๋ค
์์ ์ ๋ ฌ์์ ์ง์ ์ฐจ์๋ ํด๋น ๋ ธ๋๋ก ๋ค์ด์ค๋ ๊ฐ์ ์ ์๋ฅผ ์๋ฏธํ๋ค
์ง์ ์ฐจ์๊ฐ 0์ธ ๋ ธ๋๋ฅผ ํ์ ๋ฃ๋๋ค
ํ๊ฐ ๋น๋ ๊น์ง ๋ค์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค
from collections import deque
# arr๋ ์ธ์ ๋ฆฌ์คํธ
def topology_sort(arr):
result = []
q = deque()
indegree = [0 for i in range(n+1)]
graph = [[] for i in range(n+1)]
# ์ง์
์ฐจ์ ํ
์ด๋ธ, ๊ทธ๋ํ ์ด๊ธฐํ
for a, b in arr:
indegree[b] += 1
graph[a].append(b)
for i in range(1, n+1):
if indegree[i] == 0:
q.append(i)
while q:
cur = q.popleft()
result.append(cur)
# ํ์ฌ ๋
ธ๋์ ๊ฐ์ ์ ๊ฑฐ
for adj in graph[cur]:
indegree[adj] -= 1
if indegree[adj] == 0:
q.append(adj)
return result