다이나믹 프로그래밍(DP)
메모리(배열, 자료구조를 만들어서 사용)를 적극 활용해 수행 속도를 비약적으로 줄이는 기법
메모리제이션(Memorization)
- 계산한 결과를 메모리 공간에 기억
- 같은 문제를 다시 호출 ⏩ 결과를 그대로 가져옴
- 값을 기록 == 캐싱
DP 조건
예시) 피보나치 수열 (점화식을 이용한 수열)
1. 최적 부분 구조
- 큰 문제 ▶ 작은 문제 ⏩ 작은 문제들을 모아서 큰 문제 해결
2. 중복되는 부분 문제
- 작은 문제들이 반복되어야 한다.
탑 다운(하향식)
- 재귀를 이용
바텀 업(상향식)
- 반복문을 이용
분할 정복과의 차이점 = 부분 문제의 중복 여부
- DP와 분할 정복은 모두 최적 부분 구조를 가질 때 사용! ( 큰 문제 ⏩ 작은 문제 )
- DP는 각 부분 문제들이 서로 영향을 미치며 부분 문제가 중복
- 분할 정복은 동일 부분 문제의 반복 ❌
- ex) 트리 구조 ⏩ 하위 트리들이 합쳐져서 상위 트리 🔜 DP
코딩테스트에서 단번에 DP 유형 파악하기
- DFS/BFS로 풀 수는 있지만, 경우의 수가 너무 많은 문제
- 경우의 수들에 중복적인 연산이 많은 문제
공부방법
- 오래 붙잡지 말기. 30분정도만 고민하기.
많이 경험하는 수밖에없다. DP 사고방식을 습득해야함 - 현재 단계까지의 연산 정보들을 어떻게 남겨둘지 집중
- 어떻게 누적시킬지도 고민
참고:
https://www.youtube.com/watch?v=5Lu34WIx2Us&list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC&index=6
https://www.youtube.com/watch?v=0bqfTzpWySY
'알고리즘' 카테고리의 다른 글
카카오 2022 신고결과 받기 (0) | 2022.09.12 |
---|---|
백준 2447 "별 찍기 - 10" (0) | 2022.07.17 |
[정렬] 프로그래머스 - H-index (0) | 2022.07.11 |
[완전탐색] 프로그래머스 - 카펫 (0) | 2022.07.10 |
[DPS] 프로그래머스 - 단어 변환 (0) | 2022.07.09 |