[Algorithm] Sorting

Updated:

๐Ÿ“ฃ
๋ณธ ํฌ์ŠคํŠธ๋Š” โ€˜์ด๊ฒƒ์ด ์ทจ์—…์„ ์œ„ํ•œ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค 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)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š”๋‹ค.

image

๊ณ„์ˆ˜ ์ •๋ ฌ

๊ณ„์ˆ˜ ์ •๋ ฌ(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)์„ ๋ณด์žฅํ•œ๋‹ค.

ํ‰๊ท  ์‹œ๊ฐ„๋ณต์žก๋„

image

3๊ฐ€์ง€ ์ •๋ ฌ ๋ฌธ์ œ ์œ ํ˜•

  1. ์ •๋ ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ
  2. ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์›๋ฆฌ์— ๋Œ€ํ•ด์„œ ๋ฌผ์–ด๋ณด๋Š” ๋ฌธ์ œ
  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))

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ