ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

728x90

๐Ÿฆ„ ๋™์  ๊ณ„ํš๋ฒ• (Dynamic Programming, DP)

๋™์  ๊ณ„ํš๋ฒ•์€ ๋ณต์žกํ•œ ๋ฌธ์ œ๋ฅผ ๊ฐ„๋‹จํ•œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•˜์œ„ ๋ฌธ์ œ(sub-problem)์œผ๋กœ ๋‚˜๋ˆ„์–ด ํ‘ธ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 

๊ฐ™์€ ํ•˜์œ„ ๋ฌธ์ œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ ์ด ๊ฒฐ๊ณผ๊ฐ’์„ ์ €์žฅํ•˜์—ฌ ํ•œ ๋ฒˆ์”ฉ๋งŒ ๊ณ„์‚ฐํ•˜๋„๋ก ํ•˜๋ฉฐ

์ด๋Ÿฌํ•œ ๊ธฐ๋ฒ•์„ memoization์ด๋ผ๊ณ  ํ•œ๋‹ค. 

 

๐Ÿ“Œ ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ ์ ํ™”์‹๊ณผ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ณผ์ •์„ ์ƒ๊ฐํ•ด๋ณด๋ฉด์„œ dp ํ…Œ์ด๋ธ”์„ ์ฑ„์›Œ๋‚˜๊ฐ€๋ฉด ๋œ๋‹ค. 

 

๐Ÿ“Œ ๋˜ํ•œ ๊ฐ€๋Šฅํ•˜๋ฉด ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋Š” ํƒ‘ ๋‹ค์šด ๋ฐฉ์‹๋ณด๋‹ค๋Š” ๋ณดํ…€์—… ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.

์‹œ์Šคํ…œ์ƒ ์žฌ๊ท€ ํ•จ์ˆ˜์˜ ์Šคํƒ ํฌ๊ธฐ๊ฐ€ ํ•œ์ •๋˜์–ด ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

 

- dp ํ…Œ์ด๋ธ” : ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฐ๊ณผ ์ €์žฅ์šฉ ๋ฐฐ์—ด/๋ฆฌ์ŠคํŠธ

     → ํ•œ ๋ฒˆ ๊ตฌํ•œ ๊ฒฐ๊ณผ๋Š” ๊ณ„์†ํ•ด์„œ ๋ฐฐ์—ด/๋ฆฌ์ŠคํŠธ์— ์ €์žฅํ•˜๊ณ  ๊ทธ๊ฒƒ์„ ์ด์šฉํ•˜์—ฌ ๊ทธ ๋‹ค์Œ ๊ฐ’์„ ๊ตฌํ•ด๋‚˜๊ฐ„๋‹ค. 

 

๐Ÿฆ„ Top-Down

์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ํฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์€ ๋ฌธ์ œ๋“ค์„ ํ˜ธ์ถœํ•œ๋‹ค. 

 

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜ ๊ตฌํ•˜๊ธฐ (Top-Down)

dp = [0] * 100

def fibo(x):
    if x == 0:
        return 0
    elif x == 1:
        return 1
    if dp[x] != 0:
        return dp[x]
    dp[x] = fibo(x - 1) + fibo(x - 2)
    return dp[x]

print(fibo(99))

 

๐Ÿฆ„ Bottom-Up

๋ฐ˜๋ณต๋ฌธ์„ ์ด์šฉํ•˜์—ฌ ์ž‘์€ ๋ฌธ์ œ๋ถ€ํ„ฐ ์ฐจ๊ทผ์ฐจ๊ทผ ๋‹ต์„ ๋„์ถœํ•œ๋‹ค. 

 

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜ ๊ตฌํ•˜๊ธฐ (Bottom-Up)

# ์•ž์„œ ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ DP ํ…Œ์ด๋ธ”
dp = [0] * 100

# ์ฒซ๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์™€ ๋‘๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋Š” 1
dp[0] = 0
dp[1] = 1
n = 99

# ํ”ผ๋ณด๋‚˜์น˜ ํ•จ์ˆ˜ ๊ตฌํ˜„
for i in range(2, n + 1):
    dp[i] = dp[i - 1] + dp[i - 2] # ํ”ผ๋ณด๋‚˜์น˜ ํ•จ์ˆ˜์˜ ์ ํ™”์‹

print(dp[n])

 

๐Ÿฆ„ 796,796์œผ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋ผ.

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฌธ์ œ์—์„œ๋Š” ์ข…์ข… ๊ฒฐ๊ณผ๋ฅผ ์–ด๋–ค ์ˆ˜๋กœ ๋‚˜๋ˆˆ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๋ผ๋Š” ๋‚ด์šฉ์ด ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. 

์ด๋Š” ๋‹จ์ง€ ๊ฒฐ๊ด๊ฐ’์ด ๊ต‰์žฅํžˆ ์ปค์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋Ÿฐ ๊ฒƒ์œผ๋กœ, ๊ฐ’์„ ๊ณ„์‚ฐํ•  ๋•Œ๋งˆ๋‹ค ํŠน์ •ํ•œ ์ˆ˜๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋งŒ ์ทจํ•˜๋„๋ก ํ•˜๋ฉด ๋œ๋‹ค. 

for i in range(3, n + 1):
	d[i] = (d[i - 1] + 2 * d[i - 2]) % 796796

๐Ÿ“Œ ๋งˆ์ง€๋ง‰์— ์ตœ์ข… ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ์—์„œ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐ’์„ ๊ณ„์‚ฐํ•  ๋•Œ๋งˆ๋‹ค ๋‚˜๋ˆˆ๋‹ค๋Š” ์ ์„ ์ฃผ์˜ํ•˜์ž!!

 


Ref.

์ด๊ฒƒ์ด ์ทจ์—…์„ ์œ„ํ•œ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with ํŒŒ์ด์ฌ - YES24

 

 

 

 

728x90
๋Œ“๊ธ€
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€