알고리즘(Java)/알고리즘 정리

[알고리즘] Dynamic Programming(동적 계획법)

HSY_mumu 2022. 7. 24. 23:25
728x90

1.  동적 계획법(DP)란?

- 메모리를 적절히 사용하여 수행 시간 효율성을 비약적으로 향상시키는 방법
- 이미 계산된 결과(작은 문제)는 별도의 메모리 영역에 저장하여 다시 계산X

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

2.  DP vs 분할 정복

DP 분할 정복
각 부분 문제들이 서로 영향을 미치며 부분 문제가 중복됨 동일한 부분 문제가 반복적으로 계산되지 X
최적 부분 구조를 가질 때 사용 O
(큰 문제를 작은 문제로 나눌 수 있고 작은 문제의 답을 모아 큰 문제를 해결할 수 있는 상황)

3.  DP의 2가지 방식

1. Top-Down(하향식)

- 재귀 이용

- 메모이제이션 기법 활용

<메모이제이션(Memoization)>
- 한 번 계산한 결과를 메모리 공간에 메모하는 기법(캐싱)
- 다이나믹 프로그래밍 구현 기법(하향식)이지만 다이나믹 프로그래밍을 위해 활용하지 않을 수도 있음(큰 개념임)

 

2. Bottom-Up(상향식)

- 반복문 이용

- 다이나믹 프로그래밍의 전형적인 형태
- 결과 저장용 리스트: DP 테이블

4. DP 사용 조건

1. 최적 부분 구조
- 큰 문제를 작은 문제로 나눌 수 있으며 작은 문제의 답을 모아서 큰 문제 해결O
2. 중복되는 부분 문제
- 동일한 작은문제를 반복적으로 해결해야 함

 

<다이나믹 프로그래밍 문제에 접근하는 방법>
- 주어진 문제가 다이나믹 프로그래밍 유형임을 파악하는 것이 중요!
- 그리디, 구현, 완전 탐색 등의 아이디어로 문제를 해결할 수 있는지 검토한 후 다이나믹 프로그래밍 고려
- 재귀 함수로 비효율적인 완전 탐색 프로그램을 작성한 후 작은 문제에서 구한 답이 큰 문제에 그대로 사용된다면 메모이제션을 활용해 코드 개선
- 일반적인 코딩 테스트 수준에서는 기본 유형의 다이나믹 프로그래밍 문제가 출제되는 경우가 많음

 

 

 

728x90