DP(top-down, bottom-up)

Icarus<Wing>ยท2025๋…„ 5์›” 15์ผ

๐Ÿ“ข์ด์ „์— ํŒŒ์ด์ฌ ๋ฒ„์ „์œผ๋กœ ์ •๋ฆฌํ•œ ๊ฒƒ์ด ์žˆ์œผ๋ฏ€๋กœ, ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ-์˜ฌ์ธ์›[ํŒŒ์ด์ฌ ๋ฒ„์ „]์„ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๐Ÿคฉ๊ธฐ์กด์˜ ํ”ผ๋ณด๋‚˜์น˜ top-down, bottom-up์„ ์ž๋ฐ” ๋ฒ„์ „์œผ๋กœ ๊ตฌํ˜„ํ•ด๋ณด์•˜๋‹ค๐Ÿ‘‡

๐Ÿ’ปํ”ผ๋ณด๋‚˜์น˜ Top-down ์ฝ”๋“œ ๊ตฌํ˜„

public class Fibonacci {
    public int fib(int n) {
        HashMap<Integer, Integer> memo = new HashMap<>();
        return dp(n, memo);
    }

    private static int dp(int n, HashMap<Integer, Integer> memo) {
        // base condition
        if (n <= 1) {
            return n;
        }
        // n์ด ๋ฉ”๋ชจ๋ฆฌ์— ์—†์œผ๋ฉด ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ
        if (!memo.containsKey(n)) {
            memo.put(n, dp(n - 1, memo) + dp(n - 2, memo));
        }
        // n์ด ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” value๋ฅผ ๋ฆฌํ„ด
        return memo.get(n);
    }
  • ๋Œ€๋ถ€๋ถ„ ์ฝ”ํ…Œ ๋ฌธ์ œ์—์„œ๋Š” ๋ฉ”์„œ๋“œ ์‹œ๊ทธ๋‹ˆ์ฒ˜๊ฐ€ ๋ฌธ์ œ ๊ทธ๋Œ€๋กœ ์ฃผ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— dp ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ๋”ฐ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.
    • ํŒŒ์ด์ฌ์—์„œ๋Š” closure ๊ธฐ๋Šฅ์ด ์žˆ์–ด์„œ ๋ถ€๋ชจ ๋ฉ”์„œ๋“œ์˜ ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ž๋ฐ”๋Š” type-strictํ•œ ์ปดํŒŒ์ผ๋Ÿฌ ์–ธ์–ด๋ผ ํ•ด์‹œ๋งต์„ ์žฌ๊ท€ ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌํ•˜์˜€๋‹ค.
      • ํ•ด์‹œ๋งต์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ ์ด์œ ๋Š” n์— ๋”ฐ๋ผ value๊ฐ€ ๋‹ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ
    • ๋‚ด๋ถ€ ํ—ฌํผ ๋ฉ”์„œ๋“œ๋Š” ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์— ์˜์กดํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ static์œผ๋กœ ์„ ์–ธํ•˜์˜€๋‹ค.

๐Ÿ”Ž์ฐธ๊ณ ๋กœ, dp๋ฅผ int[] dp = new int[n + 1];๊ณผ ๊ฐ™์ด ๋ฐฐ์—ด๋กœ ์„ ์–ธํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, value๊ฐ€ ์Œ์ˆ˜๊ฐ’์œผ๋กœ ์ฃผ์–ด์งˆ ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ ํ•ด์‹œ๋งต์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์ด ๋” ํšจ์œจ์ ์ด๋ผ๊ณ  ํ•œ๋‹ค.

๐Ÿ’ปํ”ผ๋ณด๋‚˜์น˜ Bottom-Up ์ฝ”๋“œ ๊ตฌํ˜„

public class Fibonacci {
    public int fib(int n) {
        int[] table = new int[n + 1]; // ๋ฐฐ์—ด์€ 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ 1์„ ๋”ํ•ด์ค˜์•ผํ•จ
        return bottomUp(n, table);
    }

    private static int bottomUp(int n, int[] table) {
        // base condition
        table[0] = 0;
        table[1] = 1;

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

        return table[n];
    }
  • ๋ฐฐ์—ด์€ 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ด๋ธ”์„ n+1์˜ ํฌ๊ธฐ๋กœ ํ• ๋‹นํ•˜์˜€๋‹ค.
  • F(n)=F(nโˆ’1)+F(nโˆ’2)(n>=2)F(n) = F(n-1) + F(n-2) (n >= 2)์˜ ์ ํ™”์‹์„ ๋”ฐ๋ฅด๋ฏ€๋กœ, ์‹œ์ž‘์€ 2๋ถ€ํ„ฐ ํ•˜์˜€๋‹ค.
  • for๋ฌธ์—์„œ ์กฐ๊ฑด์‹์„ n + 1๋กœ ํ•œ ์ด์œ ๋Š”, ๊ฒฐ๊ตญ์—๋Š” ํ…Œ์ด๋ธ”์„ n๊นŒ์ง€ ์ฑ„์›Œ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

โš™๏ธ๊ตฌํ˜„ ๋ฐฉ๋ฒ•

โš ๏ธ๊ฐœ๋…์„ ์•„๋ฌด๋ฆฌ ์ถฉ์‹คํžˆ ์ดํ•ดํ–ˆ๋‹ค๊ณ  ํ•ด๋„, ์™„์ „ํƒ์ƒ‰๋ถ€ํ„ฐ DP ๋ฌธ์ œ๋ผ๊ณ  ํŒŒ์•…ํ•˜๊ธฐ๊นŒ์ง€ ์˜ค๋ž˜๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๋ฅผ ๋งŽ์ด ํ’€์–ด๋ณด๋Š” ์ˆ˜ ๋ฐ–์— ์—†์Œ!

  1. ์ผ๋‹จ ์žฌ๊ท€ํ•จ์ˆ˜๋กœ ๋น„ํšจ์œจ์ ์ธ ์™„์ „ํƒ์ƒ‰ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ
  2. ์ค‘๋ณต๋˜๋Š” subproblem์˜ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅ(memoize)

๐Ÿ‘Ž3. Top-down -> Bottom-up์œผ๋กœ ์ฝ”๋“œ ์ „ํ™˜์„ ๊ณ ๋ ค
๐Ÿ‘‰์ž…๋ ฅ ํฌ๊ธฐ, ์„ฑ๋Šฅ, ๊ณต๊ฐ„ ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•  ๋•Œ๋งŒ ๊ณ ๋ ค


๐Ÿ“๋ชฐ๋ก  Bottom-up์˜ table๋กœ ์‚ฌ์šฉ๋˜๋Š” base condition์„ ํ•ด์‹œ๋งต์œผ๋กœ ๊ตฌํ˜„ํ•ด๋„ ์ƒ๊ด€์—†๋‹ค.
๋‹ค๋งŒ, ๊ฐœ์ธ์ ์ธ ๊ฒฌํ•ด๋กœ๋Š” ์ฝ”ํ…Œ์šฉ์œผ๋กœ DP๋ฅผ ํ’€ ๋•Œ Top-down์œผ๋กœ ํ’€๋ฆฌ๋Š” ๋ฌธ์ œ๋ฅผ ๊ตณ์ด ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด์„œ Bottom-up์œผ๋กœ ์ฝ”๋“œ๋ฅผ migrate๋ฅผ ํ•  ํ•„์š”๋Š” ์—†๋‹ค๊ณ  ๋ณธ๋‹ค.(์‹ฌ์ง€์–ด ํ•˜๋“œ์›จ์–ด ์„ฑ๋Šฅ์ด ์ข‹๊ธฐ ๋•Œ๋ฌธ์— ๊ณต๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ณ ๋ คํ•  ํ•„์š”๋„ ์—†๋‹ค.)
๐Ÿ‘๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ ์€, ๋Œ€๋ถ€๋ถ„์˜ ์ ํ™”์‹(reccurence relation)์€ ์žฌ๊ท€๋ฅผ ํ™œ์šฉํ•œ Top-down์œผ๋กœ ๊ตฌํ˜„๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ง๊ด€์ ์ธ ํ’€์ด๋กœ ๋น ๋ฅด๊ฒŒ ๋ฌธ์ œ๋ฅผ ํ’€๊ณ  ์‹ถ๋‹ค๋ฉด Top-down์„ ๊ณ ์ˆ˜ํ•ด๋„ ๋ฌธ์ œ์—†๋‹ค!

๐Ÿฏ๋ฌธ์ œ์—์„œ dp๋กœ ํ’€๋ผ๋Š” ํžŒํŠธ๋“ค

  • ์ตœ๋Œ€ ์ตœ์†Œ, ๋ฐฉ๋ฒ•์˜ ๊ฐœ์ˆ˜ ๋“ฑ์„ ๊ตฌํ•  ๋•Œ
    • ์˜ˆ) ~์˜ ์ตœ์†Œ ๋น„์šฉ์€?, ~์˜ ์ตœ๋Œ€ ์ด์ต์€?, ~๋ฅผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์˜ ๊ฐœ์ˆ˜๋Š”?, What is the longest possible..?, ํŠน์ • ์ง€์ ์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€?
profile
๋ชจ๋“  ์ฝ”๋“œ์—๋Š” ์ด์œ ๊ฐ€ ์žˆ๊ธฐ์— ์›์ธ์„ ํŒŒ์•…ํ•  ๋•Œ๊นŒ์ง€ ์ง‘์š”ํ•˜๊ฒŒ ํƒ๊ตฌํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€