๐Ÿ–ฅ CS/Algorithm

[Algorithm] ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ | Dynamic Programming (DP)

ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘๊ฒŒ ๋‚˜๋ˆ„๊ณ , ๊ฐ™์€ ๋ฌธ์ œ๋ผ๋ฉด ํ•œ ๋ฒˆ์”ฉ๋งŒ ํ’€์–ด ๋ฌธ์ œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ธฐ๋ฒ•

 

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ  

 

1. ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๋” ์‚ฌ์šฉํ•˜๋”๋ผ๋„, ์—ฐ์‚ฐ ์†๋„๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๊ธฐ ์œ„ํ•ด

2. ์ค‘๋ณต๋˜๋Š” ์—ฐ์‚ฐ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด

 

 

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์‚ฌ์šฉ ์กฐ๊ฑด

 

1. ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ (Optimal Substructure)

- ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ž‘์€ ๋ฌธ์ œ์˜ ๋‹ต์„ ๋ชจ์•„์„œ ํฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„ ๋•Œ

2. ์ค‘๋ณต๋˜๋Š” ๋ถ€๋ถ„ ๋ฌธ์ œ

- ๋™์ผํ•œ ์ž‘์€ ๋ฌธ์ œ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„ ๋•Œ

 

 

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฌธ์ œ ์ ‘๊ทผ ๋ฐฉ๋ฒ•

- ๊ทธ๋ฆฌ๋””, ๊ตฌํ˜„, ์™„์ „ ํƒ์ƒ‰ ๋“ฑ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์ง€ ๊ฒ€ํ† ํ•œ ํ›„ ๋– ์˜ค๋ฅด์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ณ ๋ คํ•ด๋ณธ๋‹ค.

- ์žฌ๊ท€ ํ•จ์ˆ˜๋กœ ์ž‘์„ฑํ•ด๋ณธ ํ›„, ์ž‘์€ ๋ฌธ์ œ์—์„œ ๊ตฌํ•œ ๋‹ต์ด ํฐ ๋ฌธ์ œ์—์„œ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด bottom - up ๋ฐฉ์‹์„ ๊ณ ๋ คํ•œ๋‹ค.

 

 

๋ฉ”๋ชจ์ด์ œ์ด์…˜ (Memoization)

: ํ•œ ๋ฒˆ ๊ณ„์‚ฐํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ๋ฉ”๋ชจํ•˜๋Š” ๊ธฐ๋ฒ•

    - ์ด์ „์— ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๋ฅผ ์ผ์‹œ์ ์œผ๋กœ ๊ธฐ๋กํ•ด ๋†“๋Š” ๊ฐœ๋…

    - ๊ธฐ๋ก๋งŒ ํ•ด๋†“๊ณ  ํ™œ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Œ

    - ์บ์‹ฑ(Caching)์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค.

 

 

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ์‹

 

1. ํƒ‘๋‹ค์šด(Top-Down) ๋ฐฉ์‹

- ํฐ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์œผ๋ฉด ๊ทธ ๋•Œ ์ž‘์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ์‹

 

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

# ๋ฉ”๋ชจ์ด์ œ์ด์…˜
m = [0 for _ in range(101)]

# ์žฌ๊ท€

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

 

2. ๋ณดํ…€์—…(Bottom-Up) ๋ฐฉ์‹

- ๋ณดํ†ต DP ๋ฌธ์ œ์˜ ํ’€์ด ๋ฐฉ์‹

- ์ž‘์€ ๋ฌธ์ œ๋ถ€ํ„ฐ ์ฐจ๊ทผ์ฐจ๊ทผ ๋‹ต์„ ๋„์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•

- ๋ฐ˜๋ณต๋ฌธ ์‚ฌ์šฉ

 

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

dp = [0 for _ in range(101)]

dp[1] = 1
dp[2] = 1
n = 99

for i in range(3, n+1):
    dp[i] = dp[i-1] + dp[i-2]

 

โ€ป recursion depth์™€ ๊ด€๋ จ๋œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด sys ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” setrecursionlimit() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉฐ ์žฌ๊ท€ ์ œํ•œ ์™„ํ™” ๊ฐ€๋Šฅ