Devlog/DS & Algorithms

[알고리즘] Dynamic Programming

FATKITTY 2022. 8. 6. 03:51
반응형

✅ 동적계획법 (Dynamic Programming)

❕ 기본 개념 

- 복잡한 문제를 간단한 여러 개의 문제로 나누어 푸는 방법

- 일반적인 재귀 방식과 매우 유사하지만, 작은 문제들이 여러번 반복되는 비효율적인 계산을 피할 수 있음

 

해당 알고리즘이 필요한 문제의 조건은 아래와 같다.

1. 겹치는 부분 문제 (Overlapping Subproblems)

: DP는 문제를 작은 문제들로 나누고 그 결과값들을 재활용해서 전체 답을 구한다. 따라서 동일한 부분 문제들이 반복하여 나타나고, 부분 문제가 중복되는 경우에 사용 가능하다.

2. 최적 부분 구조 (Optimal Substructure)

: 부분 문제의 최적 결과 값을 사용해 전체 문제의 최적해를 낼 수 있는 경우를 의미한다.

 

 

❕ 작동 방식 

 

피보나치 수열 구현: 재귀 vs. DP

DP를 통해 시간복잡도는 O(n2)  → O(f(n))으로 개선됨

 

 

✔ 활용 예시 

- 최장 공통 부분 수열: 두 개 이상의 수열의 공통 부분수열 중 가장 긴 수열을 찾는 알고리즘

- 배낭 문제: 조합 최적화

- 벨먼-포드 알고리즘

- 다익스트라 알고리즘: 시작점과 다른 점들 사이의 최단경로를 찾아내는 알고리즘

 

✔ 문제 예시 

- 피보나치 수열

- 최단 경로 문제

 

 

✔ 구현 방법 (JS) 

1. Top-down with Memoization

const fibWithMemo = (n) => {
  let memo = {}; // we will store("memoize") our values here

  const fib = (n) => {
    let value;

    if (n in memo) {
      // if the n is already in our memo object, we look it up and store it in value
      value = memo[n];
    } else {
      // otherwise, we calculate it and store it in value
      if (n === 1 || n === 2) {
        value = 1;
      } else {
        value = fib(n - 1) + fib(n - 2);
      }
      // store the value for current n to our memo object
      memo[n] = value;
    }
    console.log(memo);
    return value;
  };
  return fib(n);
};

 

2. Bottom-up with Tabulation

const fibWithTab = (n) => {
  if (n === 1 || n === 2) return 1;
  // initialize an array and store the values we already know
  let fibNums = [0, 1, 1];
  // loop starting at index 3 (first value we do not know) until n
  for (let i = 3; i <= n; i++) {
    // store values in the array at Nth index
    fibNums[i] = fibNums[i - 1] + fibNums[i - 2];
  }
  return fibNums[n];
};

 

 

참고자료

https://ko.wikipedia.org/wiki/동적_계획법

https://hongjw1938.tistory.com/47

https://www.geeksforgeeks.org/dynamic-programming/

https://medium.com/swlh/demystifying-dynamic-programming-b22d65095866

 

반응형

'Devlog > DS & Algorithms' 카테고리의 다른 글

[알고리즘] 이진 탐색  (0) 2022.08.16
[알고리즘] Greedy Algorithm  (0) 2022.08.06
[알고리즘] 계수 정렬  (0) 2022.08.06
[알고리즘] 퀵 정렬  (0) 2022.08.05
[알고리즘] 삽입 정렬  (0) 2022.08.05