topic난이도 · 약 20

DP · 그리디 · 백트래킹 — 최적화 3기법

DP = 중복 계산 캐싱, 그리디 = 매 순간 최선, 백트래킹 = 시도하고 되돌리기.

#DP#동적계획법#그리디#백트래킹#메모이제이션
왜 배우는가

알고리즘 문제가 아니더라도 "경로 N개 중 최저 비용", "가능한 조합 중 하나 찾기" 같은 실전 문제의 기본 도구. 개념만 알아도 Claude 프롬프트가 훨씬 명확해진다.

동적계획법(DP, Dynamic Programming)은 "중복되는 부분 문제"가 있는 문제를 캐싱으로 푸는 기법. 재귀의 느린 부분을 메모이제이션으로 가속.

javascript
// ❌ 순수 재귀 — O(2^n), n=40에서 몇 분
function fib(n) {
  if (n < 2) return n;
  return fib(n - 1) + fib(n - 2);
}

// ✅ 탑다운 DP (메모이제이션)
function fibMemo(n, memo = {}) {
  if (n < 2) return n;
  if (memo[n]) return memo[n];
  return memo[n] = fibMemo(n - 1, memo) + fibMemo(n - 2, memo);
}

// ✅ 바텀업 DP (반복문)
function fibBU(n) {
  if (n < 2) return n;
  let a = 0, b = 1;
  for (let i = 2; i <= n; i++) [a, b] = [b, a + b];
  return b;
}
// O(n) 시간, O(1) 공간

DP의 핵심은 "이 문제의 답이 더 작은 자신의 답들로 이뤄지는가" (최적 부분 구조 + 중복 부분 문제). 최단 경로·배낭·편집 거리 등.

그리디(Greedy)는 "매 순간 지금 최선만 고르고 뒤돌아보지 않음". 동전 거스름돈, 구간 스케줄링, 허프만 코드. 단 항상 옳지 않음 — 문제의 구조가 그리디 성립 조건(교환 논증)을 만족해야 한다.

javascript
// 구간 스케줄링 — 겹치지 않는 최대 구간 수
// 정렬 기준: "끝나는 시간 빠른 순" (그리디 선택)
function maxMeetings(meets) {
  meets.sort((a, b) => a.end - b.end);
  let lastEnd = -Infinity, count = 0;
  for (const m of meets) {
    if (m.start >= lastEnd) {
      count++;
      lastEnd = m.end;
    }
  }
  return count;
}
// 증명: 교환 논증 — 첫 선택을 바꿔도 답이 더 좋아지지 않음

그리디가 통하는지 확신 안 서면 작은 반례를 손으로 만들어 본다. 안 되면 DP로.

백트래킹(Backtracking)은 "모든 경우를 시도하되 막히면 되돌아감". N-Queens·스도쿠·순열·부분집합. DFS와 쌍둥이지만 가지치기(pruning)로 탐색 공간을 확 줄인다.

javascript
// 모든 순열 찾기 — 백트래킹
function permutations(arr) {
  const result = [];
  function backtrack(path, used) {
    if (path.length === arr.length) {
      result.push([...path]);
      return;
    }
    for (let i = 0; i < arr.length; i++) {
      if (used[i]) continue;
      path.push(arr[i]); used[i] = true;
      backtrack(path, used);
      path.pop();    used[i] = false;  // ← 되돌리기
    }
  }
  backtrack([], Array(arr.length).fill(false));
  return result;
}

`path.push` → 재귀 → `path.pop`의 패턴이 백트래킹의 DNA. 되돌리기를 잊으면 망가진다.

언제 뭘 쓸까 30초 가이드. ① 같은 부분 문제가 반복 + 최적값? → DP. ② 매 단계 지역 최적 = 전역 최적? → 그리디. ③ 모든 조합을 시도해야? → 백트래킹. ④ 그래프 최단/탐색? → BFS/DFS/Dijkstra.

실기 드릴 2문항
edit실기 드릴 · 단답형

중복되는 부분 문제의 결과를 저장해 재사용하는 기법은?

check_circle실기 드릴 · OX

그리디 알고리즘은 모든 최적화 문제에서 항상 최적해를 준다.