Dynamic Programming (๋์ ๊ณํ๋ฒ)
๋ณต์กํ ๋ฌธ์ ๋ฅผ ๋ ์์ ํ์ ๋ฌธ์ ๋ก ๋๋์ด ํด๊ฒฐํ๊ณ , ๊ฐ ํ์ ๋ฌธ์ ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ์ฌ ์ฌ์ฌ์ฉํจ์ผ๋ก์จ ๊ณ์ฐ ํจ์จ์ฑ์ ๋์ด๋ ์๊ณ ๋ฆฌ์ฆ ์ค๊ณ ๊ธฐ๋ฒ์
๋๋ค. ์ด๋ฅผ ํตํด ์ค๋ณต ๊ณ์ฐ์ ํผํ๊ณ ์ต์ ํด๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
ํต์ฌ ์์
ํต์ฌ์์ | ์ค๋ช
|
์ต์ ๋ถ๋ถ ๊ตฌ์กฐ | ํฐ ๋ฌธ์ ์ ์ต์ ํด๊ฐ ์์ ๋ฌธ์ ์ ์ต์ ํด๋ฅผ ํฌํจ |
์ค๋ณต๋๋ ๋ถ๋ถ ๋ฌธ์ | ๋์ผํ ์์ ๋ฌธ์ ๋ค์ด ๋ฐ๋ณต์ ์ผ๋ก ๋ํ๋จ |
๋ฉ๋ชจ์ด์ ์ด์
| ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ์ฌ ์ฌํ์ฉ |
ํ
์ด๋ธ๋ง | ๋ฐ๋ณต์ ๋ฐฉ์์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉฐ ๊ฒฐ๊ณผ ์ ์ฅ |
DP ํด๊ฒฐ ๊ณผ์
graph TD; A["๋ฌธ์ ๋ถ์"] --> B["๋ถ๋ถ ๋ฌธ์ ์๋ณ"]; B --> C["์ ํ์ ์๋ฆฝ"]; C --> D["๋ฉ๋ชจ์ด์ ์ด์ /ํ ์ด๋ธ๋ง ๊ตฌํ"]; D --> E["๋ฒ ์ด์ค ์ผ์ด์ค ์ฒ๋ฆฌ"]; E --> F["์ต์ข ํด๋ต ๋์ถ"];
Mermaid
๋ณต์ฌ
์์ ์ฝ๋ - ํผ๋ณด๋์น ์์ด
public class Fibonacci {
public static int fib(int n) {
// ๋ฉ๋ชจ์ด์ ์ด์
์ ์ํ ๋ฐฐ์ด
int[] dp = new int[n + 1];
// ๋ฒ ์ด์ค ์ผ์ด์ค
dp[1] = 1;
dp[2] = 1;
// ์ํฅ์ ์ ๊ทผ
for (int i = 3; i <= n; i++) {
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];
}
public static void main(String[] args) {
System.out.println(fib(10)); // 55 ์ถ๋ ฅ
}
}
Java
๋ณต์ฌ
์ด ์ฝ๋๋ ํผ๋ณด๋์น ์์ด์ DP๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํ ์์์
๋๋ค. ์ฌ๊ท์ ๋ฐฉ์ ๋์ ๋ฐ๋ณต๋ฌธ๊ณผ ๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ํจ์จ์ ์ผ๋ก ๊ณ์ฐํฉ๋๋ค.
๋ํ์ ์ธ DP ๋ฌธ์
โข
ํผ๋ณด๋์น ์์ด: ์ด์ ๋ ์์ ํฉ์ผ๋ก ํ์ฌ ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์
โข
์ต๋จ ๊ฒฝ๋ก ๋ฌธ์ : ๊ทธ๋ํ์์ ๋ ์ ์ ์ฌ์ด์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ฐพ๋ ๋ฌธ์
โข
๋ฐฐ๋ญ ๋ฌธ์ : ์ ํ๋ ๋ฌด๊ฒ ๋ด์์ ์ต๋ ๊ฐ์น๋ฅผ ์ป๋ ๋ฌผ๊ฑด ์กฐํฉ์ ์ฐพ๋ ๋ฌธ์
๋ฉ๋ชจ์ด์ ์ด์ (Memoization)
๋ฉ๋ชจ์ด์ ์ด์
์ ๋์ ๊ณํ๋ฒ์์ ์ฌ์ฉ๋๋ ์ต์ ํ ๊ธฐ๋ฒ์ผ๋ก, ์ด๋ฏธ ๊ณ์ฐํ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ์ฌ ๋์ผํ ๊ณ์ฐ์ ๋ฐ๋ณต ์ํ์ ๋ฐฉ์งํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
๋ฉ๋ชจ์ด์ ์ด์
์ ์ฃผ์ ํน์ง:
โข
ํํฅ์ ์ ๊ทผ(Top-down): ํฐ ๋ฌธ์ ์์ ์์ ๋ฌธ์ ๋ก ๋ถํ ํ๋ฉฐ ํด๊ฒฐ
โข
์ฌ๊ท์ ๊ตฌํ: ์ฃผ๋ก ์ฌ๊ท ํจ์์ ํจ๊ป ์ฌ์ฉ๋์ด ์์ฐ์ค๋ฌ์ด ๋ฌธ์ ํด๊ฒฐ ๊ณผ์ ์ ํํ
โข
์บ์ ํ์ฉ: ๋ฐฐ์ด์ด๋ ํด์๋งต์ ์ฌ์ฉํ์ฌ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ณ ์ฌ์ฌ์ฉ
public class FibonacciMemo {
private static Map<Integer, Long> memo = new HashMap<>();
public static long fib(int n) {
if (memo.containsKey(n)) {
return memo.get(n);
}
if (n <= 2) {
return 1;
}
memo.put(n, fib(n-1) + fib(n-2));
return memo.get(n);
}
}
Java
๋ณต์ฌ
ํ ์ด๋ธ๋ง (Tabulation)
ํ
์ด๋ธ๋ง์ ๋์ ๊ณํ๋ฒ์ ๋ฐ๋ณต์ ๋ฐฉ์์ผ๋ก, ์์ ๋ถ๋ถ ๋ฌธ์ ๋ถํฐ ์ฐจ๋ก๋๋ก ํด๊ฒฐํ๋ฉฐ ํ
์ด๋ธ(๋ฐฐ์ด)์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
ํ
์ด๋ธ๋ง์ ์ฃผ์ ํน์ง:
โข
์ํฅ์ ์ ๊ทผ(Bottom-up): ๊ฐ์ฅ ์์ ๋ถ๋ถ ๋ฌธ์ ๋ถํฐ ์์ํ์ฌ ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ
โข
๋ฐ๋ณต๋ฌธ ์ฌ์ฉ: ์ผ๋ฐ์ ์ผ๋ก for ๋ฃจํ๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ
โข
๊ณต๊ฐ ํจ์จ์ฑ: ํ์ํ ๊ฒฐ๊ณผ๋ง ์ ์ฅํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ต์ ํ ๊ฐ๋ฅ
public class FibonacciTable {
public static long fib(int n) {
if (n <= 2) return 1;
long[] dp = new long[n + 1];
dp[1] = dp[2] = 1;
for (int i = 3; i <= n; i++) {
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];
}
}
Java
๋ณต์ฌ