๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์ฝ”๋”ฉํ…Œ์ŠคํŠธ/๊ธฐ๋ณธ ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Dynamic_Programming)

1. Dynamic_Programming ์ด๋ž€

  1. ํฐ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆŒ ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
  2. ์ž‘์€ ๋ฌธ์ œ์—์„œ ๊ตฌํ•œ ์ •๋‹ต์€ ๊ทธ๊ฒƒ์„ ํฌํ•จํ•˜๋Š” ํฐ ๋ฌธ์ œ์—์„œ๋„ ๋™์ผํ• ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    ์ฃผ์˜์‚ฌํ•ญ : ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ตฌํ˜„์‹œ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์ ์žฌํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ• ์ˆ˜์žˆ๋‹ค.
    ๋”ฐ๋ผ์„œ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ์žฌ๊ท€ํ•จ์ˆ˜๋ณด๋‹ค ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์€ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋Œ€ํ‘œ ๋ฌธ์ œ์ด๋‹ค. ํŒŒ๋ณด๋‚˜์น˜๋ฅผ ํ†ตํ•ด ๋‹ค์ด๋‚˜๋ฏน ํ•จ์ˆ˜๋ฅผ ์ดํ•ดํ•ด๋ณด์ž.

2. ์˜ˆ์‹œ์ฝ”๋“œ(์žฌ๊ท€ํ•จ์ˆ˜ ์‚ฌ์šฉ)

d = [0] * 100        # ํ•œ ๋ฒˆ ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ์ด์ œ์ด์…˜(memoization)ํ•˜๊ธฐ ์œ„ํ•œ ๋ฆฌ์ŠคํŠธ ์ดˆ๊ธฐํ™”

def fibo(x):         # ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์„ ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„(ํƒ‘ ๋‹ค์šด ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ) 
  if x == 1 or x == 2:    # ์ข…๋ฃŒ ์กฐ๊ฑด : x = 1 ๋˜๋Š” 2์ผ๋•Œ 1์„ ๋ฐ˜ํ™˜
    return 1

  if d[x] != 0:      # ๋งŒ์•ฝ d[x]๊ฐ€ 0์ด ์•„๋‹ˆ๋ผ๋ฉด (= ํ•œ๋ฒˆ ๊ณ„์‚ฐ๋œ ๋ฌธ์ œ๋ผ๋ฉด, (ํ”ผ๋ณด๋‚˜์น˜๋Š” f(5) = f(4) + f(3) = (f(3)+f(2)) + (f(2)+f(1)) ์ด๋Ÿฐ์‹์œผ๋กœ ์“ฐ์˜€๋˜ f(x)๊ฐ€ ๊ณ„์†์“ฐ์ด๊ธฐ ๋•Œ๋ฌธ์—)) 
    return d[x]      # ๊ณ„์‚ฐ๋˜์—ˆ๋˜ ๊ฐ’ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜

  d[x] = fibo(x - 1) + fibo(x - 2)    # ๋งŒ์•ฝ ๊ณ„์‚ฐ๋œ์  ์—†๋˜ ๊ฐ’์ด๋ผ๋ฉด ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ํ”ผ๋ณด๋‚˜์น˜๊ฐ’ ๋ฐ˜ํ™˜ (top-down ๋ฐฉ์‹)
  return d[x]

print(fibo(99))

2. ์˜ˆ์‹œ์ฝ”๋“œ2(๋ฐ˜๋ณต๋ฌธ์‚ฌ์šฉ)

d = [0] * 100     # ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋‹ด๊ธฐ ์œ„ํ•œ ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ•˜๊ณ  ์‹ถ์€ ํ”ผ๋ณด๋‚˜์น˜์˜ ํฌ๊ธฐ

d[1] = 1
d[2] = 1
n = 99

for i in range(3, n + 1):     # fibonacci function ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๊ตฌํ˜„(bottom-up ๋ฐฉ์‹)
  d[i] = d[i - 1] + d[i - 2]

print(d[n])