๐Ÿ’ก Algorithm

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

jcowwk 2025. 1. 24. 20:41

๋™์  ๊ณ„ํš๋ฒ•(Dynamic Programming)


1. ๋™์  ๊ณ„ํš๋ฒ•

2. ๊ตฌํ˜„ ๋ฐฉ๋ฒ•(ํ”ผ๋ณด๋‚˜์น˜ ์˜ˆ์ œ)


1. ๋™์  ๊ณ„ํš๋ฒ•

ํ•˜๋‚˜์˜ ํฐ ๋ฌธ์ œ๋ฅผ ํฐ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„์–ด ํ•ด๊ฒฐํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜์—ฌ ์ค‘๋ณต ๊ณ„์‚ฐ์„ ํ”ผํ•˜๋Š” ํ•˜๋‚˜์˜ ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค.

๋™์  ๊ณ„ํš๋ฒ•์„ ํ™œ์šฉํ•˜๋Š” ๋Œ€ํ‘œ ๋ฌธ์ œ๋กœ๋Š” ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด, ์ตœ์žฅ ๊ณตํ†ต ๋ถ€๋ถ„ ์ˆ˜์—ด(LCS), ๋ฐฐ๋‚ญ ๋ฌธ์ œ, ์ตœ๋‹จ ๊ฒฝ๋กœ, ๋™์ „ ๊ฑฐ์Šค๋ฆ„๋ˆ ๋ฌธ์ œ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

DP(Dynamic Programming) ๋ฌธ์ œ๋ฅผ ๋งŒ๋‚ฌ์„ ๋•Œ๋Š” ๋ถ€๋ถ„ ๋ฌธ์ œ๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€, ์ค‘๋ณต ๊ณ„์‚ฐ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋Š”์ง€ 2๊ฐ€์ง€ ์‚ฌํ•ญ์„ ๊ณ ๋ฏผํ•˜์—ฌ ์ ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ํฌ์ŠคํŒ…์—์„œ๋Š” ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์œผ๋กœ ๊ตฌํ˜„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

2. ๊ตฌํ˜„ ๋ฐฉ๋ฒ•(ํ”ผ๋ณด๋‚˜์น˜ ์˜ˆ์ œ)

- Bottom-Up ๋ฐฉ์‹(๋ฐ˜๋ณต๋ฌธ)

์•„๋ž˜(๊ฐ€์žฅ ์ž‘์€ ์ƒํƒœ)์—์„œ๋ถ€ํ„ฐ ์œ„(ํฐ ์ƒํƒœ)๋กœ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

 

int fib(int n) {
    int dp[n + 1];
    dp[0] = 0;
    dp[1] = 1;

    for (int i = 2; i <= n; i++) {
        dp[i] = dp[i - 1] + dp[i - 2];
    }

    return dp[n];
}

 

์ ํ™”์‹์„ ์‚ฌ์šฉํ•ด์„œ dp[i]๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

 

i dp[i] ๊ฐ’ ์„ค๋ช…
0 0 0 (์ดˆ๊ธฐ๊ฐ’)
1 1 1 (์ดˆ๊ธฐ๊ฐ’)
2 1 dp[2] = 1 + 0 = 1
3 2 dp[3] = 1 + 1 = 2
4 3 dp[4] = 2 + 1 = 3
5 5 dp[5] = 3 + 2 = 5

 

์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ž‘์€ ๊ฐ’๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ์ฑ„์›Œ๋‚˜๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๋ณต ๊ณ„์‚ฐ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

 

- Top-Down ๋ฐฉ์‹(๋ฉ”๋ชจ์ด์ œ์ด์…˜)

์œ„(๊ฐ€์žฅ ํฐ ์ƒํƒœ)์—์„œ๋ถ€ํ„ฐ ์•„๋ž˜(์ž‘์€ ์ƒํƒœ)๋กœ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

ํ•œ ๋ฒˆ ๊ณ„์‚ฐํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜์—ฌ ์ค‘๋ณต ํ˜ธ์ถœ์„ ์ค„์ž…๋‹ˆ๋‹ค.

 

int fib(int n) {
    if (n <= 1) return n;
    if (dp[n] != 0) return dp[n];
    return dp[n] = fib(n - 1) + fib(n - 2);
}

 

if (n <= 1) return n; fib(0), fib(1)์€ ๊ณ ์ •๋œ ๊ฐ’์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•ด์ค๋‹ˆ๋‹ค.

if (dp[n] != 0) return dp[n]; ์ฒ˜์Œ์— dp ๋ฐฐ์—ด์„ ๋ชจ๋‘ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์ด ๋“ค์–ด๊ฐ€์ง€ ์•Š์€ ๋ฐฐ์—ด์˜ ๊ฐ’์€ 0์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๊ฐ’์ด ๋“ค์–ด๊ฐ”๋‹ค๋ฉด ์ด๋ฏธ ๊ณ„์‚ฐ๋œ ๊ฐ’์ด๋ฏ€๋กœ ์žฌ๊ท€ ํ˜ธ์ถœ์—†์ด ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

return dp[n] = fib(n - 1) + fib(n - 2); ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœํ•˜์—ฌ dp[n]์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

 

DP๋Š” ๋ง‰์ƒ ๋ฌธ์ œ๋ฅผ ๋ณด๋ฉด ๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฝ์ง€ ์•Š๋”๋ผ๊ตฌ์š”..

๊พธ์ค€ํžˆ ๋ฌธ์ œ๋ฅผ ํ’€๊ณ  ํ•™์Šตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


์ฐธ๊ณ  ์‚ฌ์ดํŠธ

 

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

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

hongjw1938.tistory.com

 

๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉด ๋Œ“๊ธ€ ๋‚จ๊ฒจ์ฃผ์„ธ์š” !

ํ”ผ๋“œ๋ฐฑ์€ ์–ธ์ œ๋‚˜ ํ™˜์˜์ž…๋‹ˆ๋‹ค <3