동적 계획법 (Dynamic Programming)

2022. 8. 28. 05:24·CS 공부/알고리즘

개념 요약

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

 

 

구체적 개념

흔히 말하는 DP가 바로 '동적 계획법' 이다. 

한 가지 문제에 대해서, 단 한 번만 풀도록 만들어주는 알고리즘이다.

즉, 똑같은 연산을 반복하지 않도록 만들어준다. 실행 시간을 줄이기 위해 많이 이용되는 수학적 접근 방식의 알고리즘이라고 할 수 있다.

 

동적 계획법은 Optimal Substructure에서 효과를 발휘한다.

Optimal Substructure : 답을 구하기 위해 이미 했던 똑같은 계산을 계속 반복하는 문제 구조

 

 

 

접근 방식

커다란 문제를 쉽게 해결하기 위해 작게 쪼개서 해결하는 방법인 분할 정복과 매우 유사하다.

하지만 간단한 문제로 만드는 과정에서 중복 여부에 대한 차이점이 존재한다.

즉, 동적 계획법은 간단한 작은 문제들 속에서 '계속 반복되는 연산'을 활용하여 빠르게 풀 수 있는 것이 핵심이다.

 

 

 

조건

  • 작은 문제에서 반복이 일어난다.
  • 같은 문제는 항상 정답이 같다.

이 두 가지 조건이 충족한다면, 동적 계획법을 이용하여 문제를 풀 수 있다.

같은 문제가 항상 정답이 같고, 반복적으로 일어난다는 점을 활용해 메모이제이션(Memoization)으로 큰 문제를 해결해나가는 것이다.

 

※ 메모이제이션(Memoization) : 한 번 계산한 문제는 다시 계산하지 않도록 저장해두고 활용하는 방식

 

→ 피보나치 수열에서 재귀를 활용하여 풀 경우, 같은 연산을 계속 반복함을 알 수 있다.

이때, 메모이제이션을 통해 같은 작업을 되풀이 하지 않도록 구현하면 효율적이다.

 

 

fibonacci(5) = fibonacci(4) + fibonacci(3)
fibonacci(4) = fibonacci(3) + fibonacci(2)
fibonacci(3) = fibonacci(2) + fibonacci(1)

이처럼 같은 연산이 계속 반복적으로 이용될 때, 메모이제이션을 활용하여 값을 미리 저장해두면 효율적

 

피보나치 구현에 재귀를 활용했다면 시간복잡도는 O(2^n)이지만, 동적 계획법을 활용하면 O(N)으로 해결할 수 있다.

 

 

 

 

구현 방식

  • Bottom-up : 작은 문제부터 차근차근 구하는 방법
  • Top-down : 큰 문제를 풀다가 풀리지 않은 작은 문제가 있다면 그때 해결하는 방법 (재귀 방식)

 

Bottom-up은 해결이 용이하지만, 가독성이 떨어지고

Top-down은 가독성이 좋지만, 코드 작성이 힘들다.

 

 

 

결론

동적 계획법으로 문제를 풀 때는, 우선 작은 문제부터 해결해나가보는 것이 좋다.

작은 문제들을 풀어나가다보면 이전에 구해둔 더 작은 문제들이 활용되는 것을 확인하게 된다. 이에 대한 규칙을 찾았을 때 점화식을 도출해내어 동적 계획법을 적용시키자

'CS 공부 > 알고리즘' 카테고리의 다른 글

큐(Queue) 두 개로 스택(Stack) 구현하기  (0) 2023.08.08
스택(Stack) 두 개로 큐(Queue) 구현하기  (0) 2023.08.08
계수 정렬(Counting Sort)  (0) 2022.08.21
해시 테이블 (Hash Table)  (0) 2022.08.20
기수 정렬 (Radix Sort)  (0) 2022.08.13
'CS 공부/알고리즘' 카테고리의 다른 글
  • 큐(Queue) 두 개로 스택(Stack) 구현하기
  • 스택(Stack) 두 개로 큐(Queue) 구현하기
  • 계수 정렬(Counting Sort)
  • 해시 테이블 (Hash Table)
횰쓰
횰쓰
개발 성장 블로그입니다
  • 횰쓰
    횰쓰토리
    횰쓰
  • 전체
    오늘
    어제
    • 분류 전체보기
      • CS 공부
        • 운영체제
        • 네트워크
        • 컴퓨터구조
        • 데이터베이스
        • 알고리즘
        • 소프트웨어공학
        • 자료구조
        • 웹
      • 프로그래밍
        • Python
        • NodeJS
      • 프로젝트
        • React 프로젝트
      • 개발도구
        • Git
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    페이지 교체
    SQL/NOSQL
    경쟁상태(Race Condition)
    프로세스 주소공간
    운영체제
    Push-force
    4 way handshake
    AVL트리
    3 Way Handshake
    Max힙
    큐
    멀티 프로세스
    tcp
    포화이진트리
    자가균형 이진탐색트리
    Min힙
    둘만의 암호
    RB트리
    멀티 스레드
    카드뭉치
    최태성인강
    한국사능력검정시험 심화
    RB Tree
    Sync/Async
    Git
    chrome
    스택
    이진탐색트리
    전이진트리
    리스트정렬여부
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
횰쓰
동적 계획법 (Dynamic Programming)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.