์ ๋ ฌ์ด๋ ์ฃผ์ด์ง ๋ฐ์ดํฐ๋ฅผ ํน์ ๊ธฐ์ค์ ๋ฐ๋ผ ์์๋๋ก ๋์ดํ์ฌ ์ฌ๋ฐฐ์นํ๋ ๊ฒ์ ๋งํ๋ค.
์ ๋ ฌ๋ ๋ฐฐ์ด์์ ์ํ๋ ๊ฐ์ ํ์ํ๋ ์ด์ง ํ์(Binary Search)๋ฅผ ์ํด์๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์ ์์๋์ด์ผ ํ๋ค.
1. ์ ํ ์ ๋ ฌ
๐ ๊ฐ์ฅ ์์ ๋ฐ์ดํฐ๋ฅผ ์ ํํด ๋งจ ์์ ์๋ ๋ฐ์ดํฐ์ ๊ตํํ๋ ๊ณผ์ ์ ๋ฐ๋ณต
swap(๋ฆฌ์คํธ์์ ๋ ์์์ ์์น๋ฅผ ๋ณ๊ฒฝํ๋ ์์ )์ ์ด์ฉํ๋ฉด ์ ํ์ ๋ ฌ์ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ค.
arr = [4,3,1,7,2,8,6,5]
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 # ์ด์ ๋ถํฐ ๊ทธ ์์์ ์ธ๋ฑ์ค๊ฐ ๊ฐ์ฅ ์์ ์์์ ์ธ๋ฑ์ค
arr[i], arr[min_index] = arr[min_index], arr[i] # swap
๐ ์ ํ ์ ๋ ฌ์ ์๊ฐ ๋ณต์ก๋: O(N^2)
→ ํ์ ๋ฒ์๊ฐ N์์ 1์ฉ ์ค์ด๋ค๊ธฐ ๋๋ฌธ์, ์๋ ์์์ ๋ฐ๋ฅธ๋ค.
2. ์ฝ์ ์ ๋ ฌ
๐ ํน์ ํ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ์ ์ ํ ์์น์ ์ฝ์ ํ๋ค.
arr = [4,3,1,7,2,8,6,5]
for i in range(1, len(arr)):
for j in range(i, 0, -1) # ์ธ๋ฑ์ค i๋ถํฐ 1๊น์ง ๊ฐ์ํ์ฌ ๋ฐ๋ณตํ๋ ์์ด(=ํ ์นธ์ฉ ์ผ์ชฝ์ผ๋ก ์ด๋)
if arr[j] < arr[j-1]: # ๋๋ณด๋ค ํฐ ๋ฐ์ดํฐ๋ฅผ ๋ง๋๋ฉด
arr[j], arr[j-1] = arr[j-1], arr[j] # ๋ง๋ ๋ฐ์ดํฐ๋ ์์น ๋ณ๊ฒฝ
else: # ๋๋ณด๋ค ์์ ๋ฐ์ดํฐ๋ฅผ ๋ง๋๋ฉด ๋ฉ์ถค
break
๐ ์ฝ์ ์ ๋ ฌ์ ์๊ฐ ๋ณต์ก๋: O(N^2)
โป ์ ๋ ฌํด์ผํ๋ ๋ฆฌ์คํธ๊ฐ ๊ฑฐ์ ์ ๋ ฌ๋์ด์๋ ์ํ: O(N) → ์ด ๊ฒฝ์ฐ์๋ ํต์ ๋ ฌ๋ณด๋ค ์ฝ์ ์ ๋ ฌ์ ํจ๊ณผ ๊ฐ๋ ฅ
3. ํต ์ ๋ ฌ
๐ ํผ๋ฒ(๊ธฐ์ค์ด ๋๋ ๋ฐ์ดํฐ)๋ฅผ ์ค์ ํ๊ณ ๊ทธ ๊ธฐ์ค๋ณด๋ค ํฐ ๋ฐ์ดํฐ์ ์์ ๋ฐ์ดํฐ์ ์์น๋ฅผ ๋ฐ๊พผ๋ค.
โป ํธ์ด ๋ถํ ๋ฐฉ์์ ํต ์ ๋ ฌ → ๋ฆฌ์คํธ์์ ์ฒซ ๋ฒ์งธ ๋ฐ์ดํฐ๋ฅผ ํผ๋ฒ์ผ๋ก ๊ฒฐ์
(1) ์ผ์ชฝ์์๋ถํฐ ํผ๋ฒ๋ณด๋ค ํฐ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ณ , ์ค๋ฅธ์ชฝ์์๋ถํฐ ํผ๋ฒ๋ณด๋ค ์์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋๋ค.
(2) ์์ชฝ์์ ์ฐพ์๋ค๋ฉด ๋ ๋ฐ์ดํฐ์ ์์น๋ฅผ ์๋ก ๋ณ๊ฒฝํ๋ค.
(3) ์ผ์ชฝ์์ ์ฐพ๋ ๊ฐ๊ณผ ์ค๋ฅธ์ชฝ์์๋ถํฐ ์ฐพ๋ ๊ฐ์ ์์น๊ฐ ์๊ฐ๋ ธ๋ค๋ฉด(์์ ์ฐธ๊ณ ) ๋ ์ค ์์ ๋ฐ์ดํฐ์ ํผ๋ฒ์ ์์น๋ฅผ ๋ณ๊ฒฝํ๋ค.
(4) ์ด๋ํ ํผ๋ฒ์ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ ๋ฆฌ์คํธ์ ์ค๋ฅธ์ชฝ ๋ฆฌ์คํธ๊ฐ ๋๋๋ค. ๊ฐ๊ฐ ํต ์ ๋ ฌ์ ๋ค์ ์ํํด์ค๋ค.
(5) ํ์ฌ ๋ฆฌ์คํธ์ ๋ฐ์ดํฐ ๊ฐ์๊ฐ 1๊ฐ๋ฉด ํต ์ ๋ ฌ์ด ์ข ๋ฃ๋๋ค.
Case1.
arr = [4,3,1,7,2,8,6,5]
def quick_sort(arr, start, end):
if start >= end:
return
pivot = start # ์ฒซ ๋ฒ์งธ ์์๋ฅผ ํผ๋ฒ์ผ๋ก ์ค์
left = start + 1 # ์ผ์ชฝ์์๋ถํฐ ๊ณ ๊ณ
right = end # ์ค๋ฅธ์ชฝ์์๋ถํฐ ๊ณ ๊ณ
while left <= right: # ํ์ดํ ์๊ฐ๋ฆฌ์ง ์๋ ๋์
# left๊ฐ ๋์ ๋ฟ์ง ์๊ณ left ์์๊ฐ ํผ๋ด๋ณด๋ค ์์ผ๋ฉด keep going
while left <= end and arr[left] <= arr[pivot]:
left += 1 # ํผ๋ด๋ณด๋ค ํฐ ์์๋ฅผ ์ฐพ์์ผ ํ๊ธฐ๋๋ฌธ์ ๊ณ์ ์ค๋ฅธ์ชฝ์ผ๋ก ๊ณ์ ์ด๋
# left๊ฐ start์ ๋ฟ์ง ์๊ณ right ์์๊ฐ ํผ๋ด๋ณด๋ค ํฌ๋ฉด keep going
while right > start and arr[right] >= arr[pivot]:
right -= 1 # ํผ๋ด๋ณด๋ค ์์ ์์๋ฅผ ์ฐพ์์ผ ํ๊ธฐ ๋๋ฌธ์ ๊ณ์์ผ์ชฝ์ผ๋ก ๊ณ์ ์ด๋
if left > right: # ์๊ฐ๋ ธ๋ค๋ฉด ์์ ๋ฐ์ดํฐ์ ํผ๋ฒ ์์น ๊ตํ
arr[right], arr[pivot] = arr[pivot], arr[right]
else: # ์๊ฐ๋ฆฌ์ง ์์๋ค๋ฉด ์์ ๋ฐ์ดํฐ์ ํฐ ๋ฐ์ดํฐ ๊ต์ฒด
arr[left], arr[right] = arr[right], arr[left]
# right๊ฐ ์ด์ (์ )ํผ๋ด์ด๋ฏ๋ก right๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ค์ ์ํ
quick_sort(arr, start, right - 1)
quick_sort(arr, right + 1, end)
quick_sort(arr, 0, len(arr)-1)
Case2.
arr = [4,3,1,7,2,8,6,5]
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[0]
tail = arr[1:] # ํผ๋ฒ์ ์ ์ธํ ๋ฆฌ์คํธ
left_arr = [x for x in tail if x <= pivot] # ๋ถํ ๋ ์ผ์ชฝ ๋ถ๋ถ -> ํผ๋ด๋ณด๋ค ์์ ์์๋ค
right_arr = [x for x in tail if x > pivot] # ๋ถํ ๋ ์ค๋ฅธ์ชฝ ๋ถ๋ถ -> ํผ๋ด๋ณด๋ค ํฐ ์์๋ค
return quick_sort(left_arr) + [pivot] + quick_sort(right_arr)
quick_sort(arr)
๐ ํต ์ ๋ ฌ์ ์๊ฐ ๋ณต์ก๋: O(NlogN)
โป ์ต์ ์ ๊ฒฝ์ฐ ์๊ฐ ๋ณต์ก๋ O(N^2)
→ ํผ๋ฒ์ ๋ฆฌ์คํธ์ ๊ฐ์ฅ ์ผ์ชฝ ๋ฐ์ดํฐ๋ก ์ ํ ๋ ์ด๋ฏธ ๋ฆฌ์คํธ๊ฐ ์ ๋ ฌ๋์ด ์๋ ๊ฒฝ์ฐ (์ฝ์ ์ ๋ ฌ๊ณผ ๋ฐ๋๋ก ๋์)
4. ๊ณ์ ์ ๋ ฌ
๐ ๋ฐ์ดํฐ์ ํฌ๊ธฐ ๋ฒ์๊ฐ ์ ํ๋์ด ์ ์ ํํ๋ก ํํํ ์ ์์ ๋, ๋ณ๋์ ๋ฆฌ์คํธ๋ฅผ ์ ์ธํด ๋ฐ์ดํฐ์ ๊ฐ์๋ฅผ ๋ด์ ์ ๋ ฌ์ ์ฌ์ฉํ๋ค.
arr = [4,3,1,2,3,2,1,2,0]
count = [0] * (max(arr) + 1)
for i in range(len(arr)):
count[arr[i]] += 1
for i in range(len(count)):
for j in range(count[i]):
print(i, end=' '))
๐ ๊ณ์ ์ ๋ ฌ์ ์๊ฐ ๋ณต์ก๋: O(N+K) ๋ณด์ฅ → ๋ฐ์ดํฐ์ ๊ฐ์: N, ๋ฐ์ดํฐ ์ค ์ต๋๊ฐ์ ํฌ๊ธฐ: K
๐ ๊ณ์ ์ ๋ ฌ์ ๊ณต๊ฐ ๋ณต์ก๋: O(N+K) → ๋ฐ์ดํฐ์ ๊ฐ์: N, ๋ฐ์ดํฐ ์ค ์ต๋๊ฐ์ ํฌ๊ธฐ: K
→ ๋ฐ์ดํฐ๊ฐ 0๊ณผ 999,999 ๋จ 2๊ฐ์ผ ๊ฒฝ์ฐ ์ฌ๊ฐํ ๋นํจ์จ์ฑ ์ด๋
→ ๋์ผํ ๊ฐ์ ๊ฐ์ง๋ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ฌ ๊ฐ ๋ฑ์ฅํ ๋ ํจ์จ์
5. ํ์ด์ฌ์ ์ ๋ ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
ํ์ด์ฌ์ ๋ด์ฅ ํจ์์ธ sort()๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ์๊ฐ ๋ณต์ก๋ O(NlogN) ๋ณด์ฅ
โป ๋ณธ ๊ฒ์๊ธ์ ์ด๊ฒ์ด ์ทจ์ ์ ์ํ ์ฝ๋ฉํ ์คํธ๋ค with ํ์ด์ฌ์ ์ฐธ๊ณ ํ์ฌ ๊ตฌํํ์์ต๋๋ค.
'๐ฅ CS > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Algorithm] ํ | ์ต๋ ํ, ์ต์ ํ (0) | 2022.02.23 |
---|---|
[Algorithm] DFS & BFS | ๊ทธ๋ํ ํ์ (0) | 2021.08.14 |
[Algorithm] ์๋ผํ ์คํ ๋ค์ค์ ์ฒด | ์์ ์ฐพ๊ธฐ (2) | 2021.08.01 |
[Algorithm] ์ด์ง ํ์ | Binary Search (0) | 2021.07.31 |
[Algorithm] ๋์ ํ๋ก๊ทธ๋๋ฐ | Dynamic Programming (DP) (0) | 2021.07.11 |