algorithms-dyanmic-programming.md

๐Ÿก

๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ Dynamic Programming๐Ÿ’ƒ (with fibonacci)

๐Ÿ“Œ ์บ์‹ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ์ตœ์ ํ™” ๊ธฐ๋ฒ•

  • ์ตœ์ ํ™” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ
  • ์ค‘๋ณต๋œ ์—ฐ์‚ฐ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
  • ์ž‘์€ ํ•˜์œ„ ๋ฌธ์ œ๋“ค์˜ ํ•ด๊ฒฐ์ฑ…์„ ์กฐํ•ฉ โ‡’ ์ „์ฒด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ

๐Ÿ“Œ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์˜ˆ์ œ

  • ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด
  • Longest Common Substring (์ตœ์žฅ ๊ณตํ†ต ๋ถ€๋ถ„ ๋ฌธ์ž์—ด)
  • 0/1 Knapsack Problem (0/1 ๋ฐฐ๋‚ญ ๋ฌธ์ œ)
  • ๊ทธ๋ž˜ํ”„์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ

    ๐Ÿ“Œ ์ถ”๊ฐ€ ๋ฌธ์ œ

  1. House Robber
  2. Best Time to Buy and Sell Stock
  3. Climbing Stairs

    CodeSandbox : ์ฝ”๋“œ ์ƒŒ๋“œ๋ฐ•์Šค ์˜ˆ์ œ ํŽ˜์ด์ง€

๋™์ (๋‹ค์ด๋‚˜๋ฏน) ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ž€?

  • ๋ถ„ํ•  ์ •๋ณต Divide & Conquer๊ณผ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ Memozation์˜ ๊ฒฐํ•ฉ์ž…๋‹ˆ๋‹ค.

๐Ÿค” ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ณ ๋ คํ•˜๊ธฐ

  1. ๋ฌธ์ œ๋ฅผ ํ•˜์œ„ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š”๊ฐ€? - recursion
  2. ์žฌ๊ท€๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๋ฌธ์ œ์ธ๊ฐ€? - tree
  3. ํ•˜์œ„ ๋ฌธ์ œ๊ฐ€ ๋ฐ˜๋ณต์ ์ธ๊ฐ€? - yes
  4. Memoizeํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? - let's go!

๐Ÿ‘‰ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ํ•˜์œ„ ๋ฌธ์ œ๋กœ ์ชผ๊ฐค ์ˆ˜ ์žˆ๊ณ , ๋ฐ˜๋ณต์ ์ธ ์žฌ๊ท€ ํ•ด๊ฒฐ์ฑ…๋“ค์˜ ํ•ด๊ฒฐ์ฑ… ๋˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์บ์‹ฑํ•˜์—ฌ, ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

1. Overlapping Subproblems ์ค‘๋ณต๋˜๋Š” ํ•˜์œ„ ๋ฌธ์ œ

  • ํฐ ๋ฌธ์ œ๋ฅผ ํ•˜์œ„ ๋ฌธ์ œ๋กœ ์ชผ๊ฐญ๋‹ˆ๋‹ค.
  • ํ•˜์œ„ ๋ฌธ์ œ๋“ค์€ ์„œ๋กœ ์ค‘๋ณต๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ค‘๋ณต๋œ ํ•˜์œ„ ๋ฌธ์ œ๋“ค์„ ํ•œ ๋ฒˆ๋งŒ ํ•ด๊ฒฐํ•˜๊ณ  ์ €์žฅํ•˜์—ฌ, ์ค‘๋ณต๋œ ๊ณ„์‚ฐ์„ ํ”ผํ•ฉ๋‹ˆ๋‹ค.

2. Optimal Substructure ์ตœ์  ๋ถ€๋ถ„ ๊ตฌ์กฐ

  • ๋ถ€๋ถ„ ๋ฌธ์ œ์˜ ์ตœ์  ํ•ด๊ฒฐ์ฑ…์„ ์กฐํ•ฉํ•˜์—ฌ ์ตœ์ ์˜ ํ•ด๊ฒฐ์ฑ…์„ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.

3. Top-down + Memoization ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ๐Ÿ“Œ

  • ํ•˜์œ„ ๋ฌธ์ œ์˜ ํ•ด๊ฒฐ์ฑ…์„ ์ €์žฅํ•˜๊ณ  ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

4. Bottom-up Approach

  • ๋ถ€๋ถ„ ๋ฌธ์ œ์˜ ์ตœ์  ํ•ด๊ฒฐ์ฑ…์„ ๊ตฌํ•œ ํ›„, ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ ์ „์ฒด ๋ฌธ์ œ์˜ ์ตœ์  ํ•ด๊ฒฐ์ฑ…์„ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.

Memoization

์บ์‹ฑ Caching

  • ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค.
  • algorithms\dynamic-programming\memoizationDP.js
let cache = {
  // property์— ์ ‘๊ทผ : O of One Time
  1: 81,
};

function memoizedAddTo80(n) {
  if (n in cache) {
    return cache[n];
  } else {
    console.log("์ฒ˜๋ฆฌ ์ค‘...");
    cache[n] = n + 80;
    return cache[n];
  }
}

console.log("์ฒซ ๋ฒˆ์งธ: ", memoizedAddTo80(1)); // 81, ์—ฐ์‚ฐ ํ›„ ์บ์‹ฑ
console.log("๋‘ ๋ฒˆ์งธ: ", memoizedAddTo80(1)); // 81, O of One

ํด๋กœ์ € Closer

  • global ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹Œ ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • algorithms\dynamic-programming\memoizationDPWithCloser.js
function memoizedAddTo80WithCloser(n) {
  let cache = {};

  return function (n) {
    if (n in cache) {
      return cache[n];
    } else {
      console.log("์ฒ˜๋ฆฌ ์ค‘...");
      cache[n] = n + 80;
      return cache[n];
    }
  };
}

const memoized = memoizedAddTo80WithCloser(); // cache ๋ณ€์ˆ˜์™€ ๋‚ด๋ถ€ ํ•จ์ˆ˜ ๋ฐ˜ํ™˜

console.log("์ฒซ ๋ฒˆ์งธ: ", memoized(1)); // 81, ์—ฐ์‚ฐ ํ›„ ์บ์‹ฑ
console.log("๋‘ ๋ฒˆ์งธ: ", memoized(5)); // 85, ์—ฐ์‚ฐ ํ›„ ์บ์‹ฑ
console.log("์„ธ ๋ฒˆ์งธ: ", memoized(5)); // 85, O of One
  • ํด๋กœ์ €๋ฅผ ์ด์šฉํ•˜์—ฌ cache ๊ฐ์ฒด๋ฅผ ์„ ์–ธํ•˜๊ณ , ํ•ด๋‹น ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ€์ˆ˜ ํ™˜๊ฒฝ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ๋ณ€์ˆ˜ ํ™˜๊ฒฝ์—์„œ cache ๊ฐ์ฒด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ด๋ฏธ ๊ณ„์‚ฐ๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ, ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ๊ฐ’์„ ์บ์‹ฑํ•˜๊ณ  ์žฌ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์‹คํ–‰ ์ปจํ…์ŠคํŠธ ๋‚ด๋ถ€์˜ ๋ณ€์ˆ˜ ํ™˜๊ฒฝ์— ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

      โœ๏ธ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ

      ์ฝ”๋“œ ์‹คํ–‰์— ํ•„์š”ํ•œ ๋ณ€์ˆ˜, ํ•จ์ˆ˜ ์„ ์–ธ, ๋งค๊ฐœ๋ณ€์ˆ˜ ๋“ฑ์˜ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ์Šคํƒ(Stack) ์ž๋ฃŒ๊ตฌ์กฐ ํ˜•ํƒœ(LIFO)

      • ๊ตฌ๋ถ„: Variable Environment, Lexical Environment, This Binding
      • ์ƒ์„ฑ: ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ
      • ์ œ๊ฑฐ: ํ•จ์ˆ˜ ์‹คํ–‰์ด ์ข…๋ฃŒ๋  ๋•Œ
  • ํด๋กœ์ € ํ•จ์ˆ˜๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๋ฅผ ๋ฌป๋Š”๋‹ค๋ฉด...

    console.log("์ฒซ ๋ฒˆ์งธ: ", memoizedAddTo80WithCloser()(1));
    console.log("๋‘ ๋ฒˆ์งธ: ", memoizedAddTo80WithCloser()(1));
    

    โœ๏ธ **memoizedAddTo80WithCloser()**ํ•จ์ˆ˜๋Š” ๋‚ด๋ถ€์—์„œ ์บ์‹ฑ์„ ์œ„ํ•œ **cache**๋ณ€์ˆ˜์™€ ๋‚ด๋ถ€ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    ๋งค๋ฒˆ memoizedAddTo80WithCloser() ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค cache ๊ฐ์ฒด๊ฐ€ ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— cache ๊ฐ์ฒด์— ์ €์žฅ๋œ ๊ฐ’์€ ์žฌ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ณ  ๋งค๋ฒˆ ์ƒˆ๋กœ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค.

    ์ฆ‰,**memoizedAddTo80WithCloser()(1)**๊ณผ memoizedAddTo80WithCloser()(1) ์˜ ๊ฒฐ๊ณผ๋Š” ์„œ๋กœ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ๋ณ€์ˆ˜๋ฅผ ํ•จ์ˆ˜๊ฐ€ ์ตœ์ดˆ ํ˜ธ์ถœ๋  ๋•Œ cache ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ณ , ์ดํ›„ ํ˜ธ์ถœ์—์„œ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋Š” ์บ์‹ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


Fibonacci ํ”ผ๋ณด๋‚˜์น˜ ๋ฐฐ์—ด

Recursion ์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”ผ๋ณด๋‚˜์น˜ ๋ฐฐ์—ด

  • O(2^N) : O of Two the the power of N
  • 9๋ฒˆ์งธ index๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด, 109๋ฒˆ์˜ ๊ณ„์‚ฐ์ด ํ•„์š”ํ•จ
  • 20๋ฒˆ์งธ index๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด, 21891๋ฒˆ์˜ ๊ณ„์‚ฐ์ด ํ•„์š”ํ•จ
let cacluations = 0;
function fibonacci(n) {
  cacluations++;

  if (n < 2) {
    return n;
  }
  return fibonacci(n - 1) + fibonacci(n - 2);
}

const fibonacciIndex = 9;
const fibonacciNumber = fibonacci(fibonacciIndex);

console.log(`
  fibonacciIndex: ${fibonacciIndex}, 
  fibonacciNumber: ${fibonacciNumber}, 
  cacluations: ${cacluations}
`);

ํ”ผ๋ณด๋‚˜์น˜์™€ Dynamic Programming : ๋ฐ˜๋ณต๋˜๋Š” ํ•˜์œ„ ๋ฌธ์ œ์˜ ํ•ด๊ฒฐ์ฑ…

  • ๋ฐ˜๋ณต๋˜๋Š” ํ•˜์œ„ ๋ฌธ์ œ
    • ํ•˜์œ„ ๋ฌธ์ œ์˜ ๊ณ„์‚ฐ์„ ์บ์‹ฑํ•˜์—ฌ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      • fib(1), fib(2), fib(3)โ€ฆ ์™€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐ˜๋ณต๋ฉ๋‹ˆ๋‹ค.

๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ ์ ์šฉํ•˜๊ธฐ

๐Ÿ“Ž Top-down ๋ฐฉ์‹์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์žฌ๊ท€์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ์‹์—์„œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋•Œ, ์ค‘๋ณต๋˜๋Š” ๊ณ„์‚ฐ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด memoization(๋ฉ”๋ชจ์ด์ œ์ด์…˜)์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ๋ฌธ์ œ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋ฉด์„œ ์ด๋ฏธ ๊ณ„์‚ฐํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจํ•ด ๋†“๊ณ , ๊ฐ™์€ ๊ณ„์‚ฐ์ด ๋‹ค์‹œ ๋‚˜ํƒ€๋‚˜๋ฉด ๋ฉ”๋ชจํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ค‘๋ณต ๊ณ„์‚ฐ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์–ด์„œ ๊ณ„์‚ฐ ์†๋„๋ฅผ ๋Œ€ํญ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Top down + memoization ๋ฐฉ์‹ / ํ•˜ํ–ฅ์‹ ์•”๊ธฐ๋ฒ•
  • algorithms\dynamic-programming\fibonacciDP.js
let cacluations = 0;

function fibonacciFn() {
  let cache = {}; // ํ•ด์‹œ ํ…Œ์ด๋ธ”์— ํ”ผ๋ณด๋‚˜์น˜ ๊ณ„์‚ฐ๊ฐ’์„ ์บ์‹ฑํ•ฉ๋‹ˆ๋‹ค.

  return function fib(n) {
    cacluations++;
    if (n in cache) {
      return cache[n];
    } else {
      if (n < 2) {
        return n;
      } else {
        cache[n] = fib(n - 1) + fib(n - 2);
        return cache[n];
      }
    }
  };
}

const fibDP = fibonacciFn(); // ๋ณ€์ˆ˜์— ํ•จ์ˆ˜๋ฅผ ํ• ๋‹น

const fibonacciIndex = 20;
const fibonacciNumber = fibDP(fibonacciIndex);

// if fibonacciIndex: 9, cacluations: 109
// O of Two to the Power of N
console.log(`
Caculate Fibonacci with DP
-----------------------------
fibonacciIndex: ${fibonacciIndex}, 
fibonacciNumber: ${fibonacciNumber}, 
cacluations: ${cacluations}
`);

ํ”ผ๋ณด๋‚˜์น˜ ๋ฐฐ์—ด : O(**2^n**) โ‡’ O(n)

  • ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ†ตํ•ด ๋ชจ๋“  ์—ฐ์‚ฐ๋ฅผ ํ•œ ๋ฒˆ์”ฉ ์‹คํ–‰ํ•˜๋Š”, O(n)์˜ ์†๋„๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
    • ๊ณต๊ฐ„ ๋ณต์žก์„ฑ Space Complexity์ด ์˜ฌ๋ผ๊ฐ
    • ์‹œ๊ฐ„ ๋ณต์žก์„ฑ Time Complexity์ด ๋‚ฎ์•„์ง
  • ํ”ผ๋ณด๋‚˜์น˜๋Š” ์‹œ๊ฐ„ ๋ณต์žก์„ฑ ์ ˆ์•ฝ์ด ์•„์ฃผ ํฐ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ฐฉ๋ฒ• : Bottom up

๐Ÿ“Ž Bottom-up ๋ฐฉ์‹์€ ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ฃผ์–ด์ง„ ๋ฌธ์ œ์˜ ํ•ด๊ฒฐ์„ ์œ„ํ•ด, ์ž‘์€ ๋ถ€๋ถ„ ๋ฌธ์ œ๋“ค์˜ ํ•ด๊ฒฐ์„ ๋จผ์ € ๊ตฌํ•˜๊ณ , ์ด๋“ค์˜ ํ•ด๊ฒฐ ๊ฒฐ๊ณผ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ณด๋‹ค ํฐ ๋ฌธ์ œ์˜ ํ•ด๊ฒฐ์„ ์ฐจ๋ก€๋Œ€๋กœ ๊ตฌํ•ด๋‚˜๊ฐ€๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

  • Bottom-up ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ฃผ์–ด์ง„ ๋ฌธ์ œ์˜ ํ•ด๊ฒฐ์„ ์œ„ํ•ด, ์ž‘์€ ๋ถ€๋ถ„ ๋ฌธ์ œ๋“ค์˜ ํ•ด๊ฒฐ์„ ๋จผ์ € ๊ตฌํ•˜๊ณ , ์ด๋“ค์˜ ํ•ด๊ฒฐ ๊ฒฐ๊ณผ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ณด๋‹ค ํฐ ๋ฌธ์ œ์˜ ํ•ด๊ฒฐ์„ ์ฐจ๋ก€๋Œ€๋กœ ๊ตฌํ•ด๋‚˜๊ฐ€๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

    • Bottom-up ๋ฐฉ์‹์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์žฌ๊ท€ ํ˜ธ์ถœ์— ๋น„ํ•ด ๋ฐ˜๋ณต๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.
    • ์ฝ”๋“œ๊ฐ€ ๋” ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์œผ๋‚˜, ๋ชจ๋“  ๋ถ€๋ถ„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ์–ป์–ด๋‚ด๋Š” ๊ณผ์ •์ด ๋ช…ํ™•ํ•˜๊ณ  ์ง๊ด€์ ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ƒํ™ฉ์— ๋”ฐ๋ผ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ”ผ๋ณด๋‚˜์น˜ ์˜ˆ์‹œ

    // fibonacciBottomUp ํ•จ์ˆ˜ ์ •์˜, n์„ ์ธ์ž๋กœ ๋ฐ›์Œ
    function fibonacciBottomUp(n) {
      // ์ดˆ๊ธฐ๊ฐ’ ์„ค์ •
      let answer = [0, 1];
    
      for (let i = 2; i <= n; i++) {
        answer.push(answer[i - 2] + answer[i - 1]);
        // i-2๋ฒˆ์งธ์™€ i-1๋ฒˆ์งธ ํ•ญ์„ ๋”ํ•œ ๊ฐ’์„ answer ๋ฐฐ์—ด์— ์ถ”๊ฐ€
      }
    
      // ๊ตฌํ•œ ๊ฐ’๋“ค ์ค‘ n๋ฒˆ์งธ ๊ฐ’ ๋ฐ˜ํ™˜
      return answer.pop();
    }
    

    ๐Ÿ“Ž ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ answer ๋ฐฐ์—ด์„ ์„ ์–ธํ•˜๊ณ , ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ [0, 1]์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ for ๋ฌธ์„ ํ†ตํ•ด ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•  ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๋ฉฐ, ๋งˆ์ง€๋ง‰์— answer.pop()์„ ํ†ตํ•ด n๋ฒˆ์งธ ํ•ญ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    Bottom-up ๋ฐฉ์‹์—์„œ๋Š” ๊ณ„์‚ฐํ•ด์•ผ ํ•˜๋Š” ๊ฐ’์„ ์ž‘์€ ๋‹จ์œ„๋ถ€ํ„ฐ ๊ณ„์‚ฐํ•ด๋‚˜๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ์žฌ๊ท€ ํ˜ธ์ถœ์— ๋น„ํ•ด ๋” ๋น ๋ฅธ ์†๋„๋กœ ์ˆ˜์—ด์„ ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก  ๐ŸŒฑ

  1. ์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ˜๋ณต์ ์ธ ์—ฐ์‚ฐ์„ ํ•˜๋Š” ํ•จ์ˆ˜์— ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. closer๋ฅผ ์˜์‹์ ์œผ๋กœ ํ™œ์šฉํ•ด๋ณด์ž.
  3. ๋™์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•œ ์˜ˆ์ œ๋ฅผ ํ’€์–ด๋ณด์ž.
  • ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด
  • Longest Common Substring (์ตœ์žฅ ๊ณตํ†ต ๋ถ€๋ถ„ ๋ฌธ์ž์—ด)
  • 0/1 Knapsack Problem (0/1 ๋ฐฐ๋‚ญ ๋ฌธ์ œ)
  • ๊ทธ๋ž˜ํ”„์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ
  • House Robber
  • Best Time to Buy and Sell Stock
  • Climbing Stairs
  1. ์ฝ˜์†” ๋‚ด์šฉ์ฒ˜๋Ÿผ calcuations ํšŸ์ˆ˜๋ฅผ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.