[기초 개념] Dynamic Programing(동적 계획법)

2025. 9. 26. 00:08·Cumputer Science/Algorithm

Dynamic Programing

Dynamic Programing(DP)는 복잡한 문제를 작은 부분 문제(sub problem)로 나누고,

그 결과를 저장하여 재활용하는 방식으로 문제를 푸는 알고리즘 기법이다.

 

즉, DP는 큰 문제를 작은 부분 문제로 쪼개고, 그 답을 저장해가면서 큰 문제를 푸는 방법이다.

 


DP가 필요한 이유

단순 재귀의 한계 (중복 계산)

같은 부분 문제를 여러 번 푸는 비효율 → 예: 피보나치 수열에서 fib(3)이 중복 호출 됨.

 

시간 복잡도 개선

DP를 쓰면 한 번 계산한 결과를 저장해서 O(N) 수준으로 줄일 수 있음.

 


 

DP의 두 가지 핵심 조건

중복되는 부분 문제 (Overlapping Subproblems)

큰 문제를 해결하는 과정에서 동일한 작은 문제가 반복적으로 등장해야 함.

 

최적 부분 구조 (Optimal Substructure)

큰 문제의 최적해가 작은 문제들의 최적해로 구성될 수 있어야 함.

 


 

DP 접근 방식

Top-down (재귀 + 메모이제이션)

큰 문제에서 시작해 재귀적으로 작은 문제로 내려가면서, 계산한 결과를 메모리에 저장.

 

Bottom-up (반복문 + 테이블)

작은 문제에서 차근차근 쌓아 올리며 테이블에 기록 → 반복문 기반이라 더 효율적.

 


DP 문제를 푸는  3단계

1. 상태 정의: dp[i]가 무엇을 의미하는지 정의.

2. 점화식 세우기: dp[i] = ... dp[i-1] ... dp[i-2] ... 같은 규칙 도출.

3. 초기값 설정: dp[1], dp[2]처럼 가장 작은 문제의 해를 명확히 두기.

 

.

.

 

 

DP로 접근할지 판단하는 법

부분 문제가 반복되는가?

최적 부분 구조가 존재하는가?

'Cumputer Science > Algorithm' 카테고리의 다른 글

[기초 개념] Greedy(탐욕법)  (0) 2025.09.26
[Algorithm] DFS(Depth-Frist Search) - 깊이 우선 탐색  (0) 2025.09.19
[Algorithm] BFS(Breadth-First Search) - 너비 우선 탐색  (0) 2025.09.18
'Cumputer Science/Algorithm' 카테고리의 다른 글
  • [기초 개념] Greedy(탐욕법)
  • [Algorithm] DFS(Depth-Frist Search) - 깊이 우선 탐색
  • [Algorithm] BFS(Breadth-First Search) - 너비 우선 탐색
yoonio.h
yoonio.h
#include <yoonio.h> 안녕하세요, 매일매일 성장하는 개발자가 되고 싶은 학생입니다.
  • yoonio.h
    yoonio.h
    yoonio.h
  • 링크

    • Github
  • 전체
    오늘
    어제
    • 분류 전체보기 (112)
      • Project (0)
      • Today I Learned (9)
      • Krafton Jungle (57)
      • Cumputer Science (9)
        • CS:APP (1)
        • Algorithm (4)
        • Data Structure (4)
      • Web Development (12)
        • Troubleshooting Note (2)
        • ORM | JPA (1)
        • Spring Boot (2)
        • JWT (1)
        • React (6)
      • Problem Solving (5)
        • BOJ (5)
      • Web Security (0)
      • Cloud (3)
        • AWS (3)
      • 리눅스마스터 (6)
        • 리눅스의 개요 (2)
        • 리눅스 시스템의 이해 (2)
        • 네트워크의 이해 (1)
        • 네트워크 보안 (1)
      • Study Notes (2)
      • Web Project. Typers (stoppe.. (8)
        • 개요 (1)
        • 협업 (0)
        • 개발 과정 (3)
        • 트러블슈팅 (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 공지사항

  • 인기 글

  • 태그

    백준
    Krafotn Jungle
    typers
    리액트
    spring boot
    리눅스 마스터 2급
    아마존 웹 서비스
    Kreafton Jungle
    크래프톤 정글 11기
    malloc lab
    dynamic programing
    도커
    리눅스 마스터 1급
    크래프톤 정글
    krafton Jungle
    React
    스프링부트
    docker
    SpringBoot
    리눅스 마스터
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
yoonio.h
[기초 개념] Dynamic Programing(동적 계획법)
상단으로

티스토리툴바