[알고리즘] 다이나믹 프로그래밍 (Dynamic Programming)

헛헛한꿔녀니·2023년 12월 6일
0

알고리즘

목록 보기
8/9
post-thumbnail

💡 다이나믹 프로그래밍 (Dynamic Programming)

👉 동적 계획법

👉 큰 문제를 부분 문제로 나눈 후 답을 찾아가는 과정에서, 계산된 결과를 기록하고 재활용하며 문제의 답을 구하는 방식이다.

👉 중간 계산 결과를 기록하기 위한 메모리가 필요하다.

👉 한 번 계산한 부분을 다시 계산하지 않기 때문에 속도가 빠르다.


💡 다른 알고리즘과의 차이점

👉 분할 정복과의 차이

  • 분할 정복은 부분 문제가 중복되지 않는다.
  • DP는 부분 문제가 중복되어 재활용에 사용된다.

👉 그리디 알고리즘과의 차이

  • 그리디 알고리즘은 순간의 최선을 구하는 방식이다. (근사치를 구한다.)
  • DP는 모든 방법을 확인 후 최적해를 구하는 방식이다.

💡 다이나믹 프로그래밍 예시

👉 피보나치 수열

  • 피보나치 수열을 기본 재귀로 풀게 되면
    f(n) = f(n-1) + f(n-2)
    ex. f(5) = f(4) + f(3) 을 구하기 위한 연산들을 하고 f(3)을 다시 구하려면
    f(3) = f(2) + f(1) 연산을 다시해줘야 한다.
    따라서 n의 수가 높아지면 해야하는 연산도 많아진다.
  • 피보나치 수열을 DP를 적용해서 풀게 되면
    f(n) = f(n-1) + f(n-2)
    ex. f(5) 를 구하기 위한 연산들을 모두 기록해놓기 때문에 f(3)을 다시 구할 때 재귀 풀이처럼 다시 연산을 하는 것이 아닌, 기록된 정보를 가져온다.
    메모리는 필요하지만 중복된 연산을 하지 않기 때문에 속도가 빠르다.

💡 다이나믹 프로그래밍 방법

👉 타뷸레이션 (Tabulation)

  • 상향식 접근 방법 (Bottom Up)
  • 작은 하위 문제부터 풀면서 올라간다.
  • 모두 계산하면서 차례대로 진행하는 방법

👉 메모이제이션 (Memoization)

  • 하향식 접근 방법 (Top Down)
  • 큰 문제에서 하위 문제를 확인해가면서 진행한다.
  • 계산이 필요한 순간에 계산하면서 진행하는 방법

0개의 댓글