πŸ’‘ 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