๊ด€๋ฆฌ ๋ฉ”๋‰ด

DOing

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ์ •๋ ฌ with Python ๋ณธ๋ฌธ

์•Œ๊ณ ๋ฆฌ์ฆ˜

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ์ •๋ ฌ with Python

mangdo 2021. 5. 22. 17:20

๐Ÿ’ก ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

 ์ •๋ ฌ์ด๋ž€, ๋ฐ์ดํ„ฐ๋ฅผ ํŠน์ •ํ•œ ๊ธฐ์ค€์— ๋”ฐ๋ผ์„œ ์ˆœ์„œ๋Œ€๋กœ ๋‚˜์—ดํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ต‰์žฅํžˆ ๋‹ค์–‘ํ•œ๋ฐ ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์„ ํƒ ์ •๋ ฌ, ์‚ฝ์ž… ์ •๋ ฌ, ํ€ต ์ •๋ ฌ, ๊ณ„์ˆ˜ ์ •๋ ฌ์„ ๋‹ค๋ค„๋ณด๋ ค๊ณ  ํ•œ๋‹ค. ์ •๋ ฌ ์ˆ˜ํ–‰์‹œ์—๋Š” ์ƒํ™ฉ์— ๋งž๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์„ ํƒํ•ด์•ผ ํšจ์œจ์ ์œผ๋กœ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.

  ์„ ํƒ ์ •๋ ฌ ์‚ฝ์ž… ์ •๋ ฌ ํ€ต ์ •๋ ฌ ๊ณ„์ˆ˜ ์ •๋ ฌ
์‹œ๊ฐ„ ๋ณต์žก๋„ O(N^2) O(N^2) O(NlogN) O(N+K)
๊ณต๊ฐ„ ๋ณต์žก๋„ O(N) O(N) O(N) O(N+K)
์ถ”์ฒœ ์ƒํ™ฉ ๊ฐ„๋‹จ ๊ฑฐ์˜ ์ •๋ ฌ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ ํฌ๊ธฐ ๋ฒ”์œ„๊ฐ€
์ž‘์€ ๊ฒฝ์šฐ

(N : ๋ฐ์ดํ„ฐ์˜ ๊ฐฏ์ˆ˜, K : ๋ฐ์ดํ„ฐ ์ตœ๋Œ€๊ฐ’์˜ ํฌ๊ธฐ)

 * ํ˜„ ํฌ์ŠคํŒ…์—์„œ๋Š” ์˜ค๋ฆ„์ฐจ์ˆœ๋งŒ ๋‹ค๋ฃจ๊ณ  ์žˆ๋‹ค. ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ํฌ๊ธฐ ๋น„๊ต๋ฅผ ๋ฐ˜๋Œ€๋กœ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ๋ฆฌ์ŠคํŠธ์˜ ์›์†Œ๋ฅผ ๋’ค์ง‘์–ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ๋ฆฌ์ŠคํŠธ๋ฅผ ๋’ค์ง‘๋Š” ์—ฐ์‚ฐ์€ O(N)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

๐Ÿ’ก ์„ ํƒ ์ •๋ ฌ

  ํ˜„์žฌ ์ •๋ ฌ๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ ์ค‘์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ์„ ํƒํ•œ๋‹ค.

์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(N^2)์œผ๋กœ ๋น„ํšจ์œจ์ ์ด๋งŒ, ์ฝ”๋“œ ๊ตฌํ˜„์ด ์‰ฝ๋‹ค.

์„ ํƒ ์ •๋ ฌ ๋™์ž‘๊ณผ์ •

[์ฝ”๋“œ]

๊ฐ€์žฅ ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„์„œ ์•ž์œผ๋กœ ๋ณด๋‚ด๋Š” ๊ณผ์ •์„ N-1๋ฒˆ ๋ฐ˜๋ณตํ•˜๋ฉด๋œ๋‹ค.

array = [6,3,2,1,4,5]

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]

print(array)

 

๐Ÿ’ก ์‚ฝ์ž… ์ •๋ ฌ

  ์ด๋ฏธ ์ •๋ ฌ๋˜์–ด์žˆ๋Š” ๋ฐ์ดํ„ฐ์™€ ๋น„๊ตํ•˜์—ฌ, ์ž์‹ ์˜ ์œ„์น˜๋ฅผ ์ฐพ์•„ ์‚ฝ์ž…ํ•œ๋‹ค.

์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(N^2)์ด์ง€๋งŒ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฑฐ์˜ ์ •๋ ฌ๋˜์–ด์žˆ๋‹ค๋ฉด ํ€ต ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋ณด๋‹ค๋„ ๋น ๋ฅด๋‹ค. ์ตœ์„ ์˜ ๊ฒฝ์šฐO(N)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค.

 

 

์‚ฝ์ž… ์ •๋ ฌ ๋™์ž‘๊ณผ์ •

์ฐธ๊ณ ๋กœ ์‚ฝ์ž… ์ •๋ ฌ์€ ๋‘๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ ์‹œ์ž‘๋œ๋‹ค.

์™œ๋ƒํ•˜๋ฉด ์ฒซ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๋Š” ๊ทธ์ž์ฒด๋กœ ์ •๋ ฌ๋˜์–ด์žˆ๋‹ค๊ณ  ํŒ๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

[์ฝ”๋“œ]

array = [6,3,2,1,4,5]

for i in range(len(array)):
  
  # ์ด๋ฏธ ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ๋“ค๊ณผ ๋น„๊ต
  # ์ธ๋ฑ์Šค i๋ถ€ํ„ฐ 1๊นŒ์ง€ ๊ฐ์†Œํ•˜๋ฉฐ ๋ฐ˜๋ณต
  for j in range(i, 0, -1):
    # ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ์Šค์™€ํ•‘
    if array[j] < array[j-1]:
      array[j], array[j-1] = array[j-1], array[j]
    else: 
      break # ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ๋ณด๋‹ค ํฌ๋‹ค๋ฉด ๋ฉˆ์ถค

print(array)

 

๐Ÿ’ก ํ€ต ์ •๋ ฌ

 ํ€ต ์ •๋ ฌ์€ ์ง€๊ธˆ๊นŒ์ง€ ๋ฐฐ์šด ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘์— ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ์ •๋ ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ทผ๊ฐ„์ด ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๊ธฐ๋„ ํ•˜๋‹ค.

 

 ํ€ต์ •๋ ฌ์€ ๊ธฐ์ค€(pivot)์„ ์„ค์ •ํ•œ ๋‹ค์Œ ํฐ ์ˆ˜์™€ ์ž‘์€ ์ˆ˜๋ฅผ ๊ตํ™˜ํ•œ ํ›„ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

ํฐ ์ˆซ์ž์™€ ์ž‘์€ ์ˆซ์ž๋ฅผ ๊ตํ™˜ํ•  ๋•Œ, ๊ตํ™˜ํ•˜๊ธฐ ์œ„ํ•œ '๊ธฐ์ค€'์„ ๋ฐ”๋กœ pivot์ด๋ผ๊ณ  ํ‘œํ˜„ํ•œ๋‹ค. ํ€ต ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์ „์—๋Š” pivot์„ ์–ด๋–ป๊ฒŒ ์„ค์ •ํ•  ๊ฒƒ์ธ์ง€๋ฅผ ๋ฏธ๋ฆฌ ๋ช…์‹œํ•ด์•ผํ•œ๋‹ค. ํ”ผ๋ฒ—์„ ์„ค์ •ํ•˜๊ณ  ๋ถ„ํ• ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ์„œ ์—ฌ๋Ÿฌ ๋ฐฉ์‹์œผ๋กœ ํ€ต์ •๋ ฌ์„ ๊ตฌ๋ถ„ํ•˜๋Š”๋ฐ, ํ˜„์žฌ ํฌ์ŠคํŒ…์—์„œ๋Š” ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ๋ถ„ํ•  ๋ฐฉ์‹์ธ ํ˜ธ์–ด ๋ถ„ํ• ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค. ํ˜ธ์–ด๋ถ„ํ•  ๋ฐฉ์‹์—์„œ๋Š” ๋ฆฌ์ŠคํŠธ์—์„œ ์ฒซ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๋ฅผ pivot์œผ๋กœ ์„ค์ •ํ•œ๋‹ค. 

 

1. pivot์„ ์„ค์ •

2. ์™ผ์ชฝ์—์„œ๋ถ€ํ„ฐ๋Š” pivot๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๊ณ , ์˜ค๋ฅธ์ชฝ์—์„œ๋ถ€ํ„ฐ๋Š” pivot๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š”๋‹ค.

3. ์ฐพ์€ ํฐ๋ฐ์ดํ„ฐ์™€ ์ž‘์€๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋กœ ๊ตํ™˜ํ•ด์ค€๋‹ค. 

4. 2~3๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋‹ค๊ฐ€ ๋งŒ์•ฝ ๋‘ ๋ฐ์ดํ„ฐ๊ฐ€ ์—‡๊ฐˆ๋ฆฐ ๊ฒฝ์šฐ์—๋Š” '์ž‘์€ ๋ฐ์ดํ„ฐ'์™€ pivot์„ ๋ณ€๊ฒฝํ•œ๋‹ค.

5. ์ด์ œ pivot์˜ ์™ผ์ชฝ ๋ฐ์ดํ„ฐ ๋ฆฌ์ŠคํŠธ๋Š” ๋ชจ๋‘ pivot๋ณด๋‹ค ์ž‘๊ณ , ์˜ค๋ฅธ์ชฝ ๋ฐ์ดํ„ฐ ๋ฆฌ์ŠคํŠธ๋Š” ๋ชจ๋‘ pivot๋ณด๋‹ค ํฌ๋‹ค.

6. ์™ผ์ชฝ ๋ฆฌ์ŠคํŠธ์™€ ์˜ค๋ฅธ์ชฝ ๋ฆฌ์ŠคํŠธ์— ๋Œ€ํ•ด์„œ 1~5๊ณผ์ •์„ ๋‹ค์‹œ ๋ฐ˜๋ณตํ•˜๋‹ค๋ณด๋ฉด ๋ชจ๋‘ ์ •๋ ฌ๋œ๋‹ค.

์—‡๊ฐˆ๋ฆฌ๋Š” ๋ถ€๋ถ„์—์„œ ์‚ฌ์‹ค ์ดํ•ด๊ฐ€ ์–ด๋ ค์› ๋Š”๋ฐ ๊ตฌ์ฒด์ ์ธ ๋™์ž‘์€ ์ฝ”๋“œ๋กœ ๋ณด๋ฉด ์ข€ ๋” ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ ์˜ํ•ด ๋‘˜ ๊ฒƒ์€ 5์˜ ์˜ค๋ฅธ์ชฝ ๋ฆฌ์ŠคํŠธ '876'์—์„œ left๋Š” ๋ฆฌ์ŠคํŠธ ๋ฐ–๊นŒ์ง€ ๊ฐ„๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. '67','34'์—์„œ right๋Š” pivot๊นŒ์ง€ ๊ฐ„๋‹ค. ์ฝ”๋“œ์—์„œ while๊ตฌ๋ฌธ ์•ˆ์— left <= end์™€ right > start ๋ถ€๋ถ„์„ ๋ณด๋ฉด ๊ฐ์ด ์˜ฌ ๊ฒƒ์ด๋‹ค.

 

 

[์ฝ”๋“œ]

array = [5,4,7,3,2,8,1,6]

def quick_sort(array, start, end):
  # ์›์†Œ๊ฐ€ 1๊ฐœ์ธ ๊ฒฝ์šฐ ์ข…๋ฃŒ
  if start >= end: 
      return
  
  pivot = start # pivot์€ ์ฒซ ๋ฒˆ์งธ ์›์†Œ
  left = start + 1
  right = end

  # ์—‡๊ฐˆ๋ฆฌ๊ธฐ ์ „๊นŒ์ง€ ๋ฐ˜๋ณต
  while(left <= right):
    # pivot๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต 
    while(left <= end and array[left] <= array[pivot]):
      left += 1
      print(left,end)

    # pivot๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
    while(right > start and array[right] >= array[pivot]):
      right -= 1

    # ์—‡๊ฐˆ๋ ธ๋‹ค๋ฉด ์ž‘์€ ๋ฐ์ดํ„ฐ์™€ 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)

[ ํ€ต ์ •๋ ฌ์˜ ์‹œ๊ฐ„๋ณต์žก๋„ ]

  ํ€ต ์ •๋ ฌ์˜ ํ‰๊ท  ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(NlogN)์ด๋‹ค. pivot์„ ์ž˜๋ชป ์„ค์ •ํ•˜๋Š” ์ตœ์•…์˜ ๊ฒฝ์šฐ์—๋Š” O(N^2) ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์งˆ ์ˆ˜๋„ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ€ต ์ •๋ ฌ ์ค‘ ํ˜ธ์–ด๋ถ„ํ•  ๋ฐฉ์‹์„ ์„ ํƒํ–ˆ์„๋•Œ ์ด๋ฏธ '๋ฐ์ดํ„ฐ๊ฐ€ ์ •๋ ฌ๋˜์–ด์žˆ๋Š” ๊ฒฝ์šฐ'์—๋Š” ๋งค์šฐ ๋Š๋ฆฌ๊ฒŒ ๋™์ž‘ํ•œ๋‹ค. ์•ž์„œ ์‚ฝ์ž… ์ •๋ ฌ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ •๋ ฌ๋˜์–ด์žˆ๋Š” ๊ฒฝ์šฐ์— ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ๊ณผ ๋ฐ˜๋Œ€๋œ๋‹ค. ์‹ค์ œ๋กœ c++๊ณผ ๊ฐ™์€ ํ€ต ์ •๋ ฌ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑ๋œ ์ •๋ ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์–ธ์–ด๋“ค์€ ์ตœ์•…์˜ ๊ฒฝ์šฐ์—๋„ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(NlogN)์ด ๋˜๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก pivot๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ์ถ”๊ฐ€์ ์ธ ๋กœ์ง์„ ๋”ํ•ด์ค€๋‹ค.

๐Ÿ’ก ๊ณ„์ˆ˜ ์ •๋ ฌ

  ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ ๋ฒ”์œ„๊ฐ€ ์ž‘์„๋•Œ, ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋งค์šฐ ๋น ๋ฅธ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐ์ดํ„ฐ ํฌ๊ธฐ ๋ฒ”์œ„๊ฐ€ 1,000,000(๋ฐฑ๋งŒ)์„ ๋„˜์ง€ ์•Š์„๋•Œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ณ„์ˆ˜ ์ •๋ ฌ์€ ์•ž์„œ ๋‹ค๋ฃจ์—ˆ๋˜ ์„ ํƒ/์‚ฝ์ž…/ํ€ต ์ •๋ ฌ์€ ์ง์ ‘ ๋ฐ์ดํ„ฐ์˜ ๊ฐ’์„ ๋น„๊ตํ•œ๋’ค์— ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉฐ ์ •๋ ฌํ•˜๋Š” ๋ฐฉ์‹๊ณผ๋Š” ๋‹ค๋ฅด๋‹ค. ๋™์ž‘๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

1. ๊ฐ€์žฅ ํฐ ๋ฐ์ดํ„ฐ์™€ ๊ฐ€์žฅ ์ž‘์€ ๋ฐ์ดํ„ฐ์˜ ๋ฒ”์œ„๊ฐ€ ๋ชจ๋‘ ๋‹ด๊ธธ ์ˆ˜ ์žˆ๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค

2. ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์”ฉ ํ™•์ธํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ์˜ ๊ฐ’๊ณผ ๋™์ผํ•œ ์ธ๋ฑ์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ 1์”ฉ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

 

๋งŒ์•ฝ [2,3,1,6,8,8,8,4,3,2]๋ผ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ฃผ์–ด์กŒ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

์ธ๋ฑ์Šค 0 1 2 3 4 5 6 7 8
๊ฐฏ์ˆ˜ 0 1 2 2 1 0 1 0 3

์ด์— ๋Œ€ํ•œ ์ถœ๋ ฅ๊ฒฐ๊ณผ๋Š” 1223346888์ด๋œ๋‹ค.

 

[์ฝ”๋“œ]

# ๋ชจ๋“  ์›์†Œ์˜ ๊ฐ’์ด 0๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๋‹ค๊ณ  ๊ฐ€์ •
array = [2,3,1,6,8,8,8,4,3,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=' ')

[ ๊ณ„์ˆ˜ ์ •๋ ฌ์˜ ์‹œ๊ฐ„๋ณต์žก๋„ ]

๋ฐ์ดํ„ฐ์˜ ๊ฐฏ์ˆ˜๋ฅผ M, ๋ฐ์ดํ„ฐ์˜ ์ตœ๋Œ€๊ฐ’ ํฌ๊ธฐ๋ฅผ K๋ผ๊ณ  ํ• ๋•Œ, ๊ณ„์ˆ˜ ์ •๋ ฌ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(N+K)๋กœ ์ด์ œ๊นŒ์ง€ ์‚ดํŽด๋ณธ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ๊ฐ€์žฅ ๋น ๋ฅด๋‹ค. ํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ์˜ ์ตœ๋Œ€๊ฐ’ ํฌ๊ธฐ๋งŒํผ์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ฌ๊ฐํ•œ ๋น„ํšจ์œจ์„ฑ์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 10,000,000์™€ 1๋กœ ๋‹จ 2๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์„๋•Œ๋„ 10,000,001ํฌ๊ธฐ์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์„ ์–ธํ•ด์•ผํ•œ๋‹ค. ๋•Œ๋ฌธ์— ๊ณ„์ˆ˜ ์ •๋ ฌ์€ ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ ๋ฒ”์œ„๊ฐ€ ์ž‘์„๋•Œ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. 

 


๐Ÿ’ก ํŒŒ์ด์ฌ ์ •๋ ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

 ์ง€๊ธˆ๊นŒ์ง€ ๋‹ค์–‘ํ•œ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋ฅผ ํ’€๋•Œ๋Š” ์ง์ ‘ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์ง€๋งŒ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ง„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ํšจ๊ณผ์ ์ธ ๊ฒฝ์šฐ๊ฐ€ ๋” ๋งŽ๋‹ค. ํŒŒ์ด์ฌ์€ ๊ธฐ๋ณธ ์ •๋ ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ sorted()ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•œ๋‹ค. sorted๋Š” ํ€ต ์ •์—ด๊ณผ ๋™์ž‘ ๋ฐฉ์‹์ด ๋น„์Šทํ•œ ๋ณ‘ํ•ฉ ์ •๋ ฌ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ๋‹ค. ๋ณ‘ํ•ฉ์ •๋ ฌ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ€ต์ •๋ ฌ๋ณด๋‹ค ๋Š๋ฆฌ์ง€๋งŒ ์ตœ์•…์˜ ๊ฒฝ์šฐ์—๋„ ์‹œ๊ฐ„๋ณต์žก๋„ O(NlogN)์„ ๋ณด์žฅํ•œ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๋‹ค.

 

* sorted()

๋ฆฌ์ŠคํŠธ, ์ง‘ํ•ฉ, ๋”•์…”๋„ˆ๋ฆฌ ์ž๋ฃŒํ˜• ๋“ฑ์„ ์ž…๋ ฅ๋ฐ›์•„์„œ ์ •์—ด๋œ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. set์ด๋‚˜ dictionary์ž๋ฃŒํ˜•์„ ์‚ฌ์šฉํ•ด๋„ ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒฐ๊ณผ๋Š” ๋ฆฌ์ŠคํŠธ ์ž๋ฃŒํ˜•์ž„์„ ์ฃผ์˜ํ•˜์ž. 

array = [2,3,1,4,5]

result = sorted(array)
print(result)

* sort()

๋ฆฌ์ŠคํŠธ ๊ฐ์ฒด์˜ ๋‚ด์žฅํ•จ์ˆ˜์ด๋‹ค. sort()๋Š” ๋ณ„๋„์˜ ๋ฐ˜ํ™˜ ๊ฐ’์ด ์—†๊ณ , ๋‚ด๋ถ€ ์›์†Œ๊ฐ€ ๋ฐ”๋กœ ์ •๋ ฌ๋œ๋‹ค.

array = [2,3,1,4,5]

array.sort()
print(array)

* keyโญ

sorted()๋‚˜ sort()๋ฅผ ์ด์šฉํ•  ๋•Œ์—๋Š” key ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. key๊ฐ’์œผ๋กœ๋Š” ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐ€์•ผํ•˜๋ฉฐ ์ด๋Š” ์ •๋ ฌ ๊ธฐ์ค€์ด ๋œ๋‹ค. 

๋‹ค์Œ ์ฝ”๋“œ๋Š” ๋ฆฌ์ŠคํŠธ๊ฐ€ ํŠœํ”Œ๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ์„ ๋•Œ ๊ฐ ๋ฐ์ดํ„ฐ์˜ ๋‘๋ฒˆ์งธ ์›์†Œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค.

array = [('๋ฐ”๋‚˜๋‚˜', 2), ('์‚ฌ๊ณผ', 1), ('๋‹น๊ทผ', 3)]

def setting(data):
  return data[1]

result = sorted(array, key=setting)
print(result)

๋‘๋ฒˆ์งธ ์›์†Œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ

[ key์— ๋žŒ๋‹คํ•จ์ˆ˜ ์‚ฌ์šฉ ]

array = [('๋ฐ”๋‚˜๋‚˜', 2), ('์‚ฌ๊ณผ', 1), ('๋‹น๊ทผ', 3)]

def setting(data):
  return data[1]

result = sorted(array, key=lambda data:data[1])
print(result)

(lambda ๋งค๊ฐœ๋ณ€์ˆ˜ : ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’)ํ˜•ํƒœ๋กœ ๋„ฃ์–ด์ฃผ๋ฉด๋œ๋‹ค.

 


๐Ÿ’ก ๋ฐฐ์—ด ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ

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

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

* ์ž…๋ ฅ ์กฐ๊ฑด

- ์ฒซ์งธ์ค„์— ํ•™์ƒ์˜ ์ˆ˜ N์ด ์ž…๋ ฅ๋œ๋‹ค.(1<=N<=100,000)

* ์ถœ๋ ฅ ์กฐ๊ฑด

- ๋‘๋ฒˆ์งธ์ค„๋ถ€ํ„ฐ N+1๋ฒˆ์งธ ์ค„์—๋Š” ํ•™์ƒ์˜ ์ด๋ฆ„์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด A์™€ ํ•™์ƒ์˜ ์„ฑ์ ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ B๊ฐ€ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ž…๋ ฅ๋œ๋‹ค. ๋ฌธ์ž์—ด A์˜ ๊ธธ์ด์™€ ํ•™์ƒ์˜ ์„ฑ์ ์€ 100์ดํ•˜์˜ ์ž์—ฐ์ˆ˜์ด๋‹ค.

 

* ์ž…๋ ฅ ์˜ˆ์‹œ

2

ํ™๊ธธ๋™ 95

์ด์ˆœ์‹  77

* ์ถœ๋ ฅ ์˜ˆ์‹œ

์ด์ˆœ์‹  ํ™๊ธธ๋™

 

[๋ฌธ์ œ ์•„์ด๋””์–ด]

ํŒŒ์ด์ฌ ๊ธฐ๋ณธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ถฉ๋ถ„ํžˆ ํ’€ ์ˆ˜ ์žˆ๋‹ค.

 

[์ฝ”๋“œ]

n = int(input())

score=[]
for i in range(n):
  score.append(input().split())

def student_score(data):
  return int(data[1])

result = sorted(score, key=student_score)

for r in result:
  print(r[0], end=' ')

 

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

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

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

* ์ž…๋ ฅ ์กฐ๊ฑด

- ์ฒซ๋ฒˆ์งธ ์ค„์— N, K๊ฐ€ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ž…๋ ฅ๋œ๋‹ค.(1<=N<=100,000, 0<=K<=N)

- ๋‘๋ฒˆ์งธ ์ค„์— ๋ฐฐ์—ด A์˜ ์›์†Œ๋“ค์ด ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ž…๋ ฅ๋œ๋‹ค. ๋ชจ๋“  ์›์†Œ๋Š” 10,000,000๋ณด๋‹ค ์ž‘์€ ์ž์—ฐ์ˆ˜์ด๋‹ค.

- ์„ธ๋ฒˆ์งธ์ค„์— ๋ฐฐ์—ด B์˜ ์›์†Œ๋“ค์ด ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ž…๋ ฅ๋œ๋‹ค. ๋ชจ๋“  ์›์†Œ๋Š” 10,000,000๋ณด๋‹ค ์ž‘์€ ์ž์—ฐ์ˆ˜์ด๋‹ค.

* ์ถœ๋ ฅ ์กฐ๊ฑด

- ์ตœ๋Œ€ K๋ฒˆ์˜ ๋ฐ”๊ฟ”์น˜๊ธฐ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ฐฐ์—ด A์˜ ๋ชจ๋“  ์›์†Œ์˜ ํ•ฉ์˜ ์ตœ๋Œ“๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

* ์ž…๋ ฅ ์˜ˆ์‹œ

5 3

1 2 5 4 3

5 5 6 6 5

* ์ถœ๋ ฅ ์˜ˆ์‹œ

26

 

[๋ฌธ์ œ ์•„์ด๋””์–ด]

ํŒŒ์ด์ฌ ๊ธฐ๋ณธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ถฉ๋ถ„ํžˆ ํ’€ ์ˆ˜ ์žˆ๋‹ค.

 

[์ฝ”๋“œ]

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):
  # a๊ฐ€ b๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ์—๋งŒ
  if a[i] < b[i]:
    a[i], b[i] = b[i], a[i]
  else:
    break

print(sum(a))