์นด์ดํ ์ ๋ ฌ(Counting Sort)
๊ณผ์
๋ฐฐ์ด์ ์กด์ฌํ๋ ์์ ๊ฐ์๋ฅผ ์ธ์ด์, ์ด๋ฅผ ๋ฐํ์ผ๋ก ์ ๋ ฌ์ ์ํํ๋ค.
1.๋ฐฐ์ด์ ์กด์ฌํ๋ ๊ฐ ๊ฐ์ ๊ฐฏ์๋ฅผ ์ ์ฅํ๋ count ๋ณ์๋ฅผ ์์ฑํ๋ค.
์๋ฅผ๋ค์ด count[1]=4
๋ผ๋ฉด ๋ฐฐ์ด์๋ 1
์ ๊ฐ์ด 4๊ฐ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
- count๋ ๋ฐฐ์ด ์์์ ์ต๋๊ฐ๊น์ง๋ฅผ ์ธ๋ฑ์ค๋ก ์ฌ์ฉํ๋ค.
arr = [4, 7, 9, 1, 3, 5, 2, 3, 4]
cnt = [0] * (max(arr) + 1)
for num in arr:
cnt[num] += 1
print(cnt)
# [0, 1, 1, 2, 2, 1, 0, 1, 0, 1]
2. count๋ฐฐ์ด์ ๋์ ํฉ์ผ๋ก ๊ณ์ฐํ์ฌ ๊ฐฑ์ ํ์ฌ ์ค๋ค.
๋์ ํฉ์ผ๋ก ๊ฐฑ์ ํ๋ ์ด์ ๋ ๋ฆฌํด ํ ์ ๋ ฌ๋ ๋ฐฐ์ด answer
์ ์ ์ ํ ์์น์ ์ฝ์
ํ๊ธฐ ์ํจ์ด๋ค.
์๋ฅผ๋ค์ด cnt=[0,1,2,4,6]
์ด๋ผ๊ณ ํ์.
cnt[3]=4 ์ธ๋ฐ, ์ด๋ฅผ ์ด์ฉํ๋ฉด 3์ด ์ ๋ ฌ ๋์์ ๋ 4๋ฒ์งธ์ ์์นํ๋ค๋๊ฒ์ ์ ์ ์๋ค.
for i in range(1,len(cnt)):
cnt[i]+=cnt[i-1]
print(cnt)
# [0, 1, 2, 4, 6, 7, 7, 8, 8, 9]
3. cnt๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ ฌ๋ ๋ฐฐ์ด result๋ฅผ ์์ฑํ๋ค.
๋ฐฐ์ด result๋ arr๊ณผ ๋๊ฐ์ ํฌ๊ธฐ๋ก ์์ฑํ๋ค.
๊ทธ๋ฆฌ๊ณ cnt๋ฅผ ์ฌ์ฉํ์ฌ result์ ์ฌ๋ฐ๋ฅธ ์์น์ arr์ ๊ฐ์ ์ฝ์
ํ๋ค.
์ฌ๊ธฐ์ idx=cnt[i]-1๋ก ํ๋ ์ด์ ๋ ์ธ๋ฑ์ค๋ 0๋ฒ ๋ถํฐ ์์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ซ์ ํ๋๋ฅผ result์ ์ ์ ํ ์ฝ์
ํ์๋ค๋ฉด, cnt์ ๊ฐฏ์๋ ํ๋ ์ค์ฌ์ค๋ค.
result=[0]*len(arr)
for i in arr:
idx=cnt[i]-1
rest[idx]=i
cnt[i]-=1
print(result)
# [1, 2, 3, 3, 4, 4, 5, 7, 9]
์๊ฐ๋ณต์ก๋
O(n + k)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
์ฌ๊ธฐ์ k๋ ์ ๋ ฌํ ๋ฐฐ์ด์ ๊ฐ์ฅ ํฐ ๊ฐ์ ์๋ฏธํ๋ค.
k์ ๋ฐ๋ผ ์๊ฐ๋ณต์ก๋์ ์ํฅ์ ๋ฏธ์น๊ธฐ ๋๋ฌธ์ k๊ฐ ๋จ์ ์์๋ก ์ทจ๊ธ๋์ด ์๋ฝ๋์ง ์๊ณ ๋จ์์๋ ๊ฒ์ด๋ค.
k๊ฐ n๋ณด๋ค ์๋ค๋ฉด O(n)์ด์ง๋ง, k๊ฐ ๋งค์ฐํฌ๋ค๋ฉด ์๊ฐ๋ณต์ก๋๋ O(k)๊ฐ ๋ ๊ฒ์ด๋ค.
๋จ์
์ ๋ ฌํ๊ณ ์ ํ๋ ๋ฐฐ์ด์ ์ต๋๊ฐ์ด ๋งค์ฐ ํด ๋ cnt๋ฐฐ์ด์ ๊ทธ ํฌ๊ธฐ๋งํผ ์์ฑํด์ผ ํ๊ธฐ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋นํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๊ฒ ๋๋ค.
๋ํ cnt๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ ํตํด arr๋ฐฐ์ด ์์์ ๊ฐฏ์๋ฅผ ์ธ์ด์ฃผ๊ธฐ ๋๋ฌธ์ arr์ ์์๊ฐ ์ค ์์๊ฐ ์๋ค๋ฉด ์ฌ์ฉ ํ ์ ์๋ค.
์ ์ฒด์ฝ๋
def counting_sort(arr):
cnt=[0]*(max(arr)+1)
result=[0]*len(arr)
for i in arr:
cnt[i]+=1
for i in range(1,len(cnt)):
cnt[i]+=cnt[i-1]
for i in arr:
idx=cnt[i]-1
result[idx]=i
cnt[i]-=1
return result
'๐์ฝ๋ฉํ ์คํธ:CodingTest' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ]์ต๋ ๊ณต์ฝ์(GCD) ์๊ณ ๋ฆฌ์ฆ - ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ (0) | 2023.06.19 |
---|---|
[์๊ณ ๋ฆฌ์ฆ]๋ณํฉ ์ ๋ ฌ(Merge Sort) (0) | 2023.06.19 |
[์๊ณ ๋ฆฌ์ฆ]์๊ฐ๋ณต์ก๋ (0) | 2023.06.19 |
[์๊ณ ๋ฆฌ์ฆ]Recursion ์์ฉ(๋ฏธ๋ก์ฐพ๊ธฐ) (0) | 2023.06.19 |
[์๊ณ ๋ฆฌ์ฆ]Recursion ๊ฐ๋ (0) | 2023.05.03 |