๐Ÿ”Ž ๋ถ„ํ• ์ •๋ณต๊ณผ ํ€ต์ •๋ ฌ

์ด์žฌํ™˜ยท2024๋…„ 10์›” 29์ผ
0

๐Ÿ“Œ ๋ถ„ํ• ์ •๋ณต๋ฒ•์ด๋ž€?

๋ถ„ํ• ์ •๋ณต๋ฒ•(Divide and Conquer)์€ ํฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ฌธ์ œ๋ฅผ ์ž‘๊ณ  ๋…๋ฆฝ์ ์ธ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆˆ ํ›„, ์ด๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ํ•ด๊ฒฐํ•œ ๊ฒฐ๊ณผ๋ฅผ ํ•ฉ์ณ์„œ ์ „์ฒด ๋ฌธ์ œ์˜ ํ•ด๋‹ต์„ ์–ป๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ์ฃผ๋กœ ์žฌ๊ท€(Recursion)๋ฅผ ํ™œ์šฉํ•˜๋ฉฐ, ๋ณต์žกํ•œ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„์–ด ๋ฐ˜๋ณต์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๐Ÿค“

๐Ÿ“Š ๋ถ„ํ• ์ •๋ณต๋ฒ•์˜ ์ฃผ์š” ๋‹จ๊ณ„

  1. ๋ถ„ํ• (Divide): ๋ฌธ์ œ๋ฅผ ๋” ์ž‘์€ ๋ถ€๋ถ„ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค.
  2. ์ •๋ณต(Conquer): ๊ฐ ๋ถ€๋ถ„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต ์žฌ๊ท€๋ฅผ ํ†ตํ•ด ๊ณ„์† ์ชผ๊ฐœ๊ณ  ํ•ด๊ฒฐํ•˜์ฃ !
  3. ๋ณ‘ํ•ฉ(Combine): ๋ถ€๋ถ„ ๋ฌธ์ œ์˜ ๋‹ต์„ ํ•ฉ์ณ ์›๋ž˜ ๋ฌธ์ œ์˜ ๋‹ต์„ ๋„์ถœํ•ฉ๋‹ˆ๋‹ค. โœจ

๐Ÿ’ก ๋ถ„ํ• ์ •๋ณต๋ฒ•์ด ์œ ์šฉํ•œ ๊ฒฝ์šฐ

  • ํฐ ๋ฌธ์ œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณ‘ํ•ฉ ์ •๋ ฌ(Merge Sort), ํ€ต ์ •๋ ฌ(Quick Sort), ์ด์ง„ ํƒ์ƒ‰(Binary Search) ๋“ฑ์ด ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์ž…๋‹ˆ๋‹ค.

โšก ํ€ต์ •๋ ฌ์ด๋ž€?

ํ€ต์ •๋ ฌ(Quick Sort)์€ ๋ถ„ํ• ์ •๋ณต๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ธฐ์ค€์ (pivot)์„ ์ค‘์‹ฌ์œผ๋กœ ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆˆ ๋’ค, ๊ฐ ๋ถ€๋ถ„์—์„œ ์žฌ๊ท€์ ์œผ๋กœ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ๐Ÿช„ ํ€ต์ •๋ ฌ์€ ํ‰๊ท ์ ์œผ๋กœ ์‹œ๊ฐ„๋ณต์žก๋„ (O(n \log n))์„ ๊ฐ€์ง€๋ฉฐ, ๊ณต๊ฐ„์„ ์ ˆ์•ฝํ•˜๋Š” ํŠน์ง•์ด ์žˆ์–ด ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.

๐Ÿงฉ ํ€ต์ •๋ ฌ์˜ ๊ณผ์ •

  1. ํ”ผ๋ฒ— ์„ ํƒ: ๋ฆฌ์ŠคํŠธ์—์„œ ํ•˜๋‚˜์˜ ์š”์†Œ๋ฅผ ํ”ผ๋ฒ—(pivot)์œผ๋กœ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. (๋ณดํ†ต ์ฒซ ์š”์†Œ, ๋งˆ์ง€๋ง‰ ์š”์†Œ, ์ค‘๊ฐ„๊ฐ’ ๋“ฑ์„ ๋งŽ์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.)
  2. ๋ถ„ํ• (Divide): ํ”ผ๋ฒ—์„ ๊ธฐ์ค€์œผ๋กœ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค. ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ์š”์†Œ๋Š” ์™ผ์ชฝ, ํฐ ์š”์†Œ๋Š” ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  3. ์žฌ๊ท€(Recursion): ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„ ๋ฆฌ์ŠคํŠธ์— ๋Œ€ํ•ด ๊ฐ๊ฐ ํ€ต์ •๋ ฌ์„ ์žฌ๊ท€์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  4. ํ•ฉ์น˜๊ธฐ(Merge): ๋ชจ๋“  ๋ถ€๋ถ„์ด ์ •๋ ฌ๋˜๋ฉด ์ „์ฒด ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ •๋ ฌ๋ฉ๋‹ˆ๋‹ค. ๐ŸŽ‰

๐ŸŽฏ ์˜ˆ์ œ ์ฝ”๋“œ

def quick_sort(arr):
    if len(arr) <= 1:  # ๊ธฐ๋ณธ ์กฐ๊ฑด: ์š”์†Œ๊ฐ€ 1๊ฐœ ์ดํ•˜์ผ ๋•Œ
        return arr
    pivot = arr[len(arr) // 2]  # ์ค‘์•™๊ฐ’์„ ํ”ผ๋ฒ—์œผ๋กœ ์„ ํƒ
    left = [x for x in arr if x < pivot]  # ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ์š”์†Œ๋“ค
    middle = [x for x in arr if x == pivot]  # ํ”ผ๋ฒ—๊ณผ ๊ฐ™์€ ์š”์†Œ๋“ค
    right = [x for x in arr if x > pivot]  # ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ์š”์†Œ๋“ค
    return quick_sort(left) + middle + quick_sort(right)  # ์ •๋ ฌํ•˜์—ฌ ๋ณ‘ํ•ฉ

๐Ÿง ํ€ต์ •๋ ฌ์˜ ์žฅ๋‹จ์ 

  • ์žฅ์ : ํ‰๊ท ์ ์ธ ์‹œ๊ฐ„๋ณต์žก๋„ O(nlogโกn)O(n \log n)์„ ๊ฐ€์ง€๋ฉฐ, ๋‹ค๋ฅธ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋ณด๋‹ค ๋น ๋ฅธ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋„ ์ ์–ด ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.
  • ๋‹จ์ : ํ”ผ๋ฒ—์„ ์ž˜๋ชป ์„ ํƒํ•  ๊ฒฝ์šฐ, ์ตœ์•…์˜ ๊ฒฝ์šฐ O(n2)O(n^2)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜ฌ (ex. ์ด๋ฏธ ์ •๋ ฌ๋œ ๋ฆฌ์ŠคํŠธ์—์„œ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ํ”ผ๋ฒ—์œผ๋กœ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ)

๐Ÿ” ๊ฒฐ๋ก 

ํ€ต์ •๋ ฌ์€ ๋ถ„ํ• ์ •๋ณต๋ฒ•์˜ ์ „ํ˜•์ ์ธ ์˜ˆ๋กœ, ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„์–ด ํšจ์œจ์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋ถ„ํ• ์ •๋ณต๋ฒ•์€ ํ€ต์ •๋ ฌ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค์–‘ํ•œ ๋ฌธ์ œ์—์„œ ์‘์šฉ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฌธ์ œ ํ•ด๊ฒฐ์— ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๐Ÿ˜„


๐Ÿ’ก Tip: ํ€ต์ •๋ ฌ์„ ๋”์šฑ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ”ผ๋ฒ— ์„ ํƒ์„ ์ „๋žต์ ์œผ๋กœ ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€