[Algorithm] Sorting
๐ฃ
๋ณธ ํฌ์คํธ๋ โ์ด๊ฒ์ด ์ทจ์
์ ์ํ ์ฝ๋ฉ ํ
์คํธ๋ค with ํ์ด์ฌโ์ ๊ณต๋ถํ๊ณ ์์ฑํ์์ต๋๋ค :)
click > (์ด์ฝํ
2021) ์ด๊ฒ์ด ์ทจ์
์ ์ํ ์ฝ๋ฉ ํ
์คํธ๋ค with ํ์ด์ฌ
Sorting
์ด๋ก
์ ๋ ฌ(sorting)์ด๋ ๋ฐ์ดํฐ๋ฅผ ํน์ ํ ๊ธฐ์ค์ ๋ฐ๋ผ์ ์์๋๋ก ๋์ดํ๋ ๊ฒ์ด๋ค. ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๋ํ์ ์ผ๋ก ์ ํ์ ๋ ฌ, ์ฝ์ ์ ๋ ฌ, ํต ์ ๋ ฌ, ๊ณ์ ์ ๋ ฌ์ด ์๋ค.
์ ํ์ ๋ ฌ
๊ฐ์ฅ ์์ ๋ฐ์ดํฐ๋ฅผ ๋งจ ์์ ๋ฐ์ดํฐ์ ๋ฐ๊พธ๊ณ , ๊ทธ ๋ค์ ๋ฐ์ดํฐ๋ฅผ ์ ํํด ์์์ ๋ ๋ฒ์งธ ๋ฐ์ดํฐ์ ๋ฐ๊พธ๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ค
[์์ 6-1] ์ ํ์ ๋ ฌ
# ์ ํ ์ ๋ ฌ
array = [7,5,9,0,3,1,6,2,4,8]
for i in range(len(array)):
min_index = i
for j in range(i + 1, len(array)):
if array[min_index] > array[j]:
min_index = j
array[i], array[min_index] = array[min_index], array[i] # swap
print(array)
์๊ฐ๋ณต์ก๋
์ ํ์ ๋ ฌ์ (N-1)๋ฒ ๋งํผ ๊ฐ์ฅ ์์ ์๋ฅผ ์ฐพ์์ ๋งจ ์์ผ๋ก ๋ณด๋ด์ผ ํ๊ณ , ๊ฐ์ฅ ์์ ์๋ฅผ ์ฐพ์ ๋๋ง๋ค ๋น๊ต ์ฐ์ฐ์ด ํ์ํ๋ค. ์ด์ ์ ํ ์ ๋ ฌ์ ์ฐ์ฐ ํ์๋ N + (N - 1) + (N - 2) + โฆ + 2 = N (N + 1) / 2 = O(N^2) ๋ผ๊ณ ํ ์ ์๋ค.
์ฝ์ ์ ๋ ฌ
๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ํ์ธํ๋ฉด์, ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ์ ํ ์์น์ ์ฝ์ ํ๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์ ํ ์ ๋ ฌ๋ณด๋ค ์คํ ์๊ฐ ์ธก๋ฉด์์ ๋ ํจ์จ์ ์ด๋ฉฐ, ํนํ ๋ฐ์ดํฐ๊ฐ ๊ฑฐ์ ์ ๋ ฌ๋์ด ์์ ๋ ํจ์ฌ ํจ์จ์ ์ด๋ค.
[์์ 6-2] ์ฝ์ ์ ๋ ฌ
# ์ฝ์
์ ๋ ฌ
array = [7,5,9,0,3,1,6,2,4,8]
for i in range(1, len(array)):
for j in range(i, 0, -1): # ์ธ๋ฑ์ค i๋ถํฐ 1๊น์ง ๊ฐ์
if array[j] < array[j - 1]: # ํ ์นธ์ฉ ์ผ์ชฝ์ผ๋ก ์ด๋
array[j], array[j - 1] = array[j - 1], array[j]
else: # ์์ ๋ณด๋ค ์์ ๋ฐ์ดํฐ๋ฅผ ๋ง๋๋ฉด ๋ฉ์ถค
break
print(array)
์๊ฐ๋ณต์ก๋
์ ํ ์ ๋ ฌ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฐ๋ณต๋ฌธ์ด 2๋ฒ ์ค์ฒฉ๋์ด ์ฌ์ฉ๋์๊ธฐ ๋๋ฌธ์ O(N^2)์ด๋ค. ํ์ง๋ง ์ต์ ์ ๊ฒฝ์ฐ์๋ O(N)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค. ๋ณดํต์ ํต ์ ๋ ฌ๋ณด๋ค ๋นํจ์จ์ ์ด์ง๋ง ๊ฑฐ์ ์ ๋ ฌ์ด ๋์ด ์๋ค๋ฉด ์ฝ์ ์ ๋ ฌ์ด ๋ ํจ์จ์ ์ด๋ค.
ํต ์ ๋ ฌ
ํต ์ ๋ ฌ์ ๊ธฐ์ค ๋ฐ์ดํฐ๋ฅผ ์ค์ ํ๊ณ ๊ทธ ๊ธฐ์ค๋ณด๋ค ํฐ ๋ฐ์ดํฐ์ ์์ ๋ฐ์ดํฐ์ ์์น๋ฅผ ๋ฐ๊พธ์ด ์ ๋ ฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ์ค์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์ด๋ ๊ธฐ์ค์ด ๋๋ ๋ฐ์ดํฐ๋ฅผ ํผ๋ฒ(pivot)์ด๋ผ๊ณ ํ๋ค.
[์์ 6-3] ํต ์ ๋ ฌ
# ํต ์ ๋ ฌ
array = [7,5,9,0,3,1,6,2,4,8]
def quick_sort(array, start, end):
if start >= end: # ์์๊ฐ 1๊ฐ์ธ ๊ฒฝ์ฐ ์ข
๋ฃ
return
pivot = start # ํผ๋ฒ์ ์ฒซ ๋ฒ์งธ ์์
left = start + 1
right = end
while left <= right:
# ํผ๋ฒ๋ณด๋ค ํฐ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ๋๊น์ง ๋ฐ๋ณต
while left <= end and array[left] <= array[pivot]:
left += 1
# ํผ๋ฒ๋ณด๋ค ์์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ๋๊น์ง ๋ฐ๋ณต
while right > start and array[right] >= array[pivot]:
right -= 1
if left > right: # ์๊ฐ๋ ธ๋ค๋ฉด ์์ ๋ฐ์ดํฐ์ ํผ๋ฒ์ ๊ต์ฒด
array[right], array[pivot] = array[pivot], array[right]
else: # ์๊ฐ๋ฆฌ์ง ์์๋ค๋ฉด ์์ ๋ฐ์ดํฐ์ ํฐ ๋ฐ์ดํฐ๋ฅผ ๊ต์ฒด
array[left], array[right] = array[right], array[left]
# ๋ถํ ์ดํ ์ผ์ชฝ ๋ถ๋ถ๊ณผ ์ค๋ฅธ์ชฝ ๋ถ๋ถ์์ ๊ฐ๊ฐ ์ ๋ ฌ ์ํ
quick_sort(array, start, right - 1)
quick_sort(array, right + 1, end)
quick_sort(array, 0, len(array) - 1)
print(array)
์๊ฐ๋ณต์ก๋
ํต ์ ๋ ฌ์ ํ๊ท ์๊ฐ ๋ณต์ก๋๋ O(NlogN)์ด๋ค. ์ต์ ์ ๊ฒฝ์ฐ๋ ๋ฐ์ดํฐ๊ฐ ์ ๋ ฌ์ด ๊ฑฐ์ ๋์ด ์๊ณ ๊ฐ์ฅ ์ผ์ชฝ ๋ฐ์ดํฐ๋ฅผ ๋น๋ฒ์ผ๋ก ์ผ๋ ๊ฒฝ์ฐ๋ก O(N^2)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ๋๋ค.
๊ณ์ ์ ๋ ฌ
๊ณ์ ์ ๋ ฌ(Count Sort)๋ ํน์ ํ ์กฐ๊ฑด์ด ๋ถํฉํ ๋๋ง ์ฌ์ฉํ ์ ์์ง๋ง ๋งค์ฐ ๋น ๋ฅธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ๊ณ์ ์ ๋ ฌ์ โ๋ฐ์ดํฐ์ ํฌ๊ธฐ ๋ฒ์๊ฐ ์ ํ๋์ด ์ ์ ํํ๋ก ํํํ ์ ์์ ๋โ + โ๋ฐ์ดํฐ๊ฐ ๋ง์ด ์ค๋ณต๋์ด ์์ ๋โ ์ฌ์ฉํ๋ค.
๊ณ์ ์ ๋ ฌ์ ์์ ๋ค๋ฃฌ 3๊ฐ์ง ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ฒ๋ผ ๋ฐ์ดํฐ์ ๊ฐ์ ๋น๊ตํ์ฌ ์์น๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฐฉ์์ด ์๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ณ๋์ ๋ฆฌ์คํธ๋ฅผ ์ ์ธํ๊ณ ๊ทธ ์์ ์ ๋ ฌ์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๋๋ค.
์๋ฅผ ๋ค์ด [7,5,9,0,3,1,6,2,9,1,4,8,0,5,2] ๊ฐ ์์ผ๋ฉด ๋จผ์ ๊ฐ์ฅ ํฐ ๋ฐ์ดํฐ(9)์ ๊ฐ์ฅ ์์ ๋ฐ์ดํฐ(0)์ ๋ฒ์๊ฐ ๋ชจ๋ ๋ด๊ธธ ์ ์๋๋ก ํฌ๊ธฐ๊ฐ 10์ธ ๋ฆฌ์คํธ๋ฅผ 0์ผ๋ก ์ด๊ธฐํํ์ฌ ์์ฑํ๋ค. ๊ทธ ๋ค์ ๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ํ์ธํ๋ฉด์ ๋ฐ์ดํฐ์ ๊ฐ๊ณผ ๋์ผํ ์ธ๋ฑ์ค์ ๋ฐ์ดํฐ๋ฅผ 1์ฉ ์ฆ๊ฐ์ํค๋ฉด ๋๋ค. ๊ทธ ๋ค์ ๋ฆฌ์คํธ๋ฅผ ์ฒซ๋ฒ์งธ ์ธ๋ฑ์ค๋ถํฐ ๊ทธ ์ธ๋ฑ์ค์ ๊ฐ๋งํผ ์ถ๋ ฅํ๋ฉด ๋๋ค.
[์์ 6-5] ๊ณ์ ์ ๋ ฌ
# ๋ชจ๋ ์์์ ๊ฐ์ด 0๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๋ค๊ณ ๊ฐ์
array = [7,5,9,0,3,1,6,2,9,1,4,8,0,5,2]
# ๋ชจ๋ ๋ฒ์๋ฅผ ํฌํจํ๋ ๋ฆฌ์คํธ ์ ์ธ(๋ชจ๋ ๊ฐ์ 0์ผ๋ก ์ด๊ธฐํ)
count = [0] * (max(array) + 1)
for i in range(len(array)):
count[array[i]] += 1
for i in range(len(count)):
for j in range(count[i]):
print(i, end=" ")
์๊ฐ๋ณต์ก๋
๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์์ ์ ์์ด๊ณ ๋ฐ์ดํฐ์ ๊ฐ์๊ฐ N, ๋ฐ์ดํฐ ์ค ์ต๋๊ฐ์ด K์ผ ๋, ๊ณ์ ์ ๋ ฌ์ ์ต์ ์ ๊ฒฝ์ฐ์๋ ์ํ ์๊ฐ O(N+K)๋ฅผ ๋ณด์ฅํ๋ค.
ํ์ด์ฌ์ ์ ๋ ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
sorted()
: ๋ณํฉ ์ ๋ ฌ์ ๊ธฐ๋ฐ์ ๋ง๋ค์ด์ก๋ค. ์ผ๋ฐ์ ์ผ๋ก ํต ์ ๋ ฌ๋ณด๋ค ๋๋ฆฌ์ง๋ง ์ต์
์ ๊ฒฝ์ฐ์๋ ์๊ฐ๋ณต์ก๋ O(NlogN)์ ๋ณด์ฅํ๋ค.
ํ๊ท ์๊ฐ๋ณต์ก๋
3๊ฐ์ง ์ ๋ ฌ ๋ฌธ์ ์ ํ
- ์ ๋ ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ํ ์ ์๋ ๋ฌธ์
- ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์๋ฆฌ์ ๋ํด์ ๋ฌผ์ด๋ณด๋ ๋ฌธ์
- ๋ ๋น ๋ฅธ ์ ๋ ฌ์ด ํ์ํ ๋ฌธ์
์ค์ ๋ฌธ์
[์ค์ ๋ฌธ์ 1] ์์์ ์๋๋ก
N = int(input())
arr = []
for i in range(N):
arr.append(int(input()))
arr.sort(reverse=True)
print(arr)
[์ค์ ๋ฌธ์ 2] ์ฑ์ ์ด ๋ฎ์ ์์๋ก ํ์ ์ถ๋ ฅํ๊ธฐ
N = int(input())
arr = []
for i in range(N):
arr.append(input().split())
arr.sort(key=lambda x : int(x[1]))
for i in range(N):
print(arr[i][0], end=" ")
[์ค์ ๋ฌธ์ 3] ๋ ๋ฐฐ์ด์ ์์ ๊ต์ฒด
N, K = map(int, input().split())
A = list(map(int, input().split()))
B = list(map(int, input().split()))
A.sort()
B.sort(reverse=True)
for i in range(K):
if A[i] < B[i]:
A[i], B[i] = B[i], A[i]
else:
break
print(sum(A))
๋๊ธ๋จ๊ธฐ๊ธฐ