Programming/Algorithm

동적 계획법

ParkJinseok 2021. 10. 28. 12:51

동적 계획법(Dynamic Programming)

    • 분할 정복 기법과 많은 부분이 비슷함.
    • 같은 부분 문제를 다시 풀지 않도록 하는 것이 핵심
      ex)한번 푼 문제의 답을 저장하고 다음에 다시 풀어야 할 때는 그 문제에 대한 해답만 이용하는 방법
    • 메모이제이션(Memoization)
      • 문제를 풀 떄마다 이미 풀린 문제인지를 먼저 확인하는데, 풀린 문제이면 저장된 답을 이용하고 풀리지 않은 문제이면 그 문제를 풀고 답을 저장한다.
      • 하향식(Top-bottom)식으로 문제를 해결
    • 테이블화(Tabulation)
      • 결과를 저장할 테이블을 먼저 만든다. 다음으로 답이 이미 알려진 상황인 기반 상황(Base Case)에 대한 테이블 항목을 먼저 채우고, 이를 바탕으로 테이블을 채워 올라간다.

동적 계획법을 이용한 문제 해결 전략

    • 동적 계획법을 적용하려면 아래의 같은 두 가지 특성을 가져야 함.
      • 겹치는 부분 문제(Overlapping subproblem)
        • 동일한 부분 문제들이 중복해서 발생하는 것.
      • 최적 부분 구조(Optimal Structure)
        • 부분 문제의 최적해들을 이용하면 전체문제의 최적해를 구할 수 있는 구조를 의미함.
    • 메모이제이션과 테이블화를 동시에 사용 가능할 경우
      • 순환 호출의 부담이 없는 테이블화가 시간적으로 좀 더 유리함.
      • 테이블을 함수 밖에서 생성할 필요가 없으므로 코드의 모듈화에서도 유리함.
      • 어떤 부분 문제가 먼저 해결될지 예측하기 어려운 경우라면 메모이제이션이 유리함.

'Programming > Algorithm' 카테고리의 다른 글

공간 복잡도를 이용한 시간 복잡도 줄이기  (0) 2021.10.27
분할 정복 기법  (0) 2021.10.21
축소 정복 기법  (0) 2021.10.21
억지 기법과 완전 탐색  (0) 2021.10.19
점근적 성능 분석 방법  (0) 2021.10.12