๐Ÿงฉ Algorithm/๊ฐœ๋… ๋ฐ ์ž๋ฃŒ๊ตฌ์กฐ

[์•Œ๊ณ ๋ฆฌ์ฆ˜] DP (Dynamic Programming, ๋™์  ๊ณ„ํš๋ฒ•)

devCloud 2023. 9. 25. 20:11
728x90

โžค DP ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€?

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

์œ„์˜ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ๊ฐ™์€ ํ•จ์ˆ˜๋“ค์ด ์—ฌ๋Ÿฌ๋ฒˆ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ปดํ“จํ„ฐ ์ƒ์—์„œ ์—ฐ์‚ฐ์„ ํ•  ๋•Œ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๊ฐ€ ๋˜๊ณ , ์—ฐ์‚ฐ ์†๋„๋„ ๋Š˜์–ด๋‚˜๊ธฐ ๋•Œ๋ฌธ์— ๋น„ํšจ์œจ์ ์ด๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋™์  ๊ณ„ํš๋ฒ•์ด๋‹ค. 

 

 

DP ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ๋กœ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์ด ์žˆ๋‹ค. ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์€ ์ด์ „๋‘ ํ•ญ์˜ ํ•ฉ์„ ํ˜„์žฌ์˜ ํ•ญ์œผ๋กœ ์„ค์ •ํ•˜๋Š” ํŠน์ง•์ด ์žˆ๋Š” ์ˆ˜์—ด์ด๋‹ค. ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์ด์–ด์ง„๋‹ค.

์œ„๋ฅผ ์ˆ˜์‹์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด, n ๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜ = (n - 1)๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜ + (n - 2)๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜

๋‹จ,  1๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜ = 1, 2๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜ = 1

 

ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์ˆ˜์—ด์„ ๋ฐฐ์—ด์ด๋‚˜ ๋ฆฌ์ŠคํŠธ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ํŒŒ์ด์ฌ์—์„œ๋Š” ๋ฆฌ์ŠคํŠธ ์ž๋ฃŒํ˜•์„, C/C++์™€ ์ž๋ฐ”์—์„œ๋Š” ๋ฐฐ์—ด์„ ์ด์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌํ•œ๋‹ค. (ํ•„์ž๋Š” ํŒŒ์ด์ฌ์œผ๋กœ) 


๊ตฌํ˜„ ๋ฐฉ๋ฒ• - โ‘  Top-Down (ํ•˜ํ–ฅ์‹, Memoization ๋ฐฉ์‹)

dp = [0] * (n+1)

def fibo(n):
    if n == 1 or n == 2:
        return 1
        
    if dp[n] == 0:
        dp[n] = fibo(n - 1) + fibo(n - 2)
    return dp[n]
    
print(fibo(n))

โœ” Memoization(๋ฉ”๋ชจ์ด์ œ์ด์…˜)์€ ์ด์ „์— ํ™•์ธํ–ˆ๋˜ ๋ฌธ์ œ๋ฅผ ๋ฉ”๋ชจํ•˜๊ฒ ๋‹ค๋Š” ๋œป์ด๋‹ค. ํ•˜ํ–ฅ์‹์€ ํ•˜์œ„ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ •๋‹ต์„ ๊ณ„์‚ฐํ–ˆ๋Š”์ง€ ํ™•์ธํ•ด ๊ฐ€๋ฉด์„œ ํ’€์–ด๋‚˜๊ฐ„๋‹ค.

๊ตฌํ˜„ ๋ฐฉ๋ฒ• - โ‘ก  Bottom-Up (์ƒํ–ฅ์‹, Tabulation ๋ฐฉ์‹)

dp = [0]*(n + 1)
dp[1] = 1

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

โœ” Tabulation(ํƒ€๋ทธ๋ ˆ์ด์…˜)์€ ๋„ํ‘œ๋ผ๋Š” ๋œป์ธ๋ฐ ๋„ํ‘œ์‹์œผ๋กœ ์ €์žฅํ•˜๋Š” ๊ฑธ ๋งํ•œ๋‹ค. ์ƒํ–ฅ์‹์€ ๋” ์ž‘์€ ํ•˜์œ„ ๋ฌธ์ œ๋ถ€ํ„ฐ ์‚ดํ•€ ํ›„ ์ž‘์€ ๋ฌธ์ œ์˜ ์ •๋‹ต์„ ์ด์šฉํ•ด ํฐ ๋ฌธ์ œ์˜ ์ •๋‹ต์„ ํ’€์–ด๋‚˜๊ฐ„๋‹ค. 

 

โžค DP ์‚ฌ์šฉ ์กฐ๊ฑด

• Overlapping Subproblems(๊ฒน์น˜๋Š” ๋ถ€๋ถ„ ๋ฌธ์ œ)

   - ๋™์ผํ•œ ์ž‘์€ ๋ฌธ์ œ๋“ค์ด ๋ฐ˜๋ณตํ•˜์—ฌ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉ

• Optional Substructure(์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ)

   - ๋ถ€๋ถ„ ๋ฌธ์ œ์˜ ์ตœ์  ๊ฒฐ๊ณผ ๊ฐ’์„ ์‚ฌ์šฉํ•ด ์ „์ฒด ๋ฌธ์ œ์˜ ์ตœ์  ๊ฒฐ๊ณผ๋ฅผ ๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉ

 

โžค DP ๋ฌธ์ œ ํ’€์–ด๋ณด๊ธฐ

 

2748๋ฒˆ: ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜ 2

ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋Š” 0๊ณผ 1๋กœ ์‹œ์ž‘ํ•œ๋‹ค. 0๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋Š” 0์ด๊ณ , 1๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋Š” 1์ด๋‹ค. ๊ทธ ๋‹ค์Œ 2๋ฒˆ์งธ ๋ถ€ํ„ฐ๋Š” ๋ฐ”๋กœ ์•ž ๋‘ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์˜ ํ•ฉ์ด ๋œ๋‹ค. ์ด๋ฅผ ์‹์œผ๋กœ ์จ๋ณด๋ฉด Fn = Fn-1 + Fn-2 (n ≥ 2)๊ฐ€

www.acmicpc.net

 

ํ’€์ด

https://dev-cloud.tistory.com/171


↓ DP์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์„ค๋ช… ↓

 

์•Œ๊ณ ๋ฆฌ์ฆ˜ - Dynamic Programming(๋™์  ๊ณ„ํš๋ฒ•)

1. ๊ฐœ์š” DP, ์ฆ‰ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ(๋˜๋Š” ๋™์  ๊ณ„ํš๋ฒ•)์€ ๊ธฐ๋ณธ์ ์ธ ์•„์ด๋””์–ด๋กœ ํ•˜๋‚˜์˜ ํฐ ๋ฌธ์ œ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„์–ด์„œ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜์—ฌ ๋‹ค์‹œ ํฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ

hongjw1938.tistory.com

 

728x90