알고리즘 초보 탈출: DP(동적계획법)을 명확하게 이해하는 방법

2025. 6. 29. 20:52·CS/알고리즘 & 자료구조
728x90
반응형

알고리즘을 처음 공부할 때, 많은 사람들이 어려워하는 개념이 바로 "동적계획법(DP)"입니다. 이 글에서는 DP를 어떻게 접근하고, 어떤 기준으로 적용할지 명확히 이해할 수 있도록 안내하겠습니다.

 

📌 동적계획법(DP)이 어려운 이유

DP는 문제를 작은 문제로 나누고, 그 결과를 활용하여 큰 문제를 해결하는 방식입니다. 하지만 처음부터 DP가 적용된다는 것을 떠올리기 쉽지 않죠. 문제를 보면 막막하게 느껴지기 때문입니다.

📌 DP를 명확히 적용하는 3가지 기준

다음의 기준을 보고 DP 적용 여부를 쉽게 판단해보세요.

  1. 반복되는 부분 문제가 있는가?
  2. 배수, 비율 등 간단한 규칙으로 최적이 가능한가? (그리디로 해결 가능)
  3. 작은 문제의 해답을 큰 문제에서 활용할 수 있는가? (점화식 판단)

이 기준을 충족하면 DP로 접근할 가능성이 높습니다.

📌 예시 문제: 동전 거스름돈

"1원, 4원, 5원짜리 동전으로 8원을 최소 개수의 동전으로 만드는 문제"

이 문제를 DP로 푸는 이유는 다음과 같습니다.

  • 작은 문제(1원, 2원, ...)의 답을 반복해서 사용
  • "1원 추가"라는 행동이 작은 문제와 큰 문제를 연결

📌 DP 풀이 과정 (Step by Step)

  1. 작은 문제부터 나누기
    • 1원부터 목표금액까지 작은 문제로 나눈다.
  2. 점화식 설정
    • 중복이 많이 되는 부분이 있는데 이 부분을 DP를 이용할 것입니다.

 

  • 반복문이 가능하게 하는 점화식:
$$ dp[W] = min(dp[W - 1], dp[W - 4], dp[W - 5]) + 1 $$

 

 3. 초기값 설정

  • dp[0] = 0, 나머지 INF(불가능)

4. DP 테이블 채우기

W 0 1 2 3 4 5 6 7 8
dp[W] 0 1 2 3 1 1 2 3 2
1 - 1 2 3 4 2 2 3 4
4 - - - - 1 2 3 4 2
5 - - - - - 1 2 3 4
    • 예시로 W=8 계산:
      • dp[8] = min(dp[7]+1=4, dp[4]+1=2, dp[3]+1=4) → 2 (4원짜리 2개)
    • 계산 상세
      • dp[0]=0
      • dp[1]=dp[0]+1=1
      • dp[2]=dp[1]+1=2
      • dp[3]=dp[2]+1=3
      • dp[4]=min(dp[3]+1, dp[0]+1)=min(4,1)=1
      • dp[5]=min(dp[4]+1, dp[1]+1, dp[0]+1)=min(2,2,1)=1
      • dp[6]=min(dp[5]+1, dp[2]+1, dp[1]+1)=min(2,3,2)=2
      • dp[7]=min(dp[6]+1, dp[3]+1, dp[2]+1)=min(3,4,3)=3
      • dp[8]=min(dp[7]+1, dp[4]+1, dp[3]+1)=min(3,2,4)=2

📌 DP 소스 코드(Java 예시)

int[] coins = {1, 4, 5};
int target = 8;
int[] dp = new int[target + 1];

for (int i = 1; i <= target; i++) {
    dp[i] = Integer.MAX_VALUE;
}
dp[0] = 0;

for (int w = 1; w <= target; w++) {
    for (int coin : coins) {
        if (w - coin >= 0 && dp[w - coin] != Integer.MAX_VALUE) {
            dp[w] = Math.min(dp[w], dp[w - coin] + 1);
        }
    }
}

System.out.println(dp[target]);  // 결과 출력

📌 하향식 vs 상향식 비교

  • 하향식(재귀+메모이제이션): 큰 문제 → 작은 문제 (직관적)
  • 상향식(반복문): 작은 문제 → 큰 문제 (효율적, 빠름)

코딩테스트에서는 상향식을 권장합니다.

📌 DP와 백트래킹의 관계

  • 백트래킹은 모든 경우를 시도하며, 실패하는 분기를 빠르게 잘라냅니다.
  • DP는 백트래킹 중 이미 계산한 상태를 저장하고 재사용합니다.
  • DP는 백트래킹의 가지치기를 더욱 효율적으로 만들어줍니다.

📌 최종 정리 (의사결정 흐름)

"문제 발견 → 반복구조 체크 → 그리디 판단 → DP 판단(점화식 가능 여부) → 안되면 백트래킹 또는 완전탐색"

이 흐름대로 접근하면 문제를 빠르고 효율적으로 풀 수 있습니다.

📌 마무리: DP 사고력을 높이는 연습법

  • DP는 결국 "기억의 기술"입니다. 한번 계산한 것을 반드시 기록하고, 다시 계산하지 않게 합니다.
  • 문제를 분할할 수 있는 "점화식"을 빠르게 찾는 능력이 핵심입니다.
  • 익숙해지면 문제를 보는 순간 DP인지 판단할 수 있게 됩니다. 꾸준히 연습하세요.
  • 계단 오르기 문제, 거스름돈 문제를 자주 풀어보기
  • 점화식 만드는 연습을 많이 해보기
  • 작은 문제의 답을 기록(메모이제이션)하고 활용하는 습관 가지기

DP는 어려워 보이지만, 올바른 접근법과 연습을 통해 충분히 마스터할 수 있습니다. 이 글을 통해 DP의 개념을 명확하게 이해하고 자신감을 얻으시길 바랍니다!

 

 

참조

동전 바꾸기 문제

728x90
반응형
저작자표시 비영리 (새창열림)

'CS > 알고리즘 & 자료구조' 카테고리의 다른 글

[알고리즘] DFS(Depth-First Search, 깊이 우선 탐색) 문제 풀이 가이드  (2) 2025.07.14
[알고리즘] 슬라이딩 윈도우 풀이 가이드  (0) 2025.07.14
[수학적 처리] 증명된 수식을 로직으로  (1) 2025.06.27
[백준] BOJ 1874 스택 수열  (1) 2025.06.09
[백준] 숫자 카드 2  (0) 2025.06.09
'CS/알고리즘 & 자료구조' 카테고리의 다른 글
  • [알고리즘] DFS(Depth-First Search, 깊이 우선 탐색) 문제 풀이 가이드
  • [알고리즘] 슬라이딩 윈도우 풀이 가이드
  • [수학적 처리] 증명된 수식을 로직으로
  • [백준] BOJ 1874 스택 수열
크크크크
크크크크
공뷰를 합시다.
    반응형
  • 크크크크
    Tom's Note
    크크크크
  • 전체
    오늘
    어제
    • 분류 전체보기 (130)
      • IT 지식 (6)
      • CS (66)
        • 알고리즘 & 자료구조 (19)
        • 운영체제 (41)
        • 네트워크 (1)
        • 데이터베이스 (5)
      • 보안 (6)
      • SW 공학 & 프로그래밍 언어 (5)
        • Java (28)
        • 디자인 패턴 (1)
        • 형상관리 (2)
        • 톰캣(WAS) (2)
        • SW 방법론 (3)
        • 스프링부트 (5)
      • 시스템 설계 (4)
        • Docker (2)
      • 자격증 (2)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      DI
      which
      비트연산
      whereis
      불변
      단반향
      docker
      man
      1급
      usermod
      /etc/passwd
      chmod
      passwd
      Chage
      스프링부트
      DTO
      분석기법
      apropos
      알고리즘
      자바
      문제해결
      ADsP
      java
      su
      2차
      암호설정
      cifs
      REST API
      리눅스
      whatis
    • 최근 댓글

    • 최근 글

    • 250x250
    • hELLO· Designed By정상우.v4.10.3
    크크크크
    알고리즘 초보 탈출: DP(동적계획법)을 명확하게 이해하는 방법
    상단으로

    티스토리툴바