์ด๋ฒ ํฌ์คํ ์์๋ ๊ธฐ์ ์ ๋ ฌ์ ๋ํด ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค. ๊ธฐ์ ์ ๋ ฌ์ ์ซ์๋ ๋ฌธ์์ด์ ํจ์จ์ ์ผ๋ก ์ ๋ ฌํ ์ ์๋ ๊ฐ๋ ฅํ ์๊ณ ๋ฆฌ์ฆ ์ค ํ๋์ ๋๋ค. ์ด ๊ธ์์๋ ๊ธฐ์ ์ ๋ ฌ์ ๊ธฐ๋ณธ ๊ฐ๋ ๋ถํฐ ํ์ด์ฌ์ผ๋ก ๊ตฌํํ๋ ๋ฐฉ๋ฒ๊น์ง ๋จ๊ณ๋ณ๋ก ์ค๋ช ํ๊ฒ ์ต๋๋ค. ๊ธฐ์ ์ ๋ ฌ์ ์ฅ๋จ์ ๊ณผ ์ฑ๋ฅ ๋ถ์, ๊ทธ๋ฆฌ๊ณ ์์ ์ฝ๋๋ฅผ ํตํด ์ฌ๋ฌ๋ถ์ด ์ฝ๊ฒ ์ดํดํ ์ ์๋๋ก ๋์๋๋ฆด ๊ฒ์ ๋๋ค.
โฃ ๋ชฉ์ฐจ
01. ๊ธฐ์ ์ ๋ ฌ์ด๋ ๋ฌด์์ธ๊ฐ?๐
๊ธฐ์ ์ ๋ ฌ(Radix Sort)์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ์ค ํ๋๋ก, ๋ฐ์ดํฐ๋ฅผ ์๋ฆฟ์ ๋ณ๋ก ๋น๊ตํ์ฌ ์ ๋ ฌํ๋ ๋ฐฉ์์ ๋๋ค. ๊ธฐ์ ์ ๋ ฌ์ ํนํ ์ซ์๋ ๋ฌธ์์ด์ ์ ๋ ฌ์ ํจ๊ณผ์ ์ด๋ฉฐ, ์์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ถ๋ฅ๋ฉ๋๋ค. ์ด๋ ๊ฐ์ ๊ฐ์ด ์ฌ๋ฌ ๊ฐ ์์ ๋ ๊ทธ ๊ฐ๋ค์ ์๋์ ์ธ ์์๊ฐ ๋ณํ์ง ์๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
02. ๊ธฐ์ ์ ๋ ฌ์ ์๋ฆฌ๐
๊ธฐ์ ์ ๋ ฌ์ ์๋ฆฌ์๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฌ๋ฌ ๊ฐ์ ๋ฒํท์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌํฉ๋๋ค. ๊ฐ ์๋ฆฟ์์ ํด๋นํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ ํ ๋ฒํท์ ๋ฐฐ๋ถํ๊ณ , ์ด ๋ฒํท๋ค์ ํ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํฉ๋๋ค. ์ดํ ๋ฒํท์ ๋ฐ์ดํฐ๋ฅผ ์์๋๋ก ๋ค์ ๋ชจ์ ์ ๋ ฌ์ ์๋ฃํฉ๋๋ค.
๋จ๊ณ๋ณ ๊ณผ์
- ์ต์ ์๋ฆฌ์๋ถํฐ ์ ๋ ฌ: ๋จผ์ ๊ฐ์ฅ ์์ ์๋ฆฟ์(1์ ์๋ฆฌ)๋ถํฐ ์์ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌํฉ๋๋ค.
- ๋ค์ ์๋ฆฌ์๋ก ์ด๋: ๊ทธ ๋ค์ ์๋ฆฟ์(10์ ์๋ฆฌ)๋ก ์ด๋ํ์ฌ ๋ค์ ์ ๋ ฌํฉ๋๋ค.
- ์ต๋ ์๋ฆฌ์๊น์ง ๋ฐ๋ณต: ์ต๋ ์๋ฆฌ์๊น์ง ์ด ๊ณผ์ ์ ๋ฐ๋ณตํฉ๋๋ค.
๊ฐ ๋จ๊ณ์์ ๋ฐ์ดํฐ๋ 0๋ถํฐ 9๊น์ง์ ๋ฒํท(ํ)์ผ๋ก ๋ฐฐ๋ถ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, 1์ ์๋ฆฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๊ฐ ์ ๋ ฌ๋๋ฉด, ๋ค์์ผ๋ก 10์ ์๋ฆฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฒํท์ ๋ค์ ๋ฐฐ๋ถํฉ๋๋ค.
ํ ์๋ฃ ๊ตฌ์กฐ์ ๋ํ ๋ด์ฉ์ ์๋ ํฌ์คํ
์ ์ฐธ๊ณ ํด ์ฃผ์ธ์๐
03. ๊ธฐ์ ์ ๋ ฌ์ ์ฅ์ ๊ณผ ๋จ์ โ๏ธ
๊ธฐ์ ์ ๋ ฌ์ ๋ค์๊ณผ ๊ฐ์ ์ฅ์ ๊ณผ ๋จ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
์ฅ์
- ๋น ๋ฅธ ์๋: ๊ธฐ์ ์ ๋ ฌ์ ์ ํ ์๊ฐ ๋ณต์ก๋(O(nk))๋ฅผ ๊ฐ์ง๋ฏ๋ก, ๋ฐ์ดํฐ์ ํฌ๊ธฐ์ ์๊ด์์ด ์ผ์ ํ ์๋๋ก ์ ๋ ฌํ ์ ์์ต๋๋ค.
- ์์ ์ ๋ ฌ: ๋์ผํ ๊ฐ์ ์์๊ฐ ์ ์ง๋๋ฏ๋ก ์์ ์ ๋ ฌ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋จ์
- ๊ณต๊ฐ ๋ณต์ก๋: ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ํฐ ๋ฐ์ดํฐ ์งํฉ์์๋ ๋นํจ์จ์ ์ผ ์ ์์ต๋๋ค.
- ์๋ฃํ ์ ํ: ์ซ์๋ ๋ฌธ์์ด ๋ฑ ํน์ ์๋ฃํ์๋ง ์ ์ฉํ ์ ์์ต๋๋ค. (ํ๊ธ, ํ์, ์ค์ ์๋ฃํ์ ๋ถ๊ฐ)
04. ํ์ด์ฌ์ผ๋ก ๊ตฌํํ๊ธฐ๐
from collections import deque # deque๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ฅผ ๊ตฌํ
def radix_sort(arr):
# ๊ฐ์ฅ ํฐ ์ซ์๋ฅผ ์ฐพ์ ์ต๋ ์๋ฆฟ์๋ฅผ ๊ณ์ฐ
max1 = max(arr)
exp = 1 # ์๋ฆฌ์๋ฅผ ์๋ฏธํ๋ ๋ณ์, ์ด๊ธฐ๊ฐ์ 1 (1์ ์๋ฆฌ)
# ์ต๋ ์๋ฆฟ์๋งํผ ์ ๋ ฌ ๋ฐ๋ณต
while max1 // exp > 0:
# 0-9๊น์ง์ ํ ๋ฆฌ์คํธ ์์ฑ
buckets = [deque() for _ in range(10)]
# ํ์ฌ ์๋ฆฟ์์ ๋ฐ๋ผ ๋ฒํท์ ๋ฐ์ดํฐ ๋ฐฐ๋ถ
for num in arr:
index = (num // exp) % 10 # ํ์ฌ ์๋ฆฟ์์ ํด๋นํ๋ ์ซ์ ์ถ์ถ
buckets[index].append(num) # ํด๋น ์ซ์์ ๋ง๋ ๋ฒํท์ ๋ฐ์ดํฐ ์ถ๊ฐ
# ๋ฒํท์ ๋ด๊ธด ๋ฐ์ดํฐ๋ฅผ ์ฐจ๋ก๋๋ก ๋ฐฐ์ด์ ๋ค์ ์ ์ฅ
i = 0
for bucket in buckets:
while bucket:
arr[i] = bucket.popleft() # ๋ฒํท์์ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด ๋ฐฐ์ด์ ์ ์ฅ
i += 1
exp *= 10 # ๋ค์ ์๋ฆฌ์๋ก ์ด๋ (1 -> 10 -> 100 ...)
# ์์ ์ฌ์ฉ
arr = [170, 45, 75, 90, 802, 24, 2, 66]
radix_sort(arr)
print("์ ๋ ฌ๋ ๋ฐฐ์ด:", arr)
1. ๋ชจ๋ ์ํฌํธ
from collections import deque
- deque ๋ชจ๋์ ์ฌ์ฉํ์ฌ ํ๋ฅผ ๊ตฌํํฉ๋๋ค. ํ๋ FIFO(First In First Out) ๊ตฌ์กฐ๋ก, ๊ธฐ์ ์ ๋ ฌ์์ ๊ฐ ์๋ฆฟ์๋ณ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฒํท์ ์ ์ฅํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
2. radix_sort ํจ์
def radix_sort(arr):
- radix_sort ํจ์๋ ๋ฐฐ์ด arr์ ์ ๋ ฅ๋ฐ์ ๊ธฐ์ ์ ๋ ฌ์ ์ํํฉ๋๋ค.
3. ์ต๋ ์๋ฆฟ์ ๊ณ์ฐ
max1 = max(arr)
exp = 1 # ์๋ฆฌ์๋ฅผ ์๋ฏธํ๋ ๋ณ์, ์ด๊ธฐ๊ฐ์ 1 (1์ ์๋ฆฌ)
- ๋ฐฐ์ด์์ ๊ฐ์ฅ ํฐ ์ซ์๋ฅผ ์ฐพ์ ๊ทธ ์ซ์์ ์ต๋ ์๋ฆฟ์๋ฅผ ๊ณ์ฐํฉ๋๋ค. exp๋ ํ์ฌ ์ ๋ ฌํ ์๋ฆฟ์๋ฅผ ์๋ฏธํ๋ฉฐ, ์ด๊ธฐ๊ฐ์ 1๋ก ์ค์ ํ์ฌ 1์ ์๋ฆฌ๋ถํฐ ์์ํฉ๋๋ค.
4. ์๋ฆฟ์๋ณ ์ ๋ ฌ ๋ฐ๋ณต
while max1 // exp > 0:
buckets = [deque() for _ in range(10)]
- ์ต๋ ์๋ฆฟ์๊น์ง ๋ฐ๋ณตํฉ๋๋ค. ๊ฐ ๋ฐ๋ณต๋ง๋ค 0๋ถํฐ 9๊น์ง์ ๋ฒํท(ํ) ๋ฆฌ์คํธ๋ฅผ ์์ฑํฉ๋๋ค.
5. ๋ฒํท์ ๋ฐ์ดํฐ ๋ฐฐ๋ถ
for num in arr:
index = (num // exp) % 10
buckets[index].append(num)
- ํ์ฌ ์๋ฆฟ์์ ๋ฐ๋ผ ๊ฐ ์ซ์๋ฅผ ์ ์ ํ ๋ฒํท์ ๋ฐฐ๋ถํฉ๋๋ค. ์๋ฅผ ๋ค์ด, num์ด 170์ด๊ณ exp๊ฐ 1์ผ ๋, index๋ 0์ด ๋์ด 0๋ฒ์งธ ๋ฒํท์ 170์ ์ถ๊ฐํฉ๋๋ค.
6. ๋ฐฐ์ด์ ๋ฐ์ดํฐ ์ฌ์ ์ฅ
i = 0
for bucket in buckets:
while bucket:
arr[i] = bucket.popleft()
i += 1
- ๋ฒํท์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด ์๋ ๋ฐฐ์ด์ ๋ค์ ์ ์ฅํฉ๋๋ค. ๊ฐ ๋ฒํท์์ ๋ฐ์ดํฐ๋ฅผ popleftํ์ฌ ๋ฐฐ์ด์ ์์๋๋ก ๋ฃ์ต๋๋ค.
7. ๋ค์ ์๋ฆฌ์๋ก ์ด๋
exp *= 10
- exp๋ฅผ 10๋ฐฐ๋ก ์ฆ๊ฐ์์ผ ๋ค์ ์๋ฆฟ์๋ก ์ด๋ํฉ๋๋ค. (1์ ์๋ฆฌ -> 10์ ์๋ฆฌ -> 100์ ์๋ฆฌ...)
8. ์์ ์ฌ์ฉ
arr = [170, 45, 75, 90, 802, 24, 2, 66]
radix_sort(arr)
print("์ ๋ ฌ๋ ๋ฐฐ์ด:", arr)
- radix_sort ํจ์๋ฅผ ํธ์ถํ์ฌ ๋ฐฐ์ด์ ์ ๋ ฌํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
05. ์ฑ๋ฅ ๋ถ์ ๋ฐ ๋น๊ต๐
์๊ฐ ๋ณต์ก๋
- ์ต์
์ ๊ฒฝ์ฐ ์๊ฐ ๋ณต์ก๋: O(d * (n + k))
- d: ์๋ฆฟ์์ ์ต๋ ๊ฐ์
- n: ์ ๋ ฌํ ์์์ ๊ฐ์
- k: ์๋ฆฟ์ ๊ฐ์ ๋ฒ์ (์: 10์ง์์ ๊ฒฝ์ฐ k=10) - ํ๊ท ์๊ฐ ๋ณต์ก๋: O(d * n)
- ์ต์ ์ ๊ฒฝ์ฐ ์๊ฐ ๋ณต์ก๋: O(d * n)
๊ณต๊ฐ ๋ณต์ก๋
- ๊ธฐ์ ์ ๋ ฌ์ ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์๋ก ํฉ๋๋ค. ์ฃผ๋ก ๊ฐ ์๋ฆฟ์๋ณ๋ก ๋ฐ์ดํฐ๋ฅผ ์์๋ก ์ ์ฅํ ๋ฐฐ์ด์ ์ฌ์ฉํ๋ฏ๋ก, O(n + k)์ ๊ณต๊ฐ์ ์ฌ์ฉํฉ๋๋ค.
- ๋ํ, ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์์ ํ์ง ์์ผ๋ฏ๋ก ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
์์ ์ฑ
- ๊ธฐ์ ์ ๋ ฌ์ ์์ ์ ์ธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค. ์ฆ, ๊ฐ์ ํค๋ฅผ ๊ฐ์ง ์์๋ค์ด ์๋์ ์์๋ฅผ ์ ์งํฉ๋๋ค. ์ด ํน์ฑ์ ํน์ ๊ฒฝ์ฐ์ ์ ์ฉํ ์ ์์ต๋๋ค.
์ ํฉ์ฑ
- ๊ธฐ์ ์ ๋ ฌ์ ์ฃผ๋ก ์ ์๋ ๊ณ ์ ๊ธธ์ด์ ๋ฌธ์์ด ์ ๋ ฌ์ ์ ํฉํฉ๋๋ค.
- ์๋ฆฟ์์ ๋ฒ์๊ฐ ์๊ณ ์๋ฆฟ์๊ฐ ์๋์ ์ผ๋ก ์ ์ ๊ฒฝ์ฐ์ ํนํ ํจ๊ณผ์ ์ ๋๋ค.