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
  • ์‹œ๊ฐ„ ๋ณต์žก๋„ : O(N^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):
        if array[j] > array[j-1]:
            array[j], array[j-1] = array[j-1], array[j] # swap
        else: break
  • ์‹œ๊ฐ„ ๋ณต์žก๋„ : O(N^2) -> ์ตœ์„ ์˜ ๊ฒฝ์šฐ O(N)

ํ€ต ์ •๋ ฌ

  • ๊ธฐ์ค€์„ ์„ค์ •ํ•œ ํ›„ ๋‹ค์Œ ํฐ ์ˆ˜์™€ ์ž‘์€ ์ˆ˜๋ฅผ ๊ตํ™˜ํ•œ ํ›„ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ํ€ต ์ •๋ ฌ์—์„œ๋Š” ํ”ผ๋ด‡(pivot)์ด ์‚ฌ์šฉ๋จ => ๊ตํ™˜ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ์ค€
  1. ๋ฆฌ์ŠคํŠธ์—์„œ ์ฒซ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๋ฅผ ํ”ผ๋ด‡์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
  2. ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ์—์„œ ์ด๋™ํ•˜๋ฉด์„œ ๋‘ ์ˆ˜๋ฅผ ๋น„๊ตํ•œ ํ›„ ํ”ผ๋ด‡๋ณด๋‹ค ํฐ ์ˆ˜๋Š” ์˜ค๋ฅธ์ชฝ, ์ž‘์€ ์ˆ˜๋Š” ์™ผ์ชฝ์— ๋‘”๋‹ค.
  3. ๋‘ ๊ฐ’์ด ์—‡๊ฐˆ๋ฆด ๋•Œ๋Š” ์ž‘์€ ๋ฐ์ดํ„ฐ์™€ ํ”ผ๋ด‡์˜ ์œ„์น˜๋ฅผ ์„œ๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.
  4. ๋ฆฌ์ŠคํŠธ์˜ ๊ฐœ์ˆ˜๊ฐ€ 1์ด ๋  ๋•Œ๊นŒ์ง€ ์œ„ ๋ฐฉ์‹์„ ๋ฐ˜๋ณตํ•œ๋‹ค.
array = [5, 7, 9, 0, 3, 1, 6, 2, 4, 8]

def quick_sort(array, start, end):
    if start >= end: 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]:
            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)
array = [5, 7, 9, 0, 3, 1, 6, 2, 4, 8]

def quick_sort(array):
    if len(array) <= 1:
        return array
    
    pivot = array[0] # ํ”ผ๋ด‡์€ ์ฒซ ๋ฒˆ์งธ ์›์†Œ
    tail = array[1:] # ํ”ผ๋ด‡์„ ์ œ์™ธํ•œ ๋ฆฌ์ŠคํŠธ

    left_side = [x for x in tail if x <= pivot]
    right_side = [x for x in tail if x > pivot]

    return quick_sort(left_side) + [pivot] + quick_sort(right_side)

print(quick_sort(array))
  • ํ€ต ์ •๋ ฌ์˜ ํ‰๊ท  ์‹œ๊ฐ„๋ณต์žก๋„ : O(NlogN) => ์ตœ์•…์˜ ๊ฒฝ์šฐ O(N^2)
  • ์ด๋ฏธ ๋ฐ์ดํ„ฐ๊ฐ€ ์ •๋ ฌ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋งค์šฐ ๋Š๋ฆฌ๊ฒŒ ๋™์ž‘ (์‚ฝ์ž… ์ •๋ ฌ๊ณผ ๋ฐ˜๋Œ€)
  • ํŒŒ์ด์ฌ์˜ ๊ธฐ๋ณธ ์ •๋ ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” O(NlogN)์„ ๋ณด์žฅํ•œ๋‹ค.

๊ณ„์ˆ˜ ์ •๋ ฌ

  • ๋ณ„๋„์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์„ ์–ธํ•˜๊ณ  ๊ทธ ์•ˆ์— ์ •๋ ฌ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๋Š”๋‹ค๋Š” ํŠน์ง•
  • ํŠน์ •ํ•œ ์กฐ๊ฑด์ด ๋ถ€ํ•ฉํ•  ๋•Œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋‚˜ ๋งค์šฐ ๋น ๋ฅธ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๊ฐ€ N, ๋ฐ์ดํ„ฐ ์ค‘ ์ตœ๋Œ“๊ฐ’์ด K์ผ ๋•Œ, ์ตœ์•…์˜ ๊ฒฝ์šฐ์—๋„ O(N+K)๋ฅผ ๋ณด์žฅํ•œ๋‹ค.
  • ๋‹จ, ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ ๋ฒ”์œ„๊ฐ€ ์ œํ•œ ๋˜์–ด ์ •์ˆ˜ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์„๋•Œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์ง์ ‘ ๋ฐ์ดํ„ฐ์˜ ๊ฐ’์„ ๋น„๊ตํ•œ ๋’ค์— ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉฐ ์ •๋ ฌํ•˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹ˆ๋‹ค.
  1. ๋จผ์ € ๊ฐ€์žฅ ํฐ ๋ฐ์ดํ„ฐ์™€ ์ž‘์€ ๋ฐ์ดํ„ฐ์˜ ๋ฒ”์œ„๊ฐ€ ๋ชจ๋‘ ๋‹ด๊ธธ ์ˆ˜ ์žˆ๋Š” ํ•˜๋‚˜์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  2. ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์”ฉ ํ™•์ธํ•˜๋ฉฐ ๋ฐ์ดํ„ฐ์˜ ๊ฐ’๊ณผ ๋™์ผํ•œ ์ธ๋ฑ์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ 1์”ฉ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
  3. ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ ๊ฐ’๋งŒํผ ์ธ๋ฑ์Šค๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
array = [5, 7, 9, 0, 3, 1, 6, 2, 4, 8]
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=' ')
  • ์‹œ๊ฐ„ ๋ณต์žก๋„ : O(N+K)
  • ํ˜„์กดํ•˜๋Š” ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘์—์„œ ๊ธฐ์ˆ˜ ์ •๋ ฌ๊ณผ ๋”๋ถˆ์–ด ๊ฐ€์žฅ ๋น ๋ฆ„
  • ๊ณต๊ฐ„ ๋ณต์žก๋„ : O(N+K)
  • ๋ฆฌ์ŠคํŠธ์˜ ํฌ๊ธฐ๊ฐ€ 100๋งŒ์„ ๋„˜์ง€ ์•Š์„ ๋•Œ๊ฐ€ ์ข‹๋‹ค.

ํŒŒ์ด์ฌ์˜ ์ •๋ ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • ๊ธฐ๋ณธ ์ •๋ ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ : sorted() ํ•จ์ˆ˜, ๋ฆฌ์ŠคํŠธ๋ฆฌ ๋”•์…”๋„ˆ๋ฆฌ ๋“ฑ์„ ์ž…๋ ฅ๋ฐ›์•„์„œ ๋ฆฌ์ŠคํŠธ๋กœ ๋ฐ˜ํ™˜ํ•จ
  • ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ
    1. ์ •๋ ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ
    2. ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์›๋ฆฌ์— ๋Œ€ํ•ด ๋ฌผ์–ด๋ณด๋Š” ๋ฌธ์ œ : ์—ฌ๋Ÿฌ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์›๋ฆฌ๋ฅผ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค
    3. ๋” ๋น ๋ฅธ ์ •๋ ฌ์ด ํ•„์š”ํ•œ ๋ฌธ์ œ : ๊ธฐ์กด ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ตฌ์กฐ์  ๊ฐœ์„  ํ•„์š”

2. ์œ„์—์„œ ์•„๋ž˜๋กœ

๋‚œ์ด๋„ ํ•˜

๋ฌธ์ œ

ํ•˜๋‚˜์˜ ์ˆ˜์—ด์— ๋‹ค์–‘ํ•œ ์ˆ˜๊ฐ€ ํฌ๊ธฐ์— ์ƒ๊ด€์—†์ด ๋‚˜์—ด๋˜์–ด ์žˆ๋‹ค. ์ด ์ˆ˜๋ฅผ ํฐ ์ˆ˜๋ถ€ํ„ฐ ์ž‘์€ ์ˆ˜์˜ ์ˆœ์„œ๋กœ ์ •๋ ฌํ•ด์•ผ ํ•œ๋‹ค. ์ˆ˜์—ด์„ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“œ์‹œ์˜ค.

ํ•ด์„ค

๊ธฐ๋ณธ์ ์ธ ์ •๋ ฌ์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ฌผ์–ด๋ณด๋Š” ๋ฌธ์ œ์ด๋‹ค. ๊ธฐ๋ณธ ์ •๋ ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ํšจ๊ณผ์ ์ด๋‹ค.

์ฝ”๋“œ

n = int(input())
array = []

for i in range(n):
    array.append(int(input()))

array = sorted(array, reverse=True)
for i in array:
    print(i, end=' ')

3. ์„ฑ์ ์ด ๋‚ฎ์€ ์ˆœ์„œ๋กœ ํ•™์ƒ ์ถœ๋ ฅํ•˜๊ธฐ

๋‚œ์ด๋„ ํ•˜

๋ฌธ์ œ

N๋ช…์˜ ํ•™์ƒ ์ •๋ณด๊ฐ€ ์žˆ๊ณ , ํ•™์ƒ ์ •๋ณด๋Š” ํ•™์ƒ์˜ ์ด๋ฆ„๊ณผ ์„ฑ์ ์œผ๋กœ ๊ตฌ๋ถ„๋œ๋‹ค. ๊ฐ ํ•™์ƒ์˜ ์ด๋ฆ„๊ณผ ์„ฑ์  ์ •๋ณด๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์„ฑ์ ์ด ๋‚ฎ์€ ์ˆœ์„œ๋Œ€๋กœ ํ•™์ƒ์˜ ์ด๋ฆ„์„ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

ํ•ด์„ค

์ด ๋ฌธ์ œ์—์„œ ํ•™์ƒ ์ •๋ณด๊ฐ€ ์ตœ๋Œ€ 10๋งŒ๊ฐœ๊นŒ์ง€ ์ž…๋ ฅ๋˜๋ฏ€๋กœ ๊ณ„์ˆ˜ ์ •๋ ฌ์„ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค. ์ถœ๋ ฅํ•  ๋•Œ๋Š” ์ด๋ฆ„๋งŒ ์ถœ๋ ฅํ•˜๋ฉด ๋˜๋ฏ€๋กœ ํ•™์ƒ์ •๋ณด๋ฅผ (์ ์ˆ˜, ์ด๋ฆ„)์œผ๋กœ ๋ฌถ์€ ๋’ค์— ์ ์ˆ˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.

n = int(input())
array = []

for i in range(n):
    input_data = input().split()
    array.append((input_data[0], input_data[1]))

array = sorted(array, key = lambda student: student[1])

for student in array:
    print(student[0], end=' ')

4. ๋‘ ๋ฐฐ์—ด์˜ ์›์†Œ ๊ต์ฒด

๋‚œ์ด๋„ ํ•˜

๋ฌธ์ œ

๋‘ ๊ฐœ์˜ ๋ฐฐ์—ด A, B๋Š” N๊ฐœ์˜ ์›์†Œ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ, ๋ฐฐ์—ด์˜ ์›์†Œ๋Š” ๋ชจ๋‘ ์ž์—ฐ์ˆ˜์ด๋‹ค. ์ตœ๋Œ€ K๋ฒˆ์˜ ๋ฐ”๊ฟ”์น˜๊ธฐ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋ฐ”๊ฟ”์น˜๊ธฐ ์—ฐ์‚ฐ์ด๋ž€ A์— ์žˆ๋Š” ์›์†Œ ํ•˜๋‚˜์™€ B์— ์žˆ๋Š” ์›์†Œ ํ•˜๋‚˜๋ฅผ ๊ณจ๋ผ์„œ ๋‘ ์›์†Œ๋ฅผ ์„œ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ์ตœ์ข… ๋ชฉํ‘œ๋Š” ๋ฐฐ์—ด A์˜ ๋ชจ๋“  ์›์†Œ์˜ ํ•ฉ์ด ์ตœ๋Œ€๊ฐ€ ๋˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

N, K ๊ทธ๋ฆฌ๊ณ  ๋ฐฐ์—ด A, B์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์ตœ๋Œ€ K๋ฒˆ์˜ ๋ฐ”๊ฟ”์น˜๊ธฐ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ฐฐ์—ด A์˜ ๋ชจ๋“  ์›์†Œ์˜ ํ•ฉ์˜ ์ตœ๋Œ“๊ฐ’์„ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

ํ•ด์„ค

๋งค๋ฒˆ ๋ฐฐ์—ด A์—์„œ ๊ฐ€์žฅ ์ž‘์€ ์›์†Œ๋ฅผ ๊ณจ๋ผ์„œ ๋ฐฐ์—ด B์˜ ๊ฐ€์žฅ ํฐ ์›์†Œ์™€ ๊ต์ฒด๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋‹จ, A์˜ ๊ฐ€์žฅ ์ž‘์€ ์›์†Œ๊ฐ€ B์˜ ๊ฐ€์žฅ ํฐ ์›์†Œ๋ณด๋‹ค ์ž‘์•„์•ผ ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๊ณผ์ •์„ K๋ฒˆ ๋ฐ˜๋ณตํ•œ๋‹ค. ๋”ฐ๋ผ์„œ A๋Š” ์˜ค๋ฆ„์ฐจ์ˆœ, B๋Š” ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ ํ›„ ์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ ๋น„๊ตํ•˜๋ฉด์„œ ์ž‘์„ ๋•Œ ๊ต์ฒด๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ตœ๋Œ€ ๊ฐœ์ˆ˜๊ฐ€ 10๋งŒ๊ฐœ์ด๋ฏ€๋กœ O(NlogN)์„ ๋ณด์žฅํ•˜๋Š” ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•œ๋‹ค.

์ฝ”๋“œ

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))