Bibi's DevLog ๐Ÿค“๐ŸŽ

[Hello Coding ์•Œ๊ณ ๋ฆฌ์ฆ˜] 4. ํ€ต ์ •๋ ฌ ๋ณธ๋ฌธ

ํ”„๋กœ๊ทธ๋ž˜๋ฐ/Algorithm ์•Œ๊ณ ๋ฆฌ์ฆ˜

[Hello Coding ์•Œ๊ณ ๋ฆฌ์ฆ˜] 4. ํ€ต ์ •๋ ฌ

๋น„๋น„ bibi 2021. 7. 1. 18:18

[210701]

Hello Coding ์•Œ๊ณ ๋ฆฌ์ฆ˜

4. ํ€ต ์ •๋ ฌ

๋ถ„ํ•  ์ •๋ณต divide and conquer

: ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ์ค‘ ๊ฐ€์žฅ ์œ ๋ช…ํ•œ ์žฌ๊ท€์  ์•Œ๊ณ ๋ฆฌ์ฆ˜.

ํŠน์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜(๊ธฐ์ˆ )์ด ์•„๋‹Œ, ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•๋ก ์ด๋‹ค.

๋ถ„ํ•  ์ •๋ณต์˜ ์ฆ๋ช… - '์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ• Euclid's algorithm' ์ฐธ๊ณ ํ•˜๊ธฐ

์˜ˆ์‹œ : ๋†๋ถ€๊ฐ€ ์–ด๋–ค ๋•…์„ ๋˜‘๊ฐ™์€ ์ •์‚ฌ๊ฐํ˜• ํ† ์ง€๋กœ ๋‚˜๋ˆ„๊ณ  ์‹ถ์„ ๋•Œ.

๋ถ„ํ•  ์ •๋ณต์œผ๋กœ ํ‘ธ๋Š” ๋‹จ๊ณ„.

  1. ๊ธฐ๋ณธ ๋‹จ๊ณ„๋ฅผ ์ฐพ๋Š”๋‹ค. ์ด ๋ถ€๋ถ„์€ ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฌธ์ œ์—ฌ์•ผ ํ•œ๋‹ค.
  2. ์ „์ฒด ๋ฌธ์ œ๊ฐ€ ๊ธฐ๋ณธ ๋‹จ๊ณ„๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ๋‚˜๋ˆ„๊ฑฐ๋‚˜ ์ž‘๊ฒŒ ๋งŒ๋“ ๋‹ค.

๋ถ„ํ•  ์ •๋ณต์—์„œ๋Š” ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ๋งˆ๋‹ค ๋ฌธ์ œ๋ฅผ ์ž‘๊ฒŒ ๋‚˜๋ˆ„์–ด์•ผ ํ•œ๋‹ค.

์˜ˆ์ œ

Q. ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์ˆซ์ž๋ฅผ ๋”ํ•œ ํ•ฉ๊ณ„ ๊ตฌํ•˜๊ธฐ. ๋ฐ˜๋ณต๋ฌธ์ด ์•„๋‹Œ ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

  • ๊ธฐ๋ณธ ๋‹จ๊ณ„๋ฅผ ์ฐพ๋Š”๋‹ค.
    • (ํ•ฉ์„ ๊ตฌํ•˜๊ธฐ์—) ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฐ์—ด์€? = ์›์†Œ์˜ ๊ฐฏ์ˆ˜๊ฐ€ 0๊ฐœ์ด๊ฑฐ๋‚˜ 1๊ฐœ์ธ ๋ฐฐ์—ด
  • ์žฌ๊ท€ ํ˜ธ์ถœ์„ ํ•  ๋•Œ๋งˆ๋‹ค ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ ์ ์  ๊ฐ์†Œํ•ด์•ผ ํ•จ.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, [2,3,4] ์ธ ๋ฐฐ์—ด์˜ ์ดํ•ฉ๊ณผ [2], [3,4] ๋ฐฐ์—ด์˜ ์ดํ•ฉ์€ ๊ฐ™๋‹ค.

์ฆ‰ sumํ•จ์ˆ˜๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘์‹œํ‚จ๋‹ค.

  • ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ›๋Š”๋‹ค
    • ๋งŒ์•ฝ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด ์žˆ์œผ๋ฉด 0์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    • ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ดํ•ฉ์€ ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ๋ฒˆ์งธ ์ˆซ์ž์™€ ๋‚˜๋จธ์ง€ ๋ฆฌ์ŠคํŠธ์˜ ์ดํ•ฉ์„ ๋”ํ•œ ๊ฐ’์ด ๋œ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด [2,3,4] ๋ฐฐ์—ด์˜ ์ดํ•ฉ์„ ๊ตฌํ•  ๋•Œ, [2] + [3,4]์˜ ํ•ฉ์„, [3,4]๋Š” [3],[4]์˜ ํ•ฉ์„ ๊ตฌํ•ด ์ตœ์ข… ๋‹ต์„ 9๋กœ ๊ณ„์‚ฐํ•ด๋‚ธ๋‹ค.

โ€ป ๋ฐฐ์—ด์„ ํฌํ•จํ•˜๋Š” ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ๋•Œ, ๊ธฐ๋ณธ ๋‹จ๊ณ„๋Š” ๋ณดํ†ต ๋นˆ ๋ฐฐ์—ด์ด๋‚˜ ์›์†Œ๊ฐ€ 1๊ฐœ์ธ ๋ฐฐ์—ด์ด ๋œ๋‹ค.

โ“ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ํ’€ ์ˆ˜ ์žˆ๋Š”๋ฐ ์™œ ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ํ’€์–ด์•ผ ํ•˜๋Š”๊ฐ€?

โ— ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ functional programming์„ ๋ง›๋ณด๋Š” ๊ณผ์ •์ด๋‹ค. ์ผ๋ถ€ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด(ํ•˜์Šค์ผˆ)์—๋Š” ๋ฐ˜๋ณต๋ฌธ์ด ์—†๋‹ค.

ํ€ต ์ •๋ ฌ quicksort

: ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ, ์„ ํƒ ์ •๋ ฌ๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅด๊ณ  ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

  • ๊ฐ€์žฅ ๋น ๋ฅธ ์ •๋ ฌ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ด๋‹ค.
  • ํ€ต ์ •๋ ฌ์€ ๋ถ„ํ•  ์ •๋ณต ์ „๋žต์„ ์‚ฌ์šฉํ•˜๋Š” ์ข‹์€ ์˜ˆ์ด๋‹ค.
  • ํ€ต ์ •๋ ฌ์€ ๊ธฐ์ค€ ์›์†Œ์— ๋”ฐ๋ผ ์ฒ˜๋ฆฌ์†๋„๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค.

์˜ˆ์ œ

๋ฐฐ์—ด์„ ํ€ต ์ •๋ ฌ๋กœ ์ •๋ ฌํ•ด ๋ณด์ž.

  • ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฐ์—ด ์ •๋ ฌ์€?
    • ์›์†Œ๊ฐ€ 0๊ฐœ์ด๊ฑฐ๋‚˜ 1๊ฐœ์ธ ๋ฐฐ์—ด (= ์ •๋ ฌํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ, ์žˆ๋Š” ๋ฐฐ์—ด์„ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋จ)
    • def quicksort(array):
          if len(array) < 2:
              return array
  • ์›์†Œ๊ฐ€ 2๊ฐœ์ธ ๋ฐฐ์—ด์€?
    • ์ฒซ ๋ฒˆ์งธ ์›์†Œ๊ฐ€ ๋‘ ๋ฒˆ์งธ ์›์†Œ๋ณด๋‹ค ์ž‘์€์ง€ ํ™•์ธํ•œ๋‹ค.
    • ๋งŒ์•ฝ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๋‘ ์›์†Œ์˜ ์ž๋ฆฌ๋ฅผ ๊ตํ™˜ํ•œ๋‹ค.
  • ์›์†Œ๊ฐ€ 3๊ฐœ ์ด์ƒ์ธ ๋ฐฐ์—ด์€?
    • ๋ฐฐ์—ด์—์„œ ๊ธฐ์ค€ ์›์†Œpivot ๋ฅผ ๊ณ ๋ฅธ๋‹ค.
    • ๋ถ„ํ•  partitioning : ๊ธฐ์ค€ ์›์†Œ๋ณด๋‹ค ์ž‘์€ ํ•˜์œ„ ๋ฐฐ์—ด - ๊ธฐ์ค€ ์›์†Œ - ๊ธฐ์ค€ ์›์†Œ๋ณด๋‹ค ํฐ ํ•˜์œ„ ๋ฐฐ์—ด ๋กœ ๋ถ„๋ฅ˜ํ•œ๋‹ค.
    • ํ•˜์œ„ ๋ฐฐ์—ด sub-array : ์•„์ง ์ •๋ ฌ๋˜์–ด ์žˆ์ง€ ์•Š์Œ. ์ด ํ•˜์œ„๋ฐฐ์—ด๋“ค์„ ์ •๋ ฌํ•˜๋ฉด ์ „์ฒด ๋ฐฐ์—ด๋„ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์ด ๋œ๋‹ค.
    • ํ•˜์œ„ ๋ฐฐ์—ด์— ๋Œ€ํ•ด์„œ๋„ ์žฌ๊ท€์ ์œผ๋กœ ํ€ต ์ •๋ ฌ์„ ํ˜ธ์ถœํ•œ ๋‹ค์Œ, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํ•ฉ์นœ๋‹ค.

ํ€ต ์ •๋ ฌ ์ฝ”๋“œ

def quicksort(array):
    if len(array) < 2: ## ๊ธฐ๋ณธ ๋‹จ๊ณ„ : ์›์†Œ์˜ ๊ฐœ์ˆ˜๊ฐ€ 0๊ฐœ์ด๊ฑฐ๋‚˜ 1๊ฐœ์ผ ๋•Œ (์ •๋ ฌํ•  ํ•„์š”๊ฐ€ ์—†์Œ)
        return array
    else: ## ์žฌ๊ท€ ๋‹จ๊ณ„
        pivot = array[0]
        less = [i for i in array[1:] if i <= pivot] ## ๊ธฐ์ค€ ์›์†Œ๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ๋ชจ๋“  ์›์†Œ๋กœ ์ด๋ฃจ์–ด์ง„ ํ•˜์œ„ ๋ฐฐ์—ด
        greater = [i for i in array[1:] if i > pivot] ## ๊ธฐ์ค€ ์›์†Œ๋ณด๋‹ค ํฐ ์›์†Œ๋กœ ์ด๋ฃจ์–ด์ง„ ํ•˜์œ„ ๋ฐฐ์—ด
        return quicksort(less) + [pivot] + quicksort(greater)

print quicksort([10, 5, 2, 3])

๋น…์˜ค ํ‘œ๊ธฐ๋ฒ• ๋ณต์Šต

์•„๋ž˜๋กœ ๊ฐˆ์ˆ˜๋ก ๋Š๋ฆฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์œ„๋กœ ๊ฐˆ์ˆ˜๋ก ๋น ๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • O(logn) : ์ด์ง„ ํƒ์ƒ‰
  • O(n) : ๋‹จ์ˆœ ํƒ์ƒ‰
  • O(n logn) : ํ€ต ์ •๋ ฌ, ๋ณ‘ํ•ฉ ์ •๋ ฌ merge sort
  • O(n์ œ๊ณฑ) : ์„ ํƒ ์ •๋ ฌ
  • O(n!) : ์™ธํŒ์› ๋ฌธ์ œ

ํ€ต ์ •๋ ฌ์€ ๊ธฐ์ค€ ์›์†Œ์— ๋”ฐ๋ผ ์ฒ˜๋ฆฌ์†๋„๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค.

  • ์ตœ์•…์˜ ๊ฒฝ์šฐ O(n์ œ๊ณฑ)
  • ๊ทธ๋Ÿฌ๋‚˜ ํ‰๊ท ์ ์œผ๋กœ๋Š” O(n logn)์˜ ์†๋„๋กœ ์ฒ˜๋ฆฌ๋จ.

๋ณ‘ํ•ฉ ์ •๋ ฌ๊ณผ ํ€ต ์ •๋ ฌ ๋น„๊ต

๋ณ‘ํ•ฉ ์ •๋ ฌO(n logn) ์ด๊ณ  ํ€ต ์ •๋ ฌO(n logn)์ด์ง€๋งŒ

๋น…์˜คํ‘œ๊ธฐ๋ฒ•์ƒ ๋ฌด์‹œ๋˜๋Š” ์ƒ์ˆ˜(c, constant) ๊ฐ’์€ ํ€ต ์ •๋ ฌ์ด ๋ณ‘ํ•ฉ ์ •๋ ฌ๋ณด๋‹ค ์ž‘๋‹ค.

๋”ฐ๋ผ์„œ ์‹คํ–‰ ์‹œ๊ฐ„์ด O(n logn) ์œผ๋กœ ๋™์ผํ•˜๋‹ค๋ฉด ํ€ต ์ •๋ ฌ์ด ๋” ๋น ๋ฅด๋‹ค(์ƒ์ˆ˜๊ฐ’์ด ์ž‘๊ธฐ ๋•Œ๋ฌธ)

ํ‰๊ท ์ ์ธ ๊ฒฝ์šฐ vs ์ตœ์•…์˜ ๊ฒฝ์šฐ

ํ€ต ์ •๋ ฌ์˜ ์„ฑ๋Šฅ์€ '๊ธฐ์ค€ ์›์†Œpivot'์— ํฌ๊ฒŒ ์ขŒ์šฐ๋œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ™์€ ๋ฐฐ์—ด์ด๋ผ๋„..

  • ์ตœ์•…์˜ ๊ฒฝ์šฐ ์ฒซ ๋ฒˆ์งธ ์›์†Œ๋ฅผ ๊ธฐ์ค€์›์†Œ๋กœ ์„ ํƒํ•˜๋Š” ๊ฒฝ์šฐ
    • ๋ฐฐ์—ด์˜ ๊ธธ์ด(n)๋งŒํผ์˜ ์ฝœ์Šคํƒ ๊นŠ์ด๋ฅผ ๊ฐ–๊ฒŒ ๋จ - O(n)๋งŒํผ์˜ ์Šคํƒ
  • ์ตœ์„ ์˜ ๊ฒฝ์šฐ ์ค‘๊ฐ„ ์›์†Œ๋ฅผ ๊ธฐ์ค€ ์›์†Œ๋กœ ์„ ํƒํ•˜๋Š” ๊ฒฝ์šฐ
    • ๋Œ€๋žต ๋ฐฐ์—ด ๊ธธ์ด ์ ˆ๋ฐ˜(n/2)๋งŒํผ์˜ ์ฝœ์Šคํƒ ๊นŠ์ด๋ฅผ ๊ฐ–๊ฒŒ ๋จ - O(log n)๋งŒํผ์˜ ์Šคํƒ
    • ์™œ? ๊ธฐ๋ณธ ๋‹จ๊ณ„์— ๋” ๋นจ๋ฆฌ ๋„๋‹ฌํ•˜๊ธฐ ๋•Œ๋ฌธ.

โœ… POINT : ํ€ต ์ •๋ ฌ์—์„œ๋Š” ํ•˜์œ„ ๋ฐฐ์—ด๋กœ ๋‚˜๋ˆ„๊ธฐ ์œ„ํ•ด ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์›์†Œ๋ฅผ ๊ธฐ์ค€ ์›์†Œ์™€ ๋น„๊ตํ•ด์•ผ ํ•œ๋‹ค

  • ๊ธฐ์ค€์›์†Œ๋ณด๋‹ค ์ž‘์€์ง€ ํฐ์ง€ ํŒ๋ณ„ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ
  • O(n)๋งŒํผ์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค.
  • ์ฒซ ๋‹จ๊ณ„ ๋ฟ ์•„๋‹ˆ๋ผ ์ดํ›„ ๋ชจ๋“  ์ฝœ์Šคํƒ์—์„œ ์ด๋งŒํผ ๋น„๊ต๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
  • ๋ฐฐ์—ด์„ ์–ด๋–ป๊ฒŒ ๋ถ„ํ• ํ•˜๋Š”์ง€์— ๊ด€๊ณ„์—†์ด ๋ชจ๋“  ๊ฒฝ์šฐ์— O(n)๋งŒํผ์˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค.
  • ์ตœ์„ ์˜ ๊ฒฝ์šฐ
    • ๊ฐ๊ฐ์˜ ์ฝœ์Šคํƒ๋งˆ๋‹ค O(n)์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๊ณ , ์ฝœ์Šคํƒ์˜ ๋†’์ด๋Š” O(log n)์ด๊ธฐ ๋•Œ๋ฌธ์—,
    • ์ „์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‹คํ–‰์‹œ๊ฐ„์€ O(n) x O(log n) = O(n log n) ์ด๋‹ค.
  • ์ตœ์•…์˜ ๊ฒฝ์šฐ
    • ๊ฐ๊ฐ์˜ ์ฝœ์Šคํƒ๋งˆ๋‹ค O(n)์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๊ณ , ์ฝœ์Šคํƒ์˜ ๋†’์ด๋Š” O(n)์ด๊ธฐ ๋•Œ๋ฌธ์—,
    • ์ „์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‹คํ–‰์‹œ๊ฐ„์€ O(n) x O(n) = O(n์ œ๊ณฑ) ์ด๋‹ค.
  • ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ
    • ์ตœ์„ ์˜ ๊ฒฝ์šฐ์™€ ๊ฐ™์€ ์‹คํ–‰ ์†๋„๋ฅผ ๊ฐ€์ง„๋‹ค.
    • ๊ธฐ์ค€ ์›์†Œ๋ฅผ ๋ฐฐ์—ด ๋‚ด์—์„œ ๋ฌด์ž‘์œ„๋กœ ์„ ํƒํ–ˆ์„ ๋•Œ, ํ‰๊ท ์ ์œผ๋กœ O(n log n)์˜ ์‹คํ–‰ ์†๋„๋ฅผ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ.