1️⃣ DP 동적 프로그래밍 이란?
DP(Dynamic Programming)이란 - 큰 문제를 작은 문제로 나누고, 중복되는 문제를 저장해두었다가 재사용하는 걸 말한다!
즉, 쉽게 정리하자면 다음과 같다.
큰 문제 → 작은 문제로 쪼개고 → 작은 문제의 답을 저장 → 조합해서 큰 문제 해결
ex) 피보나치
dp[1] = 1;
dp[2] = 1;
dp[3] = dp[1] + dp[2]; // → 2
dp[4] = dp[2] + dp[3]; // → 3
dp[5] = dp[3] + dp[4]; // → 5
- 즉, dp[n] = dp[n-1] + dp[n-2]
- 초기값(dp[1], dp[2])이 있어야 그다음 값들을 계산 🅾️
메모이제이션 or 탐다운/바텀업 접근을 사용하여 계산을 줄인다고 하는데- 그렇다면, 이 세가지의 개념을 알고 넘어가야겠다.
- 메모이제이션 - 계산 결과를 저장해 중복 계산을 피하는 방식
- 탑다운/바텀업
- 탑다운 - 함수를 위에서부터 재귀적으로 호출
- 바텀업 - 아래에서부터 반복적으로 계산
💡 메모이제이션 + 탑다운 방식 (재귀)
static int[] memo = new int[100];
static int TopDown(int n) {
if (n <= 1) return n;
if (memo[n] != 0) return memo[n]; // 저장된 값이 있으면 그대로 반환
return memo[n] = TopDown(n - 1) + TopDown(n - 2); // 계산 후 저장
}
💡 바텀업 방식 (반복문 기반)
static int BottomUp(int n) {
if (n <= 1) return n;
int[] dp = new int[n + 1];
dp[0] = 0;
dp[1] = 1;
for (int i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2]; // 이전 값들을 반복문으로 계산
}
return dp[n];
}
🔍 핵심 정리
| 구분 | 메모이제이션 | 탑다운 | 바텀업 |
| 형태 | map 또는 배열에 저장 | 재귀 | 반복문 |
| 관계 | 메모이제이션은 탑다운에서 사용됨 | ✅ | ❌ |
| 특징 | 중복 계산 방지 | 직관적 | 성능 좋음 |
2️⃣ 탐욕 알고리즘 이란?
탐욕 알고리즘(Greedy Algorithm)이란 - 매 순간 최선의 선택을 하는 방식이다! 즉, 실시간에 가장 좋아 보이는 것만 골라서 문제를 해결한다는 것!
쉽게 정리하자면 다음과 같다.
항상 그 순간 최선의 선택 → 그 선택이 전체에서도 최선이 될 것이라 믿고 진행
ex) 회의실 배정 문제
회의들.sortBy(끝나는시간); // 1. 정렬(끝나는 시간 순)
for (회의 : 회의들) {
if (회의.시작 >= 현재시간) { // 2. 조건에 맞는 회의만 선택
count++;
현재시간 = 회의.끝;
}
}
👉 총 count 개의 회의를 겹치지 않게 선택하여 회의실 배정하는 게 최적!
✨ 언제 무엇을 써야 할지 고민이라면?
- 문제를 보고 "부분 문제의 결과를 재사용할 수 있나?" 생각하면 → DP
- 문제를 보고 "현재 최선의 선택이 전체도 최선이 될까?" 생각하면 → Greedy
'ALGORITHM' 카테고리의 다른 글
| 이진트리 (0) | 2025.02.05 |
|---|---|
| 최소신장트리 MST (0) | 2025.02.05 |








