1 ๋ถ„ ์†Œ์š”

๋™์  ๊ณ„ํš๋ฒ•(Dynamic Programming)์ด๋ž€?

๋™์  ๊ณ„ํš๋ฒ•์€ ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„์–ด ํ‘ธ๋Š” ๋ฌธ์ œ๋ฅผ ๋งํ•œ๋‹ค.
ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์€ ๋ถ„ํ•  ์ •๋ณต(Divide and Conquer)์™€ ๋น„์Šทํ•ด๋ณด์ธ๋‹ค. ํ•˜์ง€๋งŒ ๊ฒฐ์ •์ ์ธ ์ฐจ์ด์ ์ด ์žˆ๋Š”๋ฐ, ๋ฐ”๋กœ ์ž‘์€ ๋ฌธ์ œ๊ฐ€ ์ค‘๋ณต์ด ์ผ์–ด๋‚˜๋Š”์ง€ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”์ง€์ด๋‹ค.

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

๋™์  ๊ณ„ํš๋ฒ• ๋ฐฉ๋ฒ•

๋™์  ๊ณ„ํš๋ฒ•์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š” ๋ฐฉ๋ฒ•์€ ๋ชจ๋“  ์ž‘์€ ๋ฌธ์ œ๋“ค์„ ํ•œ ๋ฒˆ๋งŒ ํ‘ธ๋Š” ๊ฒƒ์ด๋‹ค.
์ •๋‹ต์„ ๊ตฌํ•œ ์ž‘์€ ๋ฌธ์ œ๋“ค์„ ์–ด๋”˜๊ฐ€์— ๋ฉ”๋ชจ(Momoization)ํ•ด๋†“์•˜๋‹ค๊ฐ€, ๊ฐ™์€ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๋ฉด ๊ทธ ๊ฒฐ๊ณผ๊ฐ’์„ ์‚ฌ์šฉํ•œ๋‹ค.

๋™์  ๊ณ„ํš๋ฒ•์˜ ์กฐ๊ฑด?

๋™์  ๊ณ„ํš๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ์กฐ๊ฑด์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ์ž‘์€ ๋ฌธ์ œ๊ฐ€ ๋ฐ˜๋ณต์ด ์ผ์–ด๋‚˜๋Š” ๊ฒฝ์šฐ
  2. ๊ฐ™์€ ๋ฌธ์ œ๋Š” ๊ตฌํ•  ๋•Œ๋งˆ๋‹ค ์ •๋‹ต์ด ๊ฐ™์•„์•ผ ํ•จ

์ด๋Ÿฌํ•œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๊ฒฝ์šฐ๋งŒ ๋™์  ๊ณ„ํš๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋™์  ๊ณ„ํš๋ฒ• ์š”์•ฝ - ์žฅ์ 

  1. ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ค‘๋ณต ์—ฐ์‚ฐ์„ ์ค„์ž„
  2. ์ค‘๋ณต ์—ฐ์‚ฐ์„ ์ค„์—ฌ์„œ ์ˆ˜ํ–‰ ์†๋„๋ฅผ ๊ฐœ์„ ํ•จ

์˜ˆ์‹œ - ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์€ F(n) = F(n-1) + F(n-2)์˜ ์ ํ™”์‹์„ ๊ฐ–๋Š” ์ˆœ์—ด์ด๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, n์ด ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜์˜ ์ˆ˜๊ฐ€ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ์ • ์ˆ˜ ์ด์ƒ์˜ ์ˆœ์—ด์„ ๊ตฌํ•˜๊ธฐ ์–ด๋ ต๋‹ค.

์žฌ๊ท€ํ•จ์ˆ˜ ์‚ฌ์šฉ

def fub(n):
    if n <= 1:
        return n
    else:
        return fib(n-1) + fib(n-2)


์ด ๋ฌธ์ œ๋ฅผ ๋™์  ๊ณ„ํš๋ฒ•(DP)๋ฅผ ์‚ฌ์šฉํ•ด ์ ‘๊ทผํ•ด๋ณด์ž.

  1. ์ž‘์€ ๋ฌธ์ œ๋“ค์ด ๋ฐ˜๋ณต๋œ๋‹ค.
    ์˜ˆ๋ฅผ ๋“ค์–ด F(5) = F(4) + F(3), F(4) = F(3) - F(2) ์ธ๋ฐ, ์—ฌ๊ธฐ์„œ F(3)์ด ๋ฐ˜๋ณต๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์ž‘์€ ๋ฌธ์ œ๊ฐ€ ๋ฐ˜๋ณต๋˜๊ณ  ์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค.

  2. ๊ฐ™์€ ๋ฌธ์ œ๋Š” ๊ตฌํ•  ๋•Œ๋งˆ๋‹ค ์ •๋‹ต์ด ๊ฐ™๋‹ค.
    ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์€ F(1)๊ณผ F(2)์˜ ๊ฐ’์€ ๋ชจ๋‘ 1๋กœ ๊ณ ์ •๋˜์–ด ์žˆ๋‹ค.
    ์ฆ‰, 3๋ฒˆ์งธ ์ˆ˜์—ด์€ ์–ธ์ œ๋‚˜ ๊ฒฐ๊ณผ๊ฐ’์ด 2์ด๊ณ , 4๋ฒˆ์งธ ์ˆ˜์—ด์€ 2 + 1์ด๋ฏ€๋กœ ์–ธ์ œ๋“  ๊ฒฐ๊ณผ๊ฐ’์ด ๊ฐ™๋‹ค.

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด DP

def fibo(n):
    dp[0] = 1
    dp[1] = 1
    
    if n < 2:
        return dp[n]
    for i in range(2, n+1):
        dp[i] = dp[i-2] + dp[i-1]
    
    return dp[n]

์ฐธ๊ณ ์ž๋ฃŒ

https://galid1.tistory.com/507
https://www.youtube.com/watch?v=0bqfTzpWySY&t=423s

ํƒœ๊ทธ:

์นดํ…Œ๊ณ ๋ฆฌ:

์—…๋ฐ์ดํŠธ:

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