Search

DP

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
๋ณต์‚ฌ