[์ ๋ ฌ] 7. ํ ์ด๋ ์ดํดํ๋ ๊ธฐ์ ์ ๋ ฌ(radix sort)
๊ธฐ์ ์ ๋ ฌ
: ์ฃผ์ด์ง ์ ๋ค๊ฐ์ ๋น๊ต๋ฅผ ํ์ง ์๊ณ ๋ฒํท์ ์ฌ์ฉํด ์ ๋ ฌํ๋ ๋ฐฉ๋ฒ์ผ๋ก,
๋ฎ์ ์๋ฆฌ(1์ ์๋ฆฌ)์์ ๋์ ์๋ฆฌ(10^n ์๋ฆฌ) ์์ผ๋ก ๋ฒํท์ ๋ฃ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ ๋ ฌํ๋ค.
์ค์ ๋ก ์ซ์๋ค ๊ฐ์ ๋น๊ต๋ฅผ ํตํด ์ ๋ ฌ์ ํ๋ ๊ฒ์ด ์๋, 0~9๊น์ง์ ๋ฒํท์ด ์๊ณ ์ด ๋ฒํท์ ์ซ์๋ฅผ ๋ฃ์ด๊ฐ๋ฉฐ ๋ถ๋ฅํ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.
์๊ฐ๋ณต์ก๋
O(r*n) : r์ ์ซ์์ ์๋ฆฟ์, n์ ์ ๋ ฌ๋ ์์ ๊ฐฏ์
ํน์ง
1. ์๊ฐ ๋ณต์ก๋์์ ์์ฒญ๋ ์ด์ ์ ๊ฐ๋๋ค. ๋ฌด๋ ค O(N)..
2. ํ์ง๋ง ๊ทธ๋งํผ ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ง์ด ํ์ํ๋ค.
[153, 262, 37, 598, 433, 855]๋ฅผ ๊ธฐ์ ์ ๋ ฌ์ ์ด์ฉํด ์ ๋ ฌํด๋ณด์.
๊ฐ์ฅ ๋ฎ์ 1๋ฒ์งธ ์๋ฆฌ๋ถํฐ(1์ ์๋ฆฌ) ๊ฐ์ฅ ๋์ 3๋ฒ์งธ ์๋ฆฌ(100์ ์๋ฆฌ) ์์ผ๋ก ์ ๋ ฌํ๋ค.
๋ค์๊ณผ ๊ฐ์ด 0~9 ๊น์ง ๋ฒํท๋ค์ด ์๋ฆฟ์ ๋ณ๋ก ์๊ณ , ํด๋นํ๋ ์๋ฆฟ์์ ๋ง๊ฒ ๋ฒํท์ ๋ด๊ฒ๋๋ค.
1์ ์๋ฆฌ ์ ๋ ฌ 10์ ์๋ฆฌ ์ ๋ ฌ 100์ ์๋ฆฌ ์ ๋ ฌ
๊ฒฐ๊ณผ์ ์ผ๋ก [37, 153, 262, 433, 598, 855] ๋ก ์ ๋ ฌ๋๋ ๋ชจ์ต์ ๋ณผ ์ ์๋ค.
์์์ ์ฐธ๊ณ ํด์ ์ดํดํ๋ฉด ์ด์ ์๋ฒฝํ ์ดํด๊ฐ ๊ฐ ๊ฒ์ด๋ค.
์์์ ์ค๋ช ํ์๋ฉด,
1์ ์๋ฆฌ ๋ฒํท์ ์๋ค์ ๋ด๊ณ -> ๋ฒํท์ ๋ด๊ธด ์์๋๋ก ๊บผ๋ด์จ๋ค. (1์ ์๋ฆฌ๋ก ์ ๋ ฌ)
์ด ๊บผ๋ด์จ ๊ฒ์ ์ด๋ฒ์ 10์ ์๋ฆฌ ๋ฒํท์ ์๋ค์ ๋ด๊ณ -> ๋ฒํท์ ๋ด๊ธด ์์๋๋ก ๊บผ๋ด์จ๋ค. (10์ ์๋ฆฌ๋ก ์ ๋ ฌ)
์ด ๊บผ๋ด์จ ๊ฒ์ ๋ง์ง๋ง์ผ๋ก 100์ ์๋ฆฌ ๋ฒํท์ ์๋ค์ ๋ด๊ณ -> ๋ฒํท์ ๋ด๊ธด ์์๋๋ก ๊บผ๋ด์จ๋ค. (100์ ์๋ฆฌ๋ก ์ ๋ ฌ)
๊ธฐ์ ์ ๋ ฌ Python ์ฝ๋๋ฅผ ์ดํด๋ณด์.
from collections import deque
def radixSort():
nums = list(map(int, input().split(' ')))
buckets = [deque() for _ in range(10)]
max_val = max(nums)
queue = deque(nums)
digit = 1 # ์๋ฆฟ์
while (max_val >= digit): # ๊ฐ์ฅ ํฐ ์์ ์๋ฆฟ์์ผ ๋ ๊น์ง๋ง ์คํ
while queue:
num = queue.popleft()
buckets[(num // digit) % 10].append(num) # ๊ฐ ์๋ฆฌ์ ์(0~9)์ ๋ฐ๋ผ ๋ฒํท์ num์ ๋ฃ๋๋ค.
# ํด๋น ์๋ฆฟ์์์ ๋ฒํท์ ๋ค ๋ฃ์์ผ๋ฉด, ๋ฒํท์ ๋ด๊ฒจ์๋ ์์๋๋ก ๊บผ๋ด์ ์ ๋ ฌํ๋ค.
for bucket in buckets:
while bucket:
queue.append(bucket.popleft())
print(digit,"์ ์๋ฆฟ ์ ์ ๋ ฌ: ", list(queue))
digit *= 10 # ์๋ฆฟ์ ์ฆ๊ฐ์ํค๊ธฐ
print(list(queue))
์ ๋ ฅ๊ณผ ์ถ๋ ฅ