๐ ์ง๋ฌธ์ WeareSoft๋์ tech-interview๋ฅผ ์ฐธ๊ณ ํ์์ต๋๋ค.
- ์๊ฐ, ๊ณต๊ฐ ๋ณต์ก๋
- Sort Algorithm
- Divide and Conquer
- Dynamic Programming
- Greedy Algorithm
- Graph
๋ณต์ก๋๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฑ๋ฅ์ ํ๊ฐํ๋ ์ฒ๋๋ก ์๊ฐ ๋ณต์ก๋(Time Complexity)์ ๊ณต๊ฐ ๋ณต์ก๋(Space Complexity)๋ก ๋๋๋ค.
- ์๊ฐ ๋ณต์ก๋(Time Complexity): ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉ๋๋ ์ฐ์ฐ ํ์์ ์ด๋
- ๊ณต๊ฐ ๋ณต์ก๋(Space Complexity): ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉ๋๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ด๋
์ฆ, ์๊ฐ ๋ณต์ก๋๋ ์๋์ ๋ํ ๋ถ์ ๊ฒฐ๊ณผ์ด๊ณ , ๊ณต๊ฐ ๋ณต์ก๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๋ํ ๋ถ์ ๊ฒฐ๊ณผ์ด๋ค.
์๊ณ ๋ฆฌ์ฆ์ ๋ณต์ก๋๋ ์ ๊ทผ์ ํ๊ธฐ๋ฒ์ผ๋ก ๋ํ๋ด๋๋ฐ, ์ ๊ทผ์ ํ๊ธฐ๋ฒ์๋ ๋ํ์ ์ผ๋ก O(๋น ์ค), โฆ(์ค๋ฉ๊ฐ), ฮ(์ธํ)๊ฐ ์๋ค.
- O Notation (๋น ์ค ํ๊ธฐ๋ฒ): ์ ๊ทผ์ ์ํ์ / ์ต์ ์ ๊ฒฝ์ฐ
- ฮฉ Notation (์ค๋ฉ๊ฐ ํ๊ธฐ๋ฒ): ์ ๊ทผ์ ํํ์ / ์ต์์ ๊ฒฝ์ฐ
- ฮธ Notation (์ธํ ํ๊ธฐ๋ฒ): ์ ๊ทผ์ ์ํ์ ๊ณผ ์ ๊ทผ์ ํํ์ ์ ๊ต์งํฉ / ํ๊ท ์ ๊ฒฝ์ฐ
์ผ๋ฐ์ ์ผ๋ก ์ต์ ์ ๊ฒฝ์ฐ์ ์ฑ๋ฅ์ ์ธก์ ํ๋ ๋น ์ค ํ๊ธฐ๋ฒ์ ๋ง์ด ์ฌ์ฉํ๋ค.
- ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ ๋ณต์ก๋์ Big-O ์ฝ๊ฒ ์ดํดํ๊ธฐ - Chulgil.Lee
- ์๊ฐ๋ณต์ก๋์ ๊ณต๊ฐ๋ณต์ก๋(Time Complexity Space Complexity) - ์ค๋๋ MadPlay!
- [์ปดํจํฐ ์๊ณ ๋ฆฌ์ฆ ์ฑ๋ฅ๋ถ์] ์ ๊ทผ์ ํ๊ธฐ๋ฒ (Asymptotic Notation) - ๋ ์ฑ๋ถ๋ฅธ๋ก์
๋ฒ๋ธ ์ ๋ ฌ(Bubble Sort)์ ๋ฐฐ์ด์ 0๋ฒ๋ถํฐ N-1๋ฒ๊น์ง ํ์์ ํ๋ฉด์ ์ธ์ ํ ์นธ๊ณผ ๋น๊ตํ์ฌ swap์ ํ๋ ๋ฐฉ์์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
์์ ๊ณผ์ ์ด ๋ฒ๋ธ ์ ๋ ฌ์ 1ํ ์ค์ํ๊ณ ๋์์ ๊ฒฐ๊ณผ์ด๋ค. j๋ฒ์งธ ๊ฐ๊ณผ j+1๋ฒ์งธ ๊ฐ์ ๋น๊ตํด์ ๋ง์ฝ j๋ฒ์งธ ๊ฐ์ด ๋ ํฌ๋ค๋ฉด swap์ ํด์ฃผ๋ ์์ผ๋ก ๋์ํ๋ค.
์๊ฐ ๋ณต์ก๋
ํ์ด์ฌ ๊ตฌํ
def bubbleSort(alist):
for passnum in range(len(alist)-1, 0, -1):
for i in range(passnum):
if alist[i] > alist[i+1]:
temp = alist[i]
alist[i] = alist[i+1]
alist[i+1] = temp
- [ ์ ๋ ฌ ] ๋ฒ๋ธ์ ๋ ฌ (Bubble Sort) (C++) - ์๋ฌธ's Coding World..
- ๋ฒ๋ธ์ ๋ ฌ - ratsgo's blog
- 6.7. The Bubble Sort - Problem Solving with Algorithms and Data Structures using Python
์ ํ ์ ๋ ฌ(Selection Sort)์ ์์น ๋ณ๊ฒฝ ํ์๋ฅผ ์ค์ฌ, ๋ฒ๋ธ ์ ๋ ฌ์ ์ผ๋ถ ๊ฐ์ ํ ๊ธฐ๋ฒ์ด๋ค. ์ฃผ์ด์ง ๋ฐฐ์ด ์ค์ ์ต๋๊ฐ์ ์ฐพ์ ์ ๋ ฌ๋์ง ์์ ๋ฐฐ์ด์ ๋งจ ๋ค์ ๊ฐ๊ณผ ์๋ฆฌ๋ฅผ ๋ฐ๊พธ์ด๋๊ฐ๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ๋ฐฐ์ด์ ๋งจ ๋ค๋ถํฐ ์ฐจ๋ก๋ก ์ ๋ ฌ์ด ๋๋ค.
๋ฒ๋ธ ์ ๋ ฌ์ ์ผ์ชฝ์ ์๋ ๊ฐ์ด ๋น๊ต ๋์์ธ ์ค๋ฅธ์ชฝ์ ์๋ ๊ฐ๋ณด๋ค ํฌ๋ฉด ์๋ฆฌ๋ฅผ ๋ฐ๊ฟ์คฌ๋๋ฐ ๋ฐํด, ์ ํ ์ ๋ ฌ์ ์ผ๋จ ์ต๋๊ฐ(ํน์ ์ต์๊ฐ)์ ์ฐพ์ ๋ค์์ผ ์ด ๊ฐ์ ์ ํด์ง ์์น๋ก ๋ณด๋ด์ฃผ๊ฒ ๋๋ค. ๋ค์ ๋งํด ๋น๊ต ํ์ ์ธก๋ฉด์์๋ ๋ฒ๋ธ ์ ๋ ฌ๊ณผ ์ ํ ์ ๋ ฌ์ด ๊ฐ๊ณ ๋ ๋ชจ๋
์๊ฐ ๋ณต์ก๋
ํ์ด์ฌ ๊ตฌํ
def selectionSort(alist):
for fillslot in range(len(alist)-1, 0, -1):
positionOfMax = 0
for location in range(1, fillslot+1):
if alist[location] > alist[positionOfMax]:
positionOfMax = location
temp = alist[fillslot]
alist[fillslot] = alist[positionOfMax]
alist[positionOfMax] = temp
- [ ์ ๋ ฌ ] ์ ํ ์ ๋ ฌ (Selection Sort) (C++) - ์๋ฌธ's Coding World..
- ์ ํ์ ๋ ฌ - ratsgo's blog
- 6.8. The Selection Sort - Problem Solving with Algorithms and Data Structures using Python
์ฝ์ ์ ๋ ฌ(Insertion Sort)์ ๋ฐฐ์ด์ ๋ชจ๋ ์์๋ฅผ ๋ฐฐ์ด์ ์์๋ถํฐ ๋๊น์ง ํ์ฌ ๋ฐฐ์ด์ ์์๋ค๊ณผ ๋น๊ตํด ๊ฐ๋ฉด์ ์ ์ ํ ์์น์ ์ฝ์ ํ๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
์๊ฐ ๋ณต์ก๋
- ์ต์
์ ๊ฒฝ์ฐ(Worst):
$O(N^2)$ - ํ๊ท ์ ์ธ ๊ฒฝ์ฐ(Average):
$O(N^2)$ - ์ต์ ์ ๊ฒฝ์ฐ(Best):
$O(N)$
ํ์ด์ฌ ๊ตฌํ
def insertion_sort(collection):
for index in range(1, len(collection)):
while 0 < index and collection[index] < collection[index - 1]:
collection[index], collection[
index - 1] = collection[index - 1], collection[index]
index -= 1
return collection
- [ ์ ๋ ฌ ] ์ฝ์ ์ ๋ ฌ (Insertion Sort) (C++) - ์๋ฌธ's Coding World..
- ์ฝ์ ์ ๋ ฌ(Insertion Sort) - ratsgo's blog
- 6.9. The Insertion Sort - Problem Solving with Algorithms and Data Structures using Python
ํฉ๋ณ ์ ๋ ฌ(Merge Sort)๋ ๋ฐฐ์ด์ ์๊ฒ ์ชผ๊ฐ ๋ค ๋์ฉ ํฌ๊ธฐ๋ฅผ ๋น๊ตํด ์ ๋ ฌํ๊ณ ๋ถ๋ฆฌ๋ ๋ฆฌ์คํธ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํฉ์ณ์ ์ ๋ ฌ์ ์์ฑํ๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ๋ถํ ๋ ๋ฐฐ์ด์ ์ ์ฅํด๋ ๊ณต๊ฐ์ด ํ์ํด ๋ฉ๋ชจ๋ฆฌ ์๋ชจ๋์ด ํฐ ํธ์ด๋ค. ๋ฌธ์ ๋ฅผ ๋ถ๋ฆฌํ๊ณ ๊ฐ๊ฐ์ ํด๊ฒฐํ ํ ๋ค์ ํฉ์น๋ Divide & Conquer ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
- Divide: ์ด๊ธฐ ๋ฐฐ์ด์ 2๊ฐ์ ๋ฐฐ์ด๋ก ๋ถํ ํ๋ค.
- Conquer: ๊ฐ ๋ถ๋ถ ๋ฐฐ์ด์ ์ฌ๊ท์ ์ผ๋ก ๋ณํฉ ์ ๋ ฌ์ ์ฌ์ฉํ์ฌ ์ ๋ ฌํ๋ค.
- Merge: ๋ถ๋ถ ๋ฐฐ์ด์ ํ๋์ ๋ฐฐ์ด๋ก ๊ฒฐํฉํ๋ค.
์๊ฐ ๋ณต์ก๋
ํ์ด์ฌ ๊ตฌํ
def merge_sort(list):
if len(list) <= 1:
return list
mid = len(list) // 2
leftList = list[:mid]
rightList = list[mid:]
leftList = merge_sort(leftList)
rightList = merge_sort(rightList)
return merge(leftList, rightList)
- [ ์ ๋ ฌ ] ๋ณํฉ ์ ๋ ฌ (Merge Sort) (C++) - ์๋ฌธ's Coding World..
- ํฉ๋ณ์ ๋ ฌ(Merge Sort) - ratsgo's blog
- 6.11. The Merge Sort - Problem Solving with Algorithms and Data Structures using Python
ํ ์ ๋ ฌ(Heap Sort)์ ์์ ์ด์ง ํธ๋ฆฌ๋ก ๊ตฌํ๋๋ ์ ๋ ฌ ๋ฐฉ์์ผ๋ก, ๋ชจ๋ ๋ ธ๋๊ฐ ํ ์์ฑ(๊ฐ ๋ ธ๋์ ๊ฐ์ด ์์ ์ ์์ ๋ ธ๋ ๊ฐ๋ณด๋ค ํฐ ์ด์ง ํธ๋ฆฌ)์ ๋ง์กฑํ๋๋ก ์ฌ๊ท์ ์ผ๋ก ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด ์ ๋ ฌ์ ์์ฑํ๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
๋์ ์๋ฆฌ
- ์ฃผ์ด์ง ์์๋ค๋ก ์ต๋ ํ์ ๊ตฌ์ฑํ๋ค.
- ํ์ฌ ํ์ ๋ฃจํธ ๋ ธ๋์๋ ์ต๋๊ฐ์ด ์กด์ฌํ๊ฒ ๋๋ค. ๋ฃจํธ์ ๊ฐ์ ๋ง์ง๋ง ์์์ ๋ฐ๊พผ ํ, ํ์ ์ฌ์ด์ฆ๋ฅผ ํ๋ ์ค์ธ๋ค.
- ํ์ ์ฌ์ด์ฆ๊ฐ 1๋ณด๋ค ํฌ๋ฉด ์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
์๊ฐ ๋ณต์ก๋
ํ์ด์ฌ ๊ตฌํ
def heapify(unsorted, index, heap_size):
largest = index
left_index = 2 * index + 1
right_index = 2 * index + 2
if left_index < heap_size and unsorted[left_index] > unsorted[largest]:
largest = left_index
if right_index < heap_size and unsorted[right_index] > unsorted[largest]:
largest = right_index
if largest != index:
unsorted[largest], unsorted[index] = unsorted[index], unsorted[largest]
heapify(unsorted, largest, heap_size)
def heap_sort(unsorted):
n = len(unsorted)
for i in range(n//2-1, -1, -1):
heapify(unsorted, i, n)
for i in range(n-1, 0, -1):
unsorted[0], unsorted[i] = unsorted[i], unsorted[0]
heapify(unsorted, 0, i)
return unsorted
- [ ์ ๋ ฌ ] ํ ์ ๋ ฌ (Heap Sort) (C++) - ์๋ฌธ's Coding World..
- ํ ์ ๋ ฌ(Heap Sort) - ratsgo's blog
- ํ์ ๋ ฌ(Heap Sort) ์๊ณ ๋ฆฌ์ฆ :: ๋ง์ด๊ตฌ๋ฏธ - ๋ง์ด๊ตฌ๋ฏธ์ HelloWorld
ํต ์ ๋ ฌ(Quick Sort)๋ pivot์ ๊ธฐ์ค์ผ๋ก pivot ์์๋ pivot๋ณด๋ค ์์ ๊ฐ, ๋ค์๋ ํฐ ๊ฐ์ด ์ค๋๋ก ํ์ฌ ๋ฐฐ์ด์ ๋ถํ ํ๊ณ , ๋ถํ ๋ ๋ ๊ฐ ๋ฐฐ์ด ๊ฐ๊ฐ์ ์ฌ๊ท์ ์ผ๋ก ์ด ๊ณผ์ ์ ๋ฐ๋ณตํด ์ ๋ ฌ์ ์์ฑํ๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ํฉ๋ณ ์ ๋ ฌ๊ณผ ๋ฌ๋ฆฌ ์ฃผ์ด์ง ๋ฐฐ์ด์ ์์๋ก ๋๋์ง ์๊ธฐ ๋๋ฌธ์ ๋๊ฐ๋ ํจ์จ์ ์ด์ง๋ง, pivot์ด ์๋ชป ์ ํ๋๋ฉด ๋ณต์ก๋๊ฐ
์์ ๊ณผ์ ์ด ํต ์ ๋ ฌ์ 1ํ ์ค์ํ๊ณ ๋์์ ๊ฒฐ๊ณผ์ด๋ค. 54(pivot)๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ ๊ฐ์ ๋ฐฐ์ด๋ก ๋๋๋ค.
์๊ฐ ๋ณต์ก๋
- ์ต์
์ ๊ฒฝ์ฐ(Worst):
$O(N^2)$ - ํ๊ท ์ ์ธ ๊ฒฝ์ฐ(Average):
$O(N \log N)$ - ์ต์ ์ ๊ฒฝ์ฐ(Best):
$O(N \log N)$
ํ์ด์ฌ ๊ตฌํ
def quickSort(alist):
quickSortHelper(alist, 0, len(alist)-1)
def quickSortHelper(alist, first, last):
if first < last:
splitpoint = partition(alist, first, last)
quickSortHelper(alist, first, splitpoint-1)
quickSortHelper(alist, splitpoint+1, last)
def partition(alist, first, last):
pivotvalue = alist[first]
leftmark = first + 1
rightmark = last
done = False
while not done:
while leftmark <= rightmark and alist[leftmark] <= pivotvalue:
leftmark = leftmark + 1
while alist[rightmark] >= pivotvalue and rightmark >= leftmark:
rightmark = rightmark -1
if rightmark < leftmark:
done = True
else:
temp = alist[leftmark]
alist[leftmark] = alist[rightmark]
alist[rightmark] = temp
temp = alist[first]
alist[first] = alist[rightmark]
alist[rightmark] = temp
return rightmark
- [ ์ ๋ ฌ ] ํต ์ ๋ ฌ(Quick Sort) (C++) - ์๋ฌธ's Coding World..
- ํต ์ ๋ ฌ(Quick Sort) - ratsgo's blog
- 6.12. The Quick Sort - Problem Solving with Algorithms and Data Structures using Python
๊ณ์ ์ ๋ ฌ(Counting Sort)์ ์ ๋ ฅ๊ฐ์ ๋น๋๋ฅผ ์ธ์ด์ ์ด๋ฅผ ๊ฒฐ๊ณผ ๋ฆฌ์คํธ์ ์ธ๋ฑ์ค๋ก ํ์ฉํ๊ณ ์ ๋ ฅ ๋ฆฌ์คํธ์ ์์๊ฐ์ ํด๋นํ๋ ๊ฒฐ๊ณผ ๋ฆฌ์คํธ ์ธ๋ฑ์ค ์์น์ ์ฑ์ ๋ฃ๋ ๋ฐฉ์์ผ๋ก ์ ๋ ฌ์ ์์ฑํ๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์ ๋ ฅ ๋ฆฌ์คํธ์ ์ต๋๊ฐ(k)์ด ์ปค์ง์๋ก ๋ณต์ก๋๊ฐ ํฌ๊ฒ ๋์์ง๋ค.
๋์ ์๋ฆฌ
- ๊ฐ ๋ฐ์ดํฐ์ ๊ฐ์๋ฅผ ๋ชจ๋ count ํ๋ค.
- ์ต์๊ฐ๋ถํฐ ๊ฐ ๊ฐ๊น์ง์ count ๋์ ํฉ์ ๊ตฌํ๋ค.
- ์๋ก์ด ๋ฐฐ์ด์ ๋์ ํฉ์ ๊ฐ์๋ฅผ ์ค์ฌ์ฃผ๋ฉฐ ์ ์ฅํ๋ค.
์๊ฐ ๋ณต์ก๋
(
ํ์ด์ฌ ๊ตฌํ
def counting_sort(A, k):
B = [-1] * len(A)
C = [0] * (k + 1)
for a in A:
C[a] += 1
for i in range(k):
C[i+1] += C[i]
for j in reversed(range(len(A))):
B[C[A[j]] - 1] = A[j]
C[A[j]] -= 1
return B
- [ ์ ๋ ฌ ] ์นด์ดํ ์ ๋ ฌ(Counting Sort) (C++) - ์๋ฌธ's Coding World..
- ์นด์ดํ ์ ๋ ฌ, ๋๋์ค ์ ๋ ฌ - ratsgo's blog
- Counting Sort in C++ - prepinsta
๊ธฐ์ ์ ๋ ฌ(Radix Sort)์ ์ ๋ ฅ๊ฐ์ ์๋ฆฟ์(d) ๊ฐ๊ฐ์ ๋ํด ์นด์ดํ ์ ๋ ฌ์ ์ ์ฉํ์ฌ ์ ๋ ฅ ๋ฐ์ดํฐ์ ์ต๋๊ฐ์ธ k๊ฐ ์ปค์ง์๋ก ํจ์จ์ด ๋จ์ด์ง๋ ์นด์ดํ ์ ๋ ฌ์ ๋จ์ ์ ๋ณด์ํ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. 10์ง๋ฒ์ผ๋ก ํํ๋ ์ ๋ ฅ๊ฐ์ ๊ธฐ์ ์ ๋ ฌ์ ์ ์ฉํ๋ฉด k ๊ฐ์ด 9๋ก ์์์ง๋ค.
์๊ฐ ๋ณต์ก๋
(
ํ์ด์ฌ ๊ตฌํ
from math import log
def get_digit(number, d, base):
return (number//base**d) % base
def counting_sort_with_digit(A, d, base):
k = base - 1
B = [-1] * len(A)
C = [0] * (k + 1)
for a in A:
C[get_digit(a, d, base)] += 1
for i in range(k):
C[i+1] += C[i]
for j in reversed(range(len(A))):
B[C[get_digit(A[j], d, base)]-1] = A[j]
C[get_digit(A[j], d, base)] -= 1
return B
def radix_sort(list, base=10):
digit = int(log(max(list), base)+1)
for d in range(digit):
list = counting_sort_with_digit(list, d, base)
return list
- [ ์ ๋ ฌ ] ๊ธฐ์ ์ ๋ ฌ (Radix Sort) (C++) - ์๋ฌธ's Coding World..
- ์นด์ดํ ์ ๋ ฌ, ๋๋์ค ์ ๋ ฌ - ratsgo's blog
๋ถํ ์ ๋ณต(Divide and Conquer)์ ๋ฌธ์ ๋ฅผ ๋ถํ ํด์ ๋ถํ ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ค์ ๊ฒฐ๊ณผ๋ฅผ ์กฐํฉํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ๋ถํ ํ๋ค๋ ๊ด์ ์์ ํํฅ์ ์ ๊ทผ ๋ฐฉ๋ฒ์ผ๋ก ๋ฌธ์ ๋ฅผ ํผ๋ค๊ณ ๋ณผ ์ ์๋ค.
- ๋ถํ : ๋ฌธ์ ๋ฅผ ๋์ผํ ์ ํ์ ์ฌ๋ฌ ํ์ ๋ฌธ์ ๋ก ๋๋๋ ๊ฒ
- ํด๊ฒฐ: ๊ฐ์ฅ ์์ ๋จ์์ ํ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ
- ์กฐํฉ: ํ์ ๋ฌธ์ ์ ๋ํ ๊ฒฐ๊ณผ๋ฅผ ์๋ ๋ฌธ์ ์ ๋ํ ๊ฒฐ๊ณผ๋ก ์กฐํฉํ๋ ๊ฒ
๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ์ ๋ณดํต ์ฌ๊ท๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํ๋ค. ๋ค์์ ๋ถํ ์ ๋ณต์ ๋ํ์ ์ธ ๋ฌธ์ ์ธ ํผ๋ณด๋์น ์์ด ์ฝ๋์ด๋ค.
def fibb(n):
if n <= 1:
return 1
return fibb(n-1) + fibb(n-2)
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ(Dynamic Programming)์ ์ค๋ณต๋ ํ์ ๋ฌธ์ ๋ค์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ ํ ์๋ ๋ฌธ์ ์ ๊ฒฐ๊ณผ์ ํฉํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ๊ณผ ๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ์ ํฐ ์ฐจ์ด์ ์ ์ค๋ณต๋ ๋ฌธ์ ์ ์ฐจ์ด์ด๋ค. ๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ ๋ณํฉ ์ ๋ ฌ์ด๋ ํต ์ ๋ ฌ์ ๊ฒฝ์ฐ ํ์ ๋ฌธ์ ๋ค์ด ์ค๋ณต๋์ง ์๋๋ค. ๋ฐ๋ฉด ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ์ค๋ณต๋ ํ์ ๋ฌธ์ ๋ค์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํจ์ผ๋ก์จ ์ค๋ณต ๊ณ์ฐ์ ํผํ๋ค. ๋ง์ฝ ๋ฌธ์ ๊ฐ ์ค๋ณต๋ ํ์ ๋ฌธ์ ๊ฐ ์๋ค๋ฉด ๊ทธ ๋ฌธ์ ๋ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ํ ์ ์๋ค.
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ํฌ๊ฒ ์ํฅ์๊ณผ ํํฅ์ ์ ๊ทผ๋ฒ์ผ๋ก ๋๋๋ค.
์ํฅ์ ์ ๊ทผ๋ฒ: ํ๋ทธ๋ ์ด์ (Tabulation)
์ํฅ์ ์ ๊ทผ๋ฒ(Bottom-Up Approach)๋ ์์ ๋ฌธ์ ์ ์ ๋ต์ ์ด์ฉํด ํฐ ๋ฌธ์ ์ ์ ๋ต์ ํธ๋ ๋ฐฉ์์ด๋ค. ๋ฐ์ดํฐ๋ฅผ ํ
์ด๋ธ ํํ๋ก ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ํ๋ทธ๋ ์ด์
(Tabulation)
์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
def fibb(n):
table = [1] * (n+1)
for i in range(2, n+1):
table[i] = table[i-1] + table[i-2]
return table[n]
ํํฅ์ ์ ๊ทผ๋ฒ: ๋ฉ๋ชจ์ด์ ์ด์ (Memoization)
ํํฅ์ ์ ๊ทผ๋ฒ(Top-Down Approach)๋ ์์ ๋ฌธ์ ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์๋์ง ํ์ธํด๊ฐ๋ฉฐ ๋ฌธ์ ๋ฅผ ์ฌ๊ท๋ก ํ์ด๊ฐ๋ ๋ฐฉ์์ด๋ค. ๋ถํ ์ ๋ณต์์์ ์ฌ๊ท ๋ฐฉ์๊ณผ ์ ์ฌํ๋ ์ด๋ฏธ ํผ ๋ฌธ์ ์ธ์ง ๊ฒ์ฌํ๋ค. ์ด์ ๊ฐ์ ๋ฐฉ์์ ๋ฉ๋ชจ์ด์ ์ด์
(Memoization)
์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
# ์ ์ญ ๋ณ์๋ก table๊ณผ n์ด ๋ฏธ๋ฆฌ ์ ์ธ๋จ
def fibb(n):
if n <= 1:
return 1
if table[n]:
return table[n]
table[n] = fibb(n-1) + fibb(n-2)
return table[n]
๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ํ์ฌ ๋จ๊ณ์์ ์ต์ ์ ๋ฐฉ๋ฒ์ ์ ํํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ๊ฐ์ฅ ํฐ ๊ฐ๋ง ์ ํ, ๊ฐ์ฅ ์์ ๊ฐ๋ง ์ ํ ๋ฑ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ ํด๋๊ณ ๋ค์ ๋จ๊ณ๋ก ๋์๊ฐ์๋ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค. ๋จ, ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ด ์ ์ฉํ๊ธฐ ์ํด์๋ ํญ์ ์ ์ฉ๋ ์ ์๋์ง ์ ๋น์ฑ์ ํ์ธํด์ผ ํ๋ค.
๊ฐ์ฅ ์ ์ ๋์ ๊ฐ์๋ฅผ ๊ฑฐ์ฌ๋ฌ์ฃผ๋ ๋์ ๊ฑฐ์ค๋ฆ๋ ๋ฌธ์ ๋ฅผ ์๊ฐํด๋ณด์.
1, 5, 10์์ ๊ฑฐ์ค๋ฆ๋์ด ์๋ค๋ฉด, ํฐ ๊ฐ ๋จผ์ ๊ทธ๋ฆฌ๋ํ๊ฒ 10์์ง๋ฆฌ ๋์ ๋จผ์ ๋๋๋๋ก ์ฃผ๊ณ , ๋ค์์ผ๋ก 5์, ๋จ๋ ๋์ 1์์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค. ์ด ๊ฒฝ์ฐ, ๊ฐ์ด ํฐ ๋์ ๋ค์ ๊ฐ์ด ์์ ๋์ ์ผ๋ก ๋๋ ์ง ์ ์์ผ๋ฏ๋ก ์์ ๋์ ์ผ๋ก ์๋ก์ด ๋จ์๋ฅผ ๋ง๋ค ์ ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ด ์ฑ๋ฆฝํ๋ค.
๋ง์ฝ ์ ๋ฌธ์ ์์ ๊ฑฐ์ค๋ฆ๋์ด 1, 7, 10์์ด๋ผ๋ฉด ์ด๋ป๊ฒ ๋ ๊น? 14์์ ๊ฑฐ์ฌ๋ฌ์ฃผ๊ธฐ ์ํด ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ด๋ค๋ฉด 10์ 1๊ฐ, 1์ 4๊ฐ ์ด 5๊ฐ์ ๋์ ์ ์ธ ๊ฒ์ด๋ค. ํ์ง๋ง ์ฌ๋ฐ๋ฅธ ๋ต์ 7์ 2๊ฐ ์ด 2๊ฐ๊ฐ ํ์ํ๋ค. ์ด ๊ฒฝ์ฐ, 10์์ 7์์ผ๋ก ๋๋ ์ง ์ ์๊ธฐ ๋๋ฌธ์ ๋์ ํ๋ก๊ทธ๋๋ฐ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋๊ฒ ์ ํฉํ๋ค.
๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ ๋ฑ์๋ ํ์ฉ ๊ฐ๋ฅํ๋ฉฐ, ์ ๋ ฌ ๋ฑ๊ณผ ํจ๊ป ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
- Greedy - Heath.log
- ์ด๊ฒ์ด ์ฝ๋ฉํ ์คํธ๋ค - ๋๋๋น
- ํ์(๊ทธ๋ฆฌ๋) ์๊ณ ๋ฆฌ์ฆ(greedy algorithm) - zero cho
๊ทธ๋ํ๋ ์ ์ ๊ณผ ๊ฐ์ ์ผ๋ก ์ด๋ฃจ์ด์ง ์๋ฃ๊ตฌ์กฐ์ด๋ค. ์ ์ ๊ฐ์ ์ฐ๊ฒฐ๊ด๊ณ๋ ๊ฐ์ ์ผ๋ก ๋ํ๋ธ๋ค.
BFS(Breadth-First Search, ๋๋น์ฐ์ ํ์)
BFS๋ ๊ทธ๋ํ ์ ์ฒด๋ฅผ ํ์ํ๋ ๋ฐฉ๋ฒ ์ค ํ๋๋ก์จ, ํ์ฌ ํ์ธํ๋ ๋ ธ๋์ ์ธ์ ํ ๋ ธ๋๋ค์ ๋จผ์ ํ์ํ๋ ๊ฒ์ด๋ค. ์์ ์ ์ ์ผ๋ก๋ถํฐ ๊ฐ๊น์ด ์ ์ ์ ๋จผ์ ๋ฐฉ๋ฌธํ๊ณ ๋ฉ๋ฆฌ ๋จ์ด์ ธ ์๋ ์ ์ ์ ๋์ค์ ๋ฐฉ๋ฌธํ๋ ์ํํ๋ ๋ฐฉ์์ผ๋ก ๋ ธ๋๋ฅผ ํ์ํ๋ค. ์ฃผ๋ก ๊ตฌํ์ Queue๋ผ๋ ์๋ฃ๊ตฌ์กฐ์ ์ด์ํ๋ ์ ์ ์ ๋ค ๋ด์๋๊ณ ์ฐจ๋ก๋๋ก pop์ ํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ค. ์ฃผ๋ก ๋ ๋ ธ๋ ์ฌ์ด์ ์ต๋จ ๊ฒฝ๋ก ํน์ ์์์ ๊ฒฝ๋ก๋ฅผ ์ฐพ๊ณ ์ถ์ ๋ ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.
์ฅ์
- ๋ ธ๋์ ์๊ฐ ์ ๊ณ ๊น์ด๊ฐ ์์ ๊ฒฝ์ฐ ๋น ๋ฅด๊ฒ ๋์ํ ์ ์๋ค.
- ๋จ์ ๊ฒ์ ์๋๊ฐ ๊น์ด ์ฐ์ ํ์(DFS)๋ณด๋ค ๋น ๋ฅด๋ค.
- ๋๋น๋ฅผ ์ฐ์ ํ์ํ๊ธฐ์ ๋ต์ด ๋๋ ๊ฒฝ๋ก๊ฐ ์ฌ๋ฌ๊ฐ์ธ ๊ฒฝ์ฐ์๋ ์ต๋จ๊ฒฝ๋ก์์ ๋ณด์ฅํ๋ค.
- ์ต๋จ๊ฒฝ๋ก๊ฐ ์กด์ฌํ๋ค๋ฉด ์ด๋ ํ ๊ฒฝ๋ก๊ฐ ๋ฌดํํ ๊น์ด์ง๋คํด๋ ์ต๋จ๊ฒฝ๋ก๋ฅผ ๋ฐ๋์ ์ฐพ์ ์ ์๋ค.
๋จ์
- ์ฌ๊ทํธ์ถ์ DFS์๋ ๋ฌ๋ฆฌ ํ์ ๋ค์์ ํ์ํ ์ ์ ๋ค์ ์ ์ฅํด์ผ ํ๋ฏ๋ก ์ ์ฅ๊ณต๊ฐ์ด ๋ง์ด ํ์ํ๋ค.
- ๋ ธ๋์ ์๊ฐ ๋์ด๋๋ฉด ํ์ํด์ผํ๋ ๋ ธ๋ ๋ํ ๋ง์์ง๊ธฐ์ ๋นํ์ค์ ์ด๋ค.
DFS(Depth-First Search, ๊น์ด์ฐ์ ํ์)
DFS๋ ๊ทธ๋ํ ์ ์ฒด๋ฅผ ํ์ํ๋ ๋ฐฉ๋ฒ์ค ํ๋๋ก์จ, ์์์ ๋ถํฐ ๋ค์ ๋ถ๊ธฐ(branch)๋ก ๋์ด๊ฐ๊ธฐ ์ ์ ํด๋น ๋ถ๊ธฐ๋ฅผ ์๋ฒฝํ๊ฒ ํ์ํ๊ณ ๋์ด๊ฐ๋ ๋ฐฉ๋ฒ์ด๋ค. ๋จผ์ ๋ณด์ด๋ ๋ ธ๋๋ถํฐ ๊ณ์ํด์ ๊น์ด๋ฅผ ๋๋ ค๊ฐ๋ฉฐ ํ์ํ๊ณ , ๋ ์ด์ ํ์ํ ๋ ธ๋๊ฐ ์๋ค๋ฉด ์ด์ ๋ ธ๋๋ก ๋์๊ฐ์ ๋ค๋ฅธ ๋ธ๋์น๋ฅผ ๋ค์ ๊น์ด ํ๋ณด๋ ํ์์ ๋งํ๋ค. Stack์ด๋ ์ฌ๊ทํจ์๋ฅผ ํตํด์ ๊ตฌํํ ์ ์๋๋ฐ, ์ฌ๊ทํจ์๊ฐ ๊ตฌํ์ด ๊ฐํธํ๋ค.
์ฅ์
- ํ์ฌ ๊ฒฝ๋ก ์์ ๋ ธ๋๋ค๋ง ๊ธฐ์ตํ๋ฉด ๋๋ฏ๋ก, ์ ์ฅ ๊ณต๊ฐ์ ์์๊ฐ ๋น๊ต์ ์ ๋ค.
- ๋ชฉํ ๋ ธ๋๊ฐ ๊น์ ๋จ๊ณ์ ์๋ ๊ฒฝ์ฐ์๋ ํด๋ฅผ ๋นจ๋ฆฌ ๊ตฌํ ์ ์๋ค.
- ๊ตฌํ์ด ๋๋น ์ฐ์ ํ์(BFS) ๋ณด๋ค ๊ฐ๋จํ๋ค.
๋จ์
- ๋จ์ ๊ฒ์ ์๋๋ ๋๋น ์ฐ์ ํ์(BFS) ๋ณด๋ค ๋๋ฆฌ๋ค.
- ๊น์ด ์ฐ์ ํ์์ ํด๋ฅผ ๊ตฌํ๋ฉด ํ์์ด ์ข ๋ฃ๋๋ฏ๋ก, ๊ตฌํ ํด๊ฐ ์ต๋จ ๊ฒฝ๋ก๊ฐ ๋๋ค๋ ๋ณด์ฅ์ด ์๋ค. ๋ชฉํ์ ์ด๋ฅด๋ ๊ฒฝ๋ก๊ฐ ๋ค์์ธ ๊ฒฝ์ฐ, DFS๋ฅผ ํตํด ๊ตฌํ ํด๊ฐ ์ต์ ์ด ์๋ ์ ์๋ค. DFS๋ฅผ ์ฌ์ฉํ์ฌ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๊ธฐ ์ํด์๋, ๋ชจ๋ ๊ฒฝ๋ก๋ฅผ ์ ๋ถ ํ์ธํด๋ณด์์ผ ํ๋ค.
BFS์ DFS์ ํ์ ์์
์ฃผ์ํด์ผํ ๊ฒ
๋ ธ๋๋ฅผ Queue ํน์ Stack์ ๋ฃ์ ๋, ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ๋ฐ๋์ ํ์ํด์ฃผ์ด์ผ ํ๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด, ์๋ฃ๊ตฌ์กฐ์ ๋ ธ๋๊ฐ ์ค๋ณต๋๊ฒ ๋ค์ด๊ฐ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐฉ๋ฌธ ํ์๋ฅผ ํ์ง ์์ผ๋ฉด, ์ฌํ ๊ฒฝ์ฐ์๋ ๋ฌดํ๋ฃจํ์ ๋น ์ง ์๋ ์๋ค.
- [Algorithm] BFS ์๊ณ ๋ฆฌ์ฆ (Breadth-First Search) - ์ฝ๋ฉํฉํ ๋ฆฌ
- [Algorithm] DFS ์๊ณ ๋ฆฌ์ฆ (Depth First Search) - ์ฝ๋ฉํฉํ ๋ฆฌ
ํ ๋ ธ๋์์ ๋ค๋ฅธ ๋ ธ๋๋ก ๊ฐ๋ ์ฃ์ง์ cost ๊ฐ ์๋ ๊ทธ๋ํ๊ฐ ์ฃผ์ด์ก์ ๋, ํ ์ง์ โ ๋ชฉํ ์ง์ ๋๋ ๋ชจ๋ ์ง์ โ ๋ชจ๋ ์ง์ ๊น์ง cost ๊ฐ ๊ฐ์ฅ ์ ๊ฒ ๋๋ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๋ฌธ์ ์ด๋ค.
๋ํ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก Dijkstra
, Floyd-Warshall
, Bellman-Ford
๊ฐ ์๋ค.
ํ ๋ ธ๋์์ ๋ค๋ฅธ ๋ชจ๋ ๋ ธ๋๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ์ต๋จ ๊ฒฝ๋ก ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค. ๋จ, cost (๊ฑฐ๋ฆฌ) ๋ ๋ฐ๋์ ์์๊ฐ ์์ด์ผ ํ๋ค. ์ด๋ฌํ ํน์ฑ ๋๋ฌธ์ GPS ๊ธธ์ฐพ๊ธฐ ๋ฑ์ ์์ฉ๋๋ค.
๊ธฐ๋ณธ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ถ๋ฐ ๋ ธ๋์์ ๋ค๋ฅธ ๋ ธ๋๋ก ๊ฐ๋ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ธฐ๋กํ๋ ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ๊ณผ ํด๋น ๋ ธ๋ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ์ดํผ๋ visited ํ ์ด๋ธ์ ์ฌ์ฉํ๋ค.
๋์ ๋ฐฉ์
์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ์ ์ถ๋ฐ ๋ ธ๋๋ 0, ๋๋จธ์ง ๋ ธ๋๋ INF ๋ก ์ด๊ธฐํํ๋ค.
- ๋จผ์ ์ถ๋ฐ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธ(visited[start] = True)ํ๊ณ ์ถ๋ฐ ๋ ธ๋์์ ๊ฐ ์ ์๋ ๋ค๋ฅธ ๋ ธ๋๋ค๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ์ ๊ธฐ๋กํ๋ค.
- ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ์ ๋ณด๊ณ ๊ฐ์ฅ ๊ฑฐ๋ฆฌ๊ฐ ์งง์ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋ค(visited์ ๊ธฐ๋ก).
- ํด๋น ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ ธ๋ ์ค ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋์ ๋ํด ํ์ฌ๊น์ง ๊ฑฐ๋ฆฌ + ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๊น์ง ๊ฑฐ๋ฆฌ๊ฐ ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ์ ๊ฑฐ๋ฆฌ๋ณด๋ค ์งง๋ค๋ฉด ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ์ ๊ฐฑ์ ํ๋ค.
- ๋ชจ๋ ๋ ธ๋์ ๋ฐฉ๋ฌธํ ๋๊น์ง 2 ์ 3 ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
์ ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ ๋ณต์ก๋๋ ์ฐ์ ์์ ํ
๋ฅผ ์ฌ์ฉํ๊ณ ํ์์ ๊บผ๋ธ ๊ฑฐ๋ฆฌ๋ณด๋ค ์ต๋จ๊ฑฐ๋ฆฌ ํ
์ด๋ธ์ ๊ฐ์ด ๋ ์๋ค๋ฉด ๋ฐฉ๋ฌธํ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ค. ์ฐ์ ์์ ํ
๋ฅผ ์ฌ์ฉํ ์๊ฐ ๋ณต์ก๋๋
import heapq
import sys
input = sys.stdin.readline
INF = int(1e9)
# ๋
ธ๋ ๊ฐ์, ๊ฐ์ ๊ฐ์ ์
๋ ฅ๋ฐ๊ธฐ
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 to_other in graph[now]:
cost = dist + to_other[1]
if distance[to_other[0]] > cost:
distance[to_other[0]] = cost
heapq.heappush(q, (cost, to_other[0]))
# ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ ์ํ
dijkstra(start)
# ๋ชจ๋ ๋
ธ๋๋ก ๊ฐ๊ธฐ ์ํ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅ
for i in range(1, n+1):
# ๋๋ฌํ ์ ์๋ ๊ฒฝ์ฐ, ๋ฌดํ์ผ๋ก ์ถ๋ ฅ
if distance[i] == INF:
print("INFINITY")
else:
print(distance[i])
๋ชจ๋ ์ง์ ์์ ๋ชจ๋ ์ง์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
A โ B ๋ฅผ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ ๋, ํน์ ๋ ธ๋ X ๋ฅผ ์ค๊ฐ์ ๊ฑฐ์ณ ๊ฐ๋ ๊ฐ๊ณผ ๊ธฐ์กด์ ์ต๋จ ๊ฒฝ๋ก ํ ์ด๋ธ ๊ฐ ์ค ์ด๋ ๊ฒ์ด ์งง์์ง ๋น๊ตํ๋ ๊ฒ์ด ํต์ฌ์ด๋ค. ์ด ๊ณผ์ ์์ X ๋ฅผ ๋ชจ๋ ๋ ธ๋๋ก ๋ฐ๊ฟ๊ฐ๋ฉฐ ์งํํ๋ฉด ๋๋ค.
๋ชจ๋ ๋
ธ๋์ ๋ํด ํด๋น ๋
ธ๋๋ฅผ ๊ฑฐ์ณ ๊ฐ๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ์ฐํ๋ฏ๋ก ํ๋ก์ด๋-์์
์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ ๋ณต์ก๋๋
๋ค์ต์คํธ๋ผ๊ฐ ๊ทธ๋ฆฌ๋ํ ๋ฐฉ์์ด์๋ค๋ฉด, ํ๋ก์ด๋-์์ ์ ์ ํ์์ ํตํด ํ ์ด๋ธ์ ๊ฐฑ์ ํ๊ธฐ ๋๋ฌธ์ DP ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ด๋ค.
INF = int(1e9) # ๋ฌดํ์ ์๋ฏธํ๋ ๊ฐ์ผ๋ก 10 ์ต์ ์ค์
# ๋
ธ๋์ ๊ฐ์ ๋ฐ ๊ฐ์ ์ ๊ฐ์๋ฅผ ์
๋ ฅ๋ฐ๊ธฐ
n = int(input())
m = int(input())
# 2 ์ฐจ์ ๋ฆฌ์คํธ (๊ทธ๋ํ ํํ) ๋ฅผ ๋ง๋ค๊ณ , ๋ชจ๋ ๊ฐ์ ๋ฌดํ์ผ๋ก ์ด๊ธฐํ
graph = [[INF] * (n+1) for _ in range(n+1)]
# ์๊ธฐ ์์ ์์ ์๊ธฐ ์์ ์ผ๋ก ๊ฐ๋ ๋น์ฉ์ 0 ์ผ๋ก ์ด๊ธฐํ
for i in range(1, n+1):
graph[i][i] = 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):
# ๋๋ฌํ ์ ์๋ ๊ฒฝ์ฐ, ๋ฌดํ์ผ๋ก ์ถ๋ ฅ
if graph[a][b] == INF:
print("INFINITY")
else:
print(graph[a][b], end = ' ')
print()
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ์ ์ด ์์์ธ ๊ฒฝ์ฐ ์์ ์ฌ์ดํด์ ๋น ์ง ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ ์ ์๋ค. ๋ฒจ๋ง ํฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ฉด ์์ ์ฌ์ดํด์ ์ฐพ์ ์ ์๋ค.
๊ธฐ๋ณธ์ ์ธ ๊ฐ๋
์ ๋ชจ๋ ์ฃ์ง๋ฅผ ๊ฑฐ์น๋ฉด์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ๋ ๊ฒ์ด๋ค. ์ด ์์
์ ๋ชจ๋ ๋
ธ๋์ ๋ํด ์งํํ๋ค. ์๊ฐ ๋ณต์ก๋๋
- ์ถ๋ฐ ๋ ธ๋๋ฅผ ์ค์ ํ๋ค.
- ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ์ ์ถ๋ฐ ๋ ธ๋๋ 0 ๋๋จธ์ง๋ INF ๋ก ์ด๊ธฐํํ๋ค.
- ๋ชจ๋
$E$ ๋ฅผ ํ์ธํ๋ฉฐ ํ ์ด๋ธ ๊ฐ๋ณด๋ค (ํ์ฌ ๋ ธ๋ ์ต๋จ๊ฑฐ๋ฆฌ + ํ์ฌ๋ ธ๋์์ ํด๋น ๋ ธ๋๋ก ๊ฐ๋ ๊ฑฐ๋ฆฌ)๊ฐ ์๋ค๋ฉด ํ ์ด๋ธ์ ๊ฐฑ์ ํ๋ ๊ฒ์$V-1$ ๋ฒ ๋ฐ๋ณตํ๋ค.
์ดํ ์์ ์ฌ์ดํด์ ํ์ธํ๊ธฐ ์ํด์๋ 3์ ๊ณผ์ ์ ํ ๋ฒ๋ง ๋ ์ํํ๋ค. ์ด ๋, ํ ์ด๋ธ์ด ๊ฐฑ์ ๋๋ค๋ฉด ์์ ์ฌ์ดํด์ด ์๋ ๊ฒ์ด๋ค.
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ์ต์ ์ ํด๋ฅผ ์ฐพ๋๋ฐ ๋นํด, ๋ฒจ๋ง ํฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ชจ๋ ๊ฐ์ ์ ๋ชจ๋ ๋ ธ๋ ๊ฐ์๋งํผ ๋ฐ๋ณตํ๋ ์ ์์ ๋นํจ์จ์ ์ด๋ค. ํ์ง๋ง ์์ ์ฌ์ดํด์ ์ฒ๋ฆฌํ ์ ์๋ ์ ์ด ํน์ง์ด๋ค.
import sys
input = sys.input.readline
INF = int(1e9)
def bf(start):
dist[start] = 0
for i in range(n):
for j in range(m):
cur = edges[j][0]
next_node = edges[j][1]
cost = edges[j][2]
if dist[cur] != INF and dist[next_node] > dist[cur] + cost:
dist[next_node] = dist[cur] + cost
if i == n - 1:
return True
return False
n, m = map(int, input().split())
edges = []
dist = [INF] * (n+1)
for _ in range(m):
a, b, c = map(int, input().split())
edges.append(a, b, c)
start = 1
negative_cycle = bf(start)
if negative_cycle:
print("negative cycle")
else:
for i in range(2, n+1):
if dist[i] == INF:
print("INF")
else:
print(dist[i])
- [Python] ์ต๋จ ๊ฒฝ๋ก - ๋ฒจ๋ง ํฌ๋(Bellman-Ford) ์๊ณ ๋ฆฌ์ฆ ๊ตฌํํ๊ธฐ - younge.log
- [์๊ณ ๋ฆฌ์ฆ] ๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ(Bellman-Ford Algorithm) - ๋ฅ๋ฌ๋ ๊ณต๋ถ๋ฐฉ
Spanning Tree
Spanning Tree(์ ์ฅ ํธ๋ฆฌ)๋ ๊ทธ๋ํ์์ ์ผ๋ถ ๊ฐ์ ์ ์ ํํด์ ๋ง๋ , ๊ทธ๋ํ ๋ด์ ๋ชจ๋ ์ ์ ์ ํฌํจํ๋ ํธ๋ฆฌ๋ฅผ ๋งํ๋ค.
Spanning Tree๋ ๊ทธ๋ํ์ ์ต์ ์ฐ๊ฒฐ ๋ถ๋ถ ๊ทธ๋ํ
์ด๋ค. ์ต์ ์ฐ๊ฒฐ
์ ์๋ฏธ๋ ๊ฐ์ ์ ์๊ฐ ๊ฐ์ฅ ์ ๋ค๋ ๊ฒ์ด๋ค. n๊ฐ์ ์ ์ ์ ๊ฐ์ง๋ ๊ทธ๋ํ๊ฐ ๋ชจ๋ ์ด์ด์ง๊ธฐ ์ํด์๋ ์ต์ (n-1)๊ฐ์ ๊ฐ์ ์ด ํ์ํ๋ค. n๊ฐ์ ๋
ธ๋๋ฅผ ๊ฐ์ง๋ ๊ทธ๋ํ์์ (n-1)๊ฐ์ ๊ฐ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์์ผ๋ฉด ํ์ฐ์ ์ผ๋ก ํธ๋ฆฌ ํํ๊ฐ ๋๊ณ , ์ด๋ฅผ spanning tree๋ผ๊ณ ๋ถ๋ฅธ๋ค. ๋ํ, ํธ๋ฆฌ ํ์์ ๋ง์กฑํด์ผํ๋ฏ๋ก ์ฌ์ดํด์ ํฌํจํด์๋ ์๋๋ค. DFS, BFS์ ํตํด ํ์ ๋์ค์ ์ฌ์ฉ๋ ๊ฐ์ ๋ง ๋ชจ์์ ์ด์ด์ฃผ๋ฉด, ๊ทธ๋ํ์์ ์ ์ฅ ํธ๋ฆฌ๋ฅผ ์ฐพ์ ์ ์๋ค. ํ๋์ ๊ทธ๋ํ์๋ ๋ง์ ์ ์ฅ ํธ๋ฆฌ๊ฐ ์กด์ฌํ ์ ์๋ค.
Minimum Spanning Tree
MST(Minimum Spanning Tree, ์ต์ ์ ์ฅ ํธ๋ฆฌ)๋ Spanning Tree ์ค์์ ์ฌ์ฉ๋ ๊ฐ์ ๋ค์ ๊ฐ์ค์น ํฉ์ด ์ต์์ธ ํธ๋ฆฌ๋ฅผ ๋งํ๋ค.
MST๋ ๊ฐ์ ์ ๊ฐ์ค์น๋ฅผ ๊ณ ๋ คํ์ฌ ์ต์ ๋น์ฉ์ Spanning Tree๋ฅผ ์ ํํ๋ ๊ฒ์ ๋งํ๋ค. ์ฆ, ๋คํธ์ํฌ(๊ฐ์ค์น๋ฅผ ๊ฐ์ ์ ํ ๋นํ ๊ทธ๋ํ)์ ์๋ ๋ชจ๋ ์ ์ ๋ค์ ๊ฐ์ฅ ์ ์ ์์ ๊ฐ์ ๊ณผ ๋น์ฉ์ผ๋ก ์ฐ๊ฒฐํ๋ ๊ฒ์ด๋ค. MST๋ ๊ฐ์ ์ ๊ฐ์ค์น์ ํฉ์ด ์ต์์ฌ์ผ ํ๋ค๋ ํน์ง์ด ์๋ค. ์ด ์ธ์๋ "n๊ฐ์ ์ ์ ์ ๊ฐ์ง๋ ๊ทธ๋ํ์ ๋ํด ๋ฐ๋์ (n-1)๊ฐ์ ๊ฐ์ ๋ง์ ์ฌ์ฉํด์ผ ํ๋ค"๊ฑฐ๋ "์ฌ์ดํด์ด ํฌํจ๋์ด์๋ ์๋๋ค"๋ ๋ฑ์ spanning tree์ ํน์ง๋ ํฌํจํ๋ค.
MST๋ฅผ ๊ตฌํํ๊ธฐ ์ํด์ Kruskal MST ์๊ณ ๋ฆฌ์ฆ
ํน์ Prim ์๊ณ ๋ฆฌ์ฆ
์ด ์ฌ์ฉ๋๋ค. ๊ทธ๋ํ ๋ด์ ์ ์ ์ซ์์ ๊ฐ์ ๋ง์ ๊ฐ์ง๋ ํฌ์ ๊ทธ๋ํ(Sparse Graph)
์ ๊ฒฝ์ฐ Kruskal ์๊ณ ๋ฆฌ์ฆ์ด ์ ํฉํ๊ณ , ๊ทธ๋ํ์ ๊ฐ์ ์ด ๋ง์ด ์กด์ฌํ๋ ๋ฐ์ง ๊ทธ๋ํ(Dense Graph)
์ ๊ฒฝ์ฐ๋ Prim ์๊ณ ๋ฆฌ์ฆ์ด ์ ํฉํ๋ค.
Prim ์๊ณ ๋ฆฌ์ฆ์ด๋ ์์ ์ ์ ์์๋ถํฐ ์ถ๋ฐํ์ฌ ์ ์ฅํธ๋ฆฌ ์งํฉ์ ๋จ๊ณ์ ์ผ๋ก ํ์ฅํด๋๊ฐ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ ์ ์ ํ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ฉฐ, ์ด์ ๋จ๊ณ์์ ๋ง๋ค์ด์ง ์ ์ฅ ํธ๋ฆฌ๋ฅผ ํ์ฅํ๋ฉด์ ๋์๊ฐ๋ ๋ฐฉ๋ฒ์ด๋ค. Prim ์๊ณ ๋ฆฌ์ฆ์ ๋์๋ฐฉ๋ฒ์ ์๋์ ๊ฐ๋ค.
- ์์ ๋จ๊ณ์์๋ ์์ ์ ์ ๋ง์ด MST(์ต์ ๋น์ฉ ์ ์ฅ ํธ๋ฆฌ) ์งํฉ์ ํฌํจ๋๋ค.
- ์ ๋จ๊ณ์์ ๋ง๋ค์ด์ง MST ์งํฉ์ ์ธ์ ํ ์ ์ ๋ค ์ค์์ ์ต์ ๊ฐ์ ์ผ๋ก ์ฐ๊ฒฐ๋ ์ ์ ์ ์ ํํ์ฌ ํธ๋ฆฌ๋ฅผ ํ์ฅํ๋ค.
- ์ฆ, ๊ฐ์ฅ ๋ฎ์ ๊ฐ์ค์น๋ฅผ ๋จผ์ ์ ํํ๋ค.
- ์์ ๊ณผ์ ์ ํธ๋ฆฌ๊ฐ (N-1)๊ฐ์ ๊ฐ์ ์ ๊ฐ์ง ๋๊น์ง ๋ฐ๋ณตํ๋ค.
Prim ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ ๋ณต์ก๋๋, ์ฃผ ๋ฐ๋ณต๋ฌธ์ด ์ ์ ์ ์ n๋งํผ ๋ฐ๋ณตํ๊ณ , ๋ด๋ถ ๋ฐ๋ณต๋ฌธ์ด n๋ฒ ๋ฐ๋ณต๋๋ฏ๋ก,
Prim ์๊ณ ๋ฆฌ์ฆ์ ์ํ ๋จ๊ณ
Kruskal ์๊ณ ๋ฆฌ์ฆ์ด๋ ๊ฐ์ ์ ํ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก, ์ด์ ๋จ๊ณ์์ ๋ง๋ค์ด์ง ์ ์ฅ ํธ๋ฆฌ์๋ ์๊ด์์ด ๋ฌด์กฐ๊ฑด ์ต์ ๊ฐ์ ๋ง์ ์ ํํ๋ ๋ฐฉ๋ฒ์ด๋ค. ๋งค ๋จ๊ณ๋ง๋ค ์ฌ์ดํด์ ๋ง๋ค์ง ์๋ ์ต์ ๊ฐ์ ์ ์ฑํํ๋ฉด ๋๋ค.
Kruskal ์๊ณ ๋ฆฌ์ฆ์ ํ์์ ์ธ ๋ฐฉ๋ฒ(greedy method)์ ์ด์ฉํ์ฌ, ๋คํธ์ํฌ(๊ฐ์ค์น๋ฅผ ๊ฐ์ ์ ํ ๋นํ ๊ทธ๋ํ)์ ๋ชจ๋ ์ ์ ์ ์ต์ ๋น์ฉ์ผ๋ก ์ฐ๊ฒฐํ๋ ์ต์ ํด๋ต์ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ด๋ค. MST(์ต์ ๋น์ฉ ์ ์ฅ ํธ๋ฆฌ)๊ฐ ์ต์ ๋น์ฉ์ ๊ฐ์ ์ผ๋ก ๊ตฌ์ฑ๋๋ฉฐ, ์ฌ์ดํด์ ํฌํจํ์ง ์๋๋ค๋ ์กฐ๊ฑด์ ๊ทผ๊ฑฐํ์ฌ, ์ต์ ํด๋ฅผ ๋ณด์ฅํ ์ ์๋ค. ๊ฐ ๋จ๊ณ์์ ์ฌ์ดํด์ ์ด๋ฃจ์ง ์๋ ์ต์ ๋น์ฉ ๊ฐ์ ์ ์ ํํ๋ฉด ๋๋ค.
์ฃผ์ํ ์ ์ ๋ค์ ๊ฐ์ ์ ์ด๋ฏธ ์ ํ๋ ๊ฐ์ ๋ค์ ์งํฉ
์ ์ถ๊ฐํ ๋ ์ฌ์ดํด์ ์์ฑํ๋์ง๋ฅผ ์ฒดํฌํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค. ์๋ก์ด ๊ฐ์ ์ด ์ด๋ฏธ ๋ค๋ฅธ ๊ฒฝ๋ก์ ์ํด ์ฐ๊ฒฐ๋์ด ์๋ ์ ์ ๋ค
์ ์ฐ๊ฒฐํ ๋ ์ฌ์ดํด์ด ํ์ฑ๋๋ค. ์ฆ, ์ถ๊ฐํ ์๋ก์ด ๊ฐ์ ์ ์๋ ์ ์ ์ด ๊ฐ์ ์งํฉ์ ์ํด ์์ผ๋ฉด, ์ฌ์ดํด์ด ํ์ฑ๋๋ค. ๋ฐ๋ผ์, ์ถ๊ฐํ๊ณ ์ ํ๋ ๊ฐ์ ์ ์๋ ์ ์ ์ด ๊ฐ์ ์งํฉ์ ์ํด ์๋์ง๋ฅผ ๋จผ์ ๊ฒ์ฌํด์ผ ํ๊ณ , ์ด๋ union-find ์๊ณ ๋ฆฌ์ฆ
์ ์ฌ์ฉํ์ฌ ๊ฒ์ฌํ ์ ์๋ค.
Kruskal ์๊ณ ๋ฆฌ์ฆ์ ๋์๋ฐฉ๋ฒ์ ์๋์ ๊ฐ๋ค.
- ๊ทธ๋ํ์ ๊ฐ์ ๋ค์ ๊ฐ์ค์น์ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ค.
- ์ ๋ ฌ๋ ๊ฐ์ ๋ฆฌ์คํธ์์ ์์๋๋ก ์ฌ์ดํด์ ํ์ฑํ์ง ์๋ ๊ฐ์ ์ ์ ํํ๋ค.
- ์ฆ, ๊ฐ์ฅ ๋ฎ์ ๊ฐ์ค์น๋ฅผ ๋จผ์ ์ ํํ๋ค.
- ์ฌ์ดํด์ ํ์ฑํ๋ ๊ฐ์ ์ ์ ์ธํ๋ค.
- ํด๋น ๊ฐ์ ์ ํ์ฌ์ MST(์ต์ ๋น์ฉ ์ ์ฅ ํธ๋ฆฌ)์ ์งํฉ์ ์ถ๊ฐํ๋ค.
Kruskal ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ ๋ณต์ก๋๋
Kruskal ์๊ณ ๋ฆฌ์ฆ ์ํ ๋จ๊ณ
์ ๋์จ-ํ์ธ๋(Union-find)
ํน์ ์๋ก์ ์งํฉ(Disjoint Sets)
์๋ฃ๊ตฌ์กฐ๋ ์๋ก์ ๋ถ๋ถ ์งํฉ๋ค๋ก ๋๋ ์ง ์์๋ค์ ๋ํ ์ ๋ณด๋ฅผ ๋ค๋ฃจ๋ ์๋ฃ๊ตฌ์กฐ์ด๋ค. ์ ๋์จ-ํ์ธ๋ ์๋ฃ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ด ํฉ์งํฉ(Union)๊ณผ ์ฐพ๊ธฐ(Find) ์ฐ์ฐ์ ์ ๊ณตํ๋ค.
- ํฉ์งํฉ(Union): ๋ ๊ฐ์ ์งํฉ์ ํ๋์ ์งํฉ์ผ๋ก ํฉ์น๋ค.
- ์๋ก ์ฐ๊ฒฐํ ๋ ๋ ธ๋ A, B๊ฐ ์๋ค๊ณ ํ ๋, A์ B์ ๋ฃจํธ ๋ ธ๋์ธ A'๊ณผ B'์ ์ฐพ๋๋ค.
- A'์ B'์ ๋ถ๋ชจ ๋ ธ๋๋ก ํน์ B'์ A'์ ๋ถ๋ชจ ๋ ธ๋๋ก ์ค์ ํ๋ค.
- ์ฐพ๊ธฐ(Find): ๋ ธ๋๊ฐ ์ํ ์งํฉ์ ๋ฐํํ๋ค.
๊ตฌํ ๋ฐฉ๋ฒ์ ๊ฐ์ ๋ ์๋ก์ ์งํฉ ์๊ณ ๋ฆฌ์ฆ (๊ฒฝ๋ก ์์ถ) - ์ด๊ฒ์ด ์ทจ์ ์ ์ํ ์ฝ๋ฉํ ์คํธ๋ค ๊ตฌํ ์ฝ๋๋ฅผ ์ฐธ๊ณ !
์ ๋์จ-ํ์ธ๋ ์๋ฃ๊ตฌ์กฐ์ ํ์ฉ
์ ๋์จ-ํ์ธ๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํด ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ ๋ด์์์ ์ฌ์ดํด์ ํ๋ณํ ์ ์๋ค. ํฉ์งํฉ ์ฐ์ฐ์ ๊ทธ๋ํ์ ๊ฐ์ ์ผ๋ก ๋์๋๋ค๊ณ ํ ๋, ๋ค์๊ณผ ๊ฐ์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ฌ์ดํด์ ํ๋ณํ ์ ์๋ค.
- ๊ฐ์ ์ผ๋ก ์ฐ๊ฒฐ๋ ๋ ๋ ธ๋์ ๋ฃจํธ ๋ ธ๋๋ฅผ ํ์ธํ๋ค.
- ๋ง์ฝ ๋ฃจํธ ๋ ธ๋๊ฐ ์๋ก ๋ค๋ฅด๋ค๋ฉด ํฉ์งํฉ ์ฐ์ฐ์ ์ํํ๋ค.
- ๋ง์ฝ ๋ฃจํธ ๋ ธ๋๊ฐ ๊ฐ๋ค๋ฉด ์ฌ์ดํด์ด ๋ฐ์ํ๋ค๊ณ ํ๋จํ๋ค.
๊ตฌํ ๋ฐฉ๋ฒ์ ์๋ก์ ์งํฉ์ ํ์ฉํ ์ฌ์ดํด ํ๋ณ - ์ด๊ฒ์ด ์ทจ์ ์ ์ํ ์ฝ๋ฉํ ์คํธ๋ค ๊ตฌํ ์ฝ๋๋ฅผ ์ฐธ๊ณ !
- ์๋ก์ ์งํฉ ์๋ฃ ๊ตฌ์กฐ - ์ํค๋ฐฑ๊ณผ
- Chapter 10. ๊ทธ๋ํ ์ด๋ก - ์ด๊ฒ์ด ์ทจ์ ์ ์ํ ์ฝ๋ฉํ ์คํธ๋ค
์์ ์ ๋ ฌ(Topological Sort)
๋ ๋ฐฉํฅ ๊ทธ๋ํ์ ๋ชจ๋ ๋
ธ๋๋ฅผ ์ ํ ์์๋ฅผ ์งํค๋ฉฐ ์ ์ ์ ์์๋๋ก ๋์ดํ๋ ๊ฒ์ด๋ค. ์์ ์ ๋ ฌ์ ๋ํ์ ์ธ ์๋ก ๋ํ๊ต ์ ์๊ณผ๋ชฉ์ด ์๋ค. ์์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ์ง์ ์ฐจ์๊ฐ 0์ธ ๋ ธ๋๋ฅผ ํ์ ๋ฃ๋๋ค.
- ํ๊ฐ ๋น ๋๊ฐ์ง ๋ค์์ ๋ฐ๋ณตํ๋ค.
- ํ์์ ์์๋ฅผ ๊บผ๋ด ํด๋น ๋ ธ๋์์ ์ถ๋ฐํ๋ ๊ฐ์ ์ ๊ทธ๋ํ์์ ์ ๊ฑฐํ๋ค.
- ์๋กญ๊ฒ ์ง์ ์ฐจ์๊ฐ 0์ด ๋ ๋ ธ๋๋ฅผ ํ์ ๋ฃ๋๋ค.
๋ง์ฝ ๋ชจ๋ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๊ธฐ ์ ์ ํ๊ฐ ๋น๋ค๋ฉด ์ฌ์ดํด์ด ์กด์ฌํ๋ค๊ณ ํ๋จํ ์ ์๋ค. ์๋ํ๋ฉด ์ฌ์ดํด์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ ์ฌ์ดํด์ ํ์ฑํ๋ ๋ ธ๋๋ค์ ์ง์ ์ฐจ์๊ฐ ํญ์ 1 ์ด์์ด๋ฏ๋ก ํ์ ๋ฃ์ ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ตฌํ ๋ฐฉ๋ฒ์ ์์ ์ ๋ ฌ - ์ด๊ฒ์ด ์ทจ์ ์ ์ํ ์ฝ๋ฉํ ์คํธ๋ค ๊ตฌํ ์ฝ๋๋ฅผ ์ฐธ๊ณ !
๐ก ์ง์ ์ฐจ์(degree)
๋ ธ๋์ ๊ด์ ์์ ๋ค์ด์ค๋ ๊ฐ์ ์ ๊ฐ์๋ฅผ ์ง์ ์ฐจ์(degree)๋ผ๊ณ ํ๋ค.