그리디·동적 계획법·환원 (Greedy, dynamic programming, reductions)
직관 → 조작 → 예시 → 함정 → 답안
이 단원은 고급 알고리즘 설계 방법(Entwurfsmethoden)을 구분하는 법입니다. Greedy는 지금 보이는 가장 좋은 선택을 하나씩 붙이는 방식이지만, 그 선택이 안전하다(safe)고 증명해야 합니다. Dynamic programming(Dynamisches Programmieren, DP)은 같은 부분문제...
교환 논증(exchange argument): O' = O - e + g\(\text{Dijkstra} 전제조건: w(e) \ge 0\)Dijkstra 전제조건: w(e) ≥ 0동적 계획법 상태(DP state): D[i][j]탐욕법·동적 계획법·환원은 답안에서 증명해야 할 것이 서로 다릅니다
세 방법을 동사로 기억하세요. 탐욕법(Greedy)은 “지금 선택하기”입니다. 현재 가장 좋아 보이는 선택을 하지만, 그 선택이 안전하다는 탐욕 선택 속성(greedy-choice property) 또는 교환 논증(exchange argument)이 필요합니다. 동적 계획법(Dynamic Programming, Dynamisches Programmieren)은 “부분 답 기억하기”입니다. 반복되는 작은 문제의 답을 상태 표에 저장하고 전이식으로 채웁니다. 환원(Reduction, Reduktion)은 “문제 바꾸기”입니다. 문제 A의 입력을 문제 B의 입력으로 바꾸고 B의 풀이기를 이용해 A를 풉니다.
시험에서는 “어떤 방법인가?”보다 “그 방법을 썼다면 무엇을 반드시 보여야 하는가?”가 중요합니다. 탐욕법은 선택의 안전성 증명, 동적 계획법은 여섯 항목의 답안 틀, 환원은 화살표 방향과 그에 따른 결론을 말해야 합니다.
문제 구조에 맞는 설계 방법 선택
각 방법은 답안 템플릿이 다릅니다
탐욕 선택 속성 (greedy-choice property)
최적해 O★ 중에는 현재 선택 g를 포함하는 해가 존재합니다.지금 고른 지역 선택 g를 포함하는 최적해가 적어도 하나 있어야 합니다.
교환 논증 (exchange argument)
O′ = O − e + g이며, O′은 실행 가능하고 비용이 O보다 크지 않습니다.g가 없는 최적해 O에서 e를 빼고 g를 넣어도 실행 가능하며(feasible) 비용이 나빠지지 않음을 보입니다.
동적 계획법의 상태 (DP state)
D[i,j] = X의 1..i 구간을 Y의 1..j 구간으로 바꾸는 최소 비용상태(state)의 의미를 첫 문장으로 말하지 못하면 전이식과 실행 시간 설명이 흔들립니다.
편집 거리의 전이식
D[i,j] = min(대각선+s, 위+1, 왼쪽+1)대각선은 복사·치환(copy/substitution), 위쪽은 삭제(deletion), 왼쪽은 삽입(insertion)을 뜻합니다.
행렬 곱셈 순서의 전이식
D[i,j] = 모든 분할점 k에서 왼쪽 비용 + 오른쪽 비용 + pᵢ₋₁·pₖ·pⱼ의 최솟값각 구간 상태마다 모든 분할점 k를 시도하므로 2차원 표여도 실행 시간은 \(\Theta(n^{3})\)Θ(n³)입니다.
동적 계획법의 실행 시간 규칙
실행 시간 = 상태 수 × 상태 하나의 전이 비용최소 편집 거리(Edit Distance)는 \(\Theta(\text{mn})\)Θ(mn), 행렬 곱셈 순서(Matrix-chain)는 \(\Theta(n^{3})\)Θ(n³)인 이유가 여기서 나옵니다.
환원의 방향
A ≤ₚ B: A의 입력 x → B의 입력 f(x) → A의 답A를 풀기 위해 B의 풀이기(solver)를 빌립니다. 화살표는 A의 입력에서 B의 입력으로 갑니다.
환원에서 따라오는 결론
B가 다항 시간에 풀리면 A도 풀리며, A가 어려우면 B도 어렵습니다.B가 어렵다고 해서 A도 어렵다는 결론은 일반적으로 낼 수 없습니다. 객관식에서 화살표를 자주 뒤집어 묻습니다.
동적 계획법의 상태 전이 그림
설계 방법을 분류하는 예제
| 문제 상황 | 후보 방법 | 답안에 필요한 내용 | 함정 |
|---|---|---|---|
| MST 절단을 건너는 가장 가벼운 간선을 고릅니다. | 탐욕법(Greedy) | 절단·가벼운 간선·안전한 간선 증명 또는 교환 논증. | 지역 최선이라는 말만으로 최적성이 증명되지는 않습니다. |
접두사 편집 비용을 D[i][j]에 저장합니다. | 동적 계획법(Dynamic Programming) | 상태, 경계값, 대각선·위·왼쪽 전이, 표 계산 순서, D[m][n], \(\Theta(\text{mn})\)Θ(mn). | 2차원 표라고 자동으로 \(\Theta(n^{2})\)Θ(n²)인 것은 아닙니다. |
A의 입력 x를 B의 입력 f(x)로 바꾸고 B 풀이기를 호출합니다. | 환원(Reduction) | \(A \to B\)A → B방향, 다항 시간 변환, B의 답을 A의 답으로 해석하는 법, 그에 따른 결론. | \(A \le_{p} B\)A ≤p B를 \(B \to A\)B → A로 읽지 마세요. |
시험 핵심, 오개념, 객관식 함정
함정: 지역 최선이면 탐욕법이 증명된다
거짓입니다. 탐욕 선택 속성, 교환 논증, 또는 절단과 안전한 간선을 이용한 증명이 필요합니다.
함정: Dijkstra는 음수 간선에서도 동작한다
거짓입니다. 최소값 추출 뒤의 확정성에는 모든 간선 가중치가 \(w(e) \ge 0\)w(e) ≥ 0이라는 조건이 필요합니다.
함정: 탐욕적 TSP는 항상 최적이다
거짓입니다. 강의 07에는 탐욕 비용이 N+n-1이고 최적 비용은 n+2인 최근접 이웃 반례 계열이 나옵니다.
함정: 점화식만 쓰면 동적 계획법 답안이다
거짓입니다. 상태 의미, 경계값, 계산 순서, 정답 칸, 실행 시간과 공간 사용량까지 필요합니다.
함정: 모든 2차원 동적 계획법은 제곱 시간이다
거짓입니다. 행렬 곱셈 순서는 상태가 \(O(n^{2})\)O(n²)개이지만 상태마다 \(O(n)\)O(n)개의 분할점을 보므로 \(\Theta(n^{3})\)Θ(n³)입니다.
함정: \(A \le_{p} B\)A ≤p B는 \(B \to A\)B → A를 뜻한다
거짓입니다. A의 입력을 B의 입력으로 바꿉니다. B가 쉬우면 A도 쉽고, A가 어려우면 B도 어렵습니다.
구두 답안 예시
탐욕법(Greedy), 동적 계획법(DP), 환원(Reduction)은 세 가지 설계 방법(Entwurfsmethoden)입니다. 탐욕법은 현재의 지역 선택 g를 고르지만, 그 선택을 포함하는 최적해가 있음을 탐욕 선택 속성이나 교환 논증으로 보여야 합니다. 동적 계획법은 겹치는 하위 문제의 답을 상태 표에 저장합니다. 답안에는 상태, 경계값, 전이식, 계산 순서, 정답 칸, 실행 시간과 공간 사용량이 필요합니다. 최소 편집 거리는 접두사 상태 D[i][j]와 대각선·위·왼쪽 전이로 \(\Theta(\text{mn})\)Θ(mn)이고, 행렬 곱셈 순서는 \(O(n^{2})\)O(n²)개의 상태마다 \(O(n)\)O(n)개의 분할점을 보므로 \(\Theta(n^{3})\)Θ(n³)입니다. 환원 \(A \le ₚ B\)A ≤ₚ B는 A의 입력 x를 B의 입력 f(x)로 바꾸고 B 풀이기를 사용해 A의 답을 얻는 방향입니다. 그래서 B가 쉬우면 A도 쉽고, A가 어려우면 B도 어렵습니다.
능동 회상
- 탐욕법·동적 계획법·환원을 각각 “지금 선택하기, 부분 답 기억하기, 문제 바꾸기”로 설명하세요.
- 탐욕 선택 속성과 교환 논증의 차이를
O, e, g, O'로 말하세요. - Dijkstra에서 음수가 아닌 가중치 조건이 왜 필요한가요?
- 동적 계획법 답안의 여섯 항목인 상태, 경계값, 전이식, 계산 순서, 정답 칸, 실행 시간을 순서대로 말하세요.
- 편집 거리의
D[i][j]의미와 대각선·위·왼쪽 전이를 설명하세요. - 행렬 곱셈 순서가 2차원 표인데도 \(\Theta(n^{3})\)
Θ(n³)인 이유를 말하세요. - \(A \le_{p} B\)
A ≤p B에서 어떤 입력이 어떤 입력으로 바뀌고 어떤 풀이기를 쓰나요? - \(A \le_{p} B\)
A ≤p B에서 맞는 결론 두 개와 틀린 결론 하나를 말하세요.
강의 자료에 근거한 참고 사항
Vorlesung\07AdvancedDesigns.pdf1~3쪽: 고급 알고리즘 설계 방법 개요.Vorlesung\07AdvancedDesigns.pdf28~37쪽: 행렬 곱셈 순서의 동적 계획법과 구간 분할 아이디어.Vorlesung\07AdvancedDesigns.pdf52~72쪽: 피보나치 메모이제이션과 최소 편집 거리 표.Vorlesung\07AdvancedDesigns.pdf73~81쪽: 탐욕 원리, Dijkstra·Kruskal, 음수 간선 함정, 탐욕적 TSP 반례.Vorlesung\06GraphAlgorithms.pdf와Vorlesung\06GraphAlgorithms__moodle_2026-06-16.pdf: MST의 절단·가벼운 간선·안전한 간선과 Dijkstra 정확성의 배경.- 자료 범위 안내: 색인된 로컬 조각에는 구체적인 NP-환원 강의 전체가 없으므로, 이 페이지의 환원 설명은 일반적인 \(A \le_{p} B\)
A ≤p B방향과 그에 따른 결론까지만 다룹니다.
바로 사용하는 AI 학습 프롬프트
Vorlesung/07AdvancedDesigns.pdf, Vorlesung/06GraphAlgorithms.pdf, Vorlesung/06GraphAlgorithms__moodle_2026-06-16.pdf와 AuD 2025년 여름학기 복기 자료를 첨부하세요. AUD 시험용 탐욕법, 동적 계획법, 환원을 한국어로 가르쳐 주세요. Entwurfsmethoden, Greedy, Dynamisches Programmieren, Reduktion, greedy-choice property, exchange argument, state, transition, A <=p B 같은 독일어·영어 핵심 용어는 괄호로 함께 보여 주세요. “지금 선택하기 / 부분 답 기억하기 / 문제 바꾸기”라는 기억법부터 시작하세요. 탐욕법에서는 안전한 지역 선택, 교환 논증, MST의 절단·가벼운 간선, Dijkstra의 음수가 아닌 가중치 전제, 탐욕적 TSP의 N+n-1 대 n+2 반례를 다루세요. 동적 계획법에서는 상태·경계값·전이식·계산 순서·정답 칸·실행 시간, 편집 거리, 행렬 곱셈 순서를 다루세요. 환원에서는 자료 범위를 먼저 밝히고 A 입력 → B 입력 → B 풀이기 방향, B가 쉬우면 A도 쉽다는 결론, A가 어려우면 B도 어렵다는 결론과 객관식 함정을 설명하세요. 능동 회상 질문은 한 번에 하나씩 물어보세요.
읽는 순서가 보이는 핵심 공식
정의, 수식, 시험 판정 문장을 분리해서 공식이 답안에서 어떻게 쓰이는지 바로 확인합니다.
탐욕 선택 속성(Greedy-choice property)
Greedy가 맞으려면 지금 고른 선택 g를 포함하는 최적해가 적어도 하나 존재해야 합니다.
\exists O^{\star}: g\in O^{\star}- g: greedy rule이 지금 고른 local choice
- O^*: 어떤 optimal solution
- g in O^*: 그 최적해 안에 greedy choice가 들어 있음
시험 답안에서는 지금 가장 좋아 보여서가 아니라 g를 포함하는 optimal solution으로 바꿀 수 있다고 말해야 합니다.
교환 논증 틀(Exchange argument template)
Greedy choice g가 없는 최적해 O를 잡고, 어떤 선택 e를 g로 교환해도 손해가 없음을 보이는 증명 틀입니다.
O' = O - e + g,\quad feasible(O'),\quad cost(O')\le cost(O)- O: 기존 optimal solution
- e: O에서 빼는 item 또는 edge
- g: greedy choice
- O': 교환 후 solution
- feasible: 여전히 문제 조건을 만족함
Prim/Kruskal에서는 cut을 가로지르는 light edge가 safe하다는 것을 이런 교환 논리로 설명합니다.
Dijkstra 전제조건(Dijkstra precondition)
Dijkstra의 extract-min 확정이 안전하려면 나중에 더 짧아지는 음수 간선 경로가 없어야 합니다.
\forall e\in E:\ w(e)\ge 0- e: edge/Kante
- w(e): 간선 가중치(edge weight, Gewicht)
- >= 0: zero는 허용, negative edge는 허용하지 않음
Lecture 07 pages 73-75는 negative edge가 있을 때 Dijkstra가 잘못된 path를 확정하는 counterexample을 보여줍니다.
동적 계획법 상태: 최소 편집 거리(DP state)
DP에서는 table entry 하나가 무엇을 뜻하는지 먼저 고정해야 합니다.
D[i,j]=\text{문자열 }X[1..i]\text{를 }Y[1..j]\text{로 바꾸는 최소 비용}- i, j: prefix length
- X[1..i], Y[1..j]: 현재까지 보는 부분 문자열
- D[i][j]: 두 prefix를 맞추는 최소 edit cost
state 의미를 한 문장으로 말하지 못하면 transition과 runtime도 흔들립니다.
동적 계획법 전이식: 편집 거리(DP transition)
현재 cell은 diagonal, up, left 세 후보 중 최소값으로 채웁니다.
D[i][j]=\min\{D[i-1][j-1]+s,\ D[i-1][j]+1,\ D[i][j-1]+1\}- diagonal: copy 또는 substitution
- up: deletion
- left: insertion
- s: \(X[i]=Y[j]\)
X[i]=Y[j]이면 0, 다르면 substitution cost 1
Lecture 07 pages 56-72의 Minimum Edit Distance table은 이 predecessor 관계를 반복해서 채웁니다.
행렬 곱셈 순서의 전이식(Matrix-chain transition)
구간 \(A_{i} ... A_{j}\)Aᵢ ... Aⱼ를 어디서 나눌지 split k를 모두 시도합니다.
D[i,j]=\minᵢ\le k<j}\{D[i,k]+D[k+1,j]+pᵢ-1}\,pₖ\,pⱼ\}- D[i,j]: \(\text{matrices} A_{i} ... A_{j}\)
matrices Aᵢ ... Aⱼ를 곱하는 최소 비용 - k: 마지막으로 나누는 split position
- p_{i-1} p_{k} p_{j}: 두 부분 결과를 마지막에 곱하는 비용
\(O(n^{2})\)O(n²)개의 interval state가 있지만 각 state마다 k를 \(O(n)\)O(n)개 보므로 전체 Laufzeit는 \(\Theta(n^{3})\)Θ(n³)입니다.
동적 계획법 실행 시간 규칙(DP Laufzeit rule)
DP 시간은 table 크기만 보지 말고, cell 하나를 계산하는 비용까지 곱해야 합니다.
T = \#\text{states}\cdot\text{transition cost}- #states: 채울 table entry 개수
- transition cost: entry 하나에서 비교하거나 시도하는 후보 수의 비용
Edit Distance는 \(\Theta(\text{mn})\)Θ(mn), Matrix-chain은 \(\Theta(n^{3})\)Θ(n³)인 이유가 바로 이 공식에서 갈립니다.
환원의 방향(Reduction direction)
\(A \le_{p} B\)A ≤p B는 A를 풀기 위해 B solver를 빌리는 방향입니다.
A\leₚ B:\ x\mapsto f(x),\quad \operatorname{solve}(B)(f(x))\mapsto \operatorname{answer}(A)(x)- x: A instance
- f(x): polynomial-time transformation으로 만든 B instance
- solve_B: B를 푸는 알고리즘 또는 oracle
- answer_A(x): 원래 A instance의 답
화살표는 A input에서 B input으로 갑니다. B를 A로 바꾼다는 뜻이 아닙니다.
환원으로 얻는 결론(Reduction consequences)
방향을 맞게 읽으면 easy와 hard 결론도 자동으로 따라옵니다.
B\in \mathsf{P}\Rightarrow A\in \mathsf{P},\quad A\text{가 어려움}\Rightarrow B\text{도 어려움}- B easy => A easy: B solver를 빌려 A를 풀 수 있음
- A hard => B hard: 어려운 A가 B로 바뀌므로 B도 적어도 그만큼 어려움
반대로 \(B \text{hard} \Rightarrow A \text{hard}\)B hard => A hard는 일반적으로 말할 수 없습니다.
Opening Hook: 세 단어로 시작하기
오늘 단원의 핵심은 세 동사입니다. Greedy는 choose now, dynamic programming(Dynamisches Programmieren, DP)은 remember subanswers, reduction(Reduktion)은 translate problem입니다. 초보자가 가장 많이 하는 실수는 이 세 방법을 모두 '빠른 알고리즘 이름'으로 외우는 것입니다. 하지만 시험 답안에서 중요한 것은 이름이 아니라 의무입니다. Greedy를 썼다면 왜 지금 고른 선택이 안전한지(safe) 보여야 합니다. DP를 썼다면 table entry 하나가 무슨 뜻인지, 어떤 순서로 채우는지, 왜 Laufzeit가 그렇게 되는지 보여야 합니다. Reduction을 썼다면 어느 문제 A의 입력을 어느 문제 B의 입력으로 바꾸는지, 그 방향이 어떤 결론을 주는지 보여야 합니다.
이 단원을 하나의 지도처럼 보면 쉽습니다. 문제를 보고 '매 단계에서 하나의 선택을 확정해도 될 것 같은가?'라고 느끼면 Greedy 후보입니다. 그러나 후보일 뿐입니다. 바로 증명 gate가 열립니다. '작은 부분문제들이 반복되어 같은 값을 여러 번 계산하는가?'라고 느끼면 DP 후보입니다. 이때는 state gate가 열립니다. '내가 직접 풀기 어렵지만 이미 아는 문제 solver를 빌릴 수 있는가?'라고 느끼면 reduction 후보입니다. 이때는 arrow gate, 즉 \(A \le_{p} B\)A ≤p B의 방향 gate가 열립니다.
구두시험 첫 문장: Greedy는 안전한 local choice, DP는 저장되는 subproblem answer, reduction은 \(A \text{입력} \rightarrow B \text{입력}\)A input → B input방향을 먼저 말하겠습니다.
선수 개념과 필수 용어 지도(Prerequisites and Vocabulary Map)
필수 배경은 네 묶음입니다. 첫째, asymptotic notation입니다. DP의 Laufzeit를 말할 때 #states와 transition cost를 곱하고, Greedy graph algorithms의 Laufzeit를 말할 때 |V|, |E|, log |V| 같은 기호를 씁니다. 둘째, graph vocabulary입니다. Dijkstra, Prim, Kruskal은 모두 \(\text{graph} G=(V,E), \text{edge} \text{weight} w(e), \text{priority} \text{queue}\)graph G=(V,E), edge weight w(e), priority queue또는 sorted edge list를 사용합니다. 셋째, recurrence와 table 사고입니다. DP는 recurrence를 table로 바꾼다고 보면 되지만, 모든 recurrence가 DP 답안이 되는 것은 아닙니다. 넷째, correctness proof vocabulary입니다. safe edge, greedy-choice property, exchange argument, invariant, optimal substructure 같은 말이 답안의 뼈대입니다.
용어 지도는 이렇게 잡으세요. Greedy-Algorithmus는 \(\text{solution} x=(x1,...,\text{xn})\)solution x=(x1,...,xn)을 만들 때 이미 만든 prefix x1,...,x(i-1)에 locally best candidate xi를 붙입니다. greedy-choice property는 그런 선택을 포함하는 optimal solution이 존재한다는 성질입니다. exchange argument는 어떤 optimal solution O에 greedy choice g가 없을 때 O에서 e를 빼고 g를 넣어 O'=O-e+g를 만들어도 feasible이고 cost가 나빠지지 않음을 보이는 증명 틀입니다. DP에서 state는 D[i][j] 같은 table cell의 의미입니다. transition은 predecessor states에서 current state로 오는 규칙입니다. \(\text{Reduction} A \le_{p} B\)Reduction A ≤p B는 A instance x를 polynomial time transformation f로 B instance f(x)로 바꾸고 B solver의 답을 A answer로 해석한다는 뜻입니다.
- 탐욕법 용어(Greedy terms): 지역 선택(local choice), 안전한 선택(safe choice), 탐욕 선택 속성, 교환 논증, 절단·가벼운 간선
- 동적 계획법 용어(DP terms): 상태, 경계값, 전이, 계산 순서, 정답 칸, 복원, 메모이제이션
- 환원 용어(Reduction terms): 문제 사례(instance), 변환 f, B 풀이기, \(A \le_{p} B, B\)
A ≤p B, B가 쉬우면 A도 쉬움, A가 어려우면 B도 어려움 - 강의 출처: Lecture 07의 52~72쪽은 DP, 73~81쪽은 탐욕법과 반례, Lecture 06 그래프 구간은 MST·Dijkstra의 근거입니다.
Part I: Greedy는 선택보다 증명이다
Lecture 07은 Greedy의 원리를 'Teillösung에 locally cheapest-looking candidate를 붙여 \(\text{solution} x=(x1,...,\text{xn})\)solution x=(x1,...,xn)을 만든다'고 설명합니다. 이 문장만 보면 Greedy는 쉬워 보입니다. 하지만 시험에서 Greedy는 항상 두 층으로 답해야 합니다. 첫 층은 rule입니다. 예를 들어 Kruskal은 edge를 weight 오름차순으로 보고 cycle을 만들지 않는 edge를 넣습니다. Prim은 현재 자란 tree frontier에서 가장 가벼운 edge를 통해 새 vertex를 붙입니다. Dijkstra는 아직 확정하지 않은 vertex 중 dist가 가장 작은 vertex를 extract-min합니다. 두 번째 층은 proof obligation입니다. 왜 이 선택을 지금 확정해도 뒤에서 후회하지 않는가?
Greedy correctness의 직관은 '나중에 고칠 필요가 없는 선택'입니다. MST에서는 cut을 가로지르는 가장 가벼운 edge(light edge)가 safe하다는 cut property가 이 역할을 합니다. 어떤 MST가 그 light edge를 포함하지 않아도, 그 MST에 light edge를 추가하면 cycle이 생기고, 그 cycle 안에서 cut을 가로지르는 다른 edge 하나를 제거할 수 있습니다. light edge가 가장 가볍기 때문에 총 weight는 증가하지 않습니다. 그래서 greedy choice를 포함하는 MST가 존재합니다. 이것이 exchange argument의 감각입니다.
Dijkstra는 조금 다릅니다. extract-min vertex u의 dist가 진짜 shortest distance로 확정된다는 논리가 nonnegative edge weights에 의존합니다. Lecture 06의 correctness proof는 shortest path에서 S 밖으로 처음 나가는 vertex y를 잡고, nonnegative weights 때문에 \(y.\text{dist} \le \text{shortest}(s,u) \le u.\text{dist}\)y.dist ≤ shortest(s,u) ≤ u.dist가 되어 extract-min 순서와 모순을 만드는 방식입니다. Lecture 07과 Lecture 06은 negative edge counterexample도 줍니다. 그러므로 'Dijkstra는 Greedy니까 항상 맞다'가 아니라 'nonnegative weights라는 전제 아래 extract-min이 safe하다'가 정확한 답안입니다.
Greedy 답안 템플릿: rule을 말하고, safe choice를 말하고, exchange 또는 cut/invariant로 왜 후회하지 않는지 말한다.
Part II: Greedy가 실패하는 순간을 일부러 보자
Greedy를 제대로 이해하려면 성공 예시보다 실패 예시가 더 중요할 때가 많습니다. Lecture 07의 Greedy-TSP 예시는 이 단원의 보석입니다. TSP는 모든 vertex를 정확히 한 번 방문하고 시작점으로 돌아오는 minimum-weight tour를 찾는 문제입니다. nearest-neighbor greedy는 현재 vertex에서 아직 방문하지 않은 vertex로 가는 가장 작은 weight edge를 고릅니다. 이 rule은 매우 자연스럽지만 optimality proof가 없습니다.
Lecture 07의 counterexample family에서는 vertex가 1,2,...,n이고, consecutive edge는 weight 1, edge {1,n}은 매우 큰 N, 나머지는 weight 2로 둡니다. 시작점이 1이면 greedy는 \(1\rightarrow 2\rightarrow ...\rightarrow n\)1→2→...→n으로 계속 weight 1 edge를 따라갑니다. 마지막에는 n에서 1로 돌아가야 하므로 비싼 N edge를 써서 total N+n-1이 됩니다. 반면 optimal tour는 큰 edge를 피하고 weight 2 edge 몇 개를 섞어 n+2 정도로 만들 수 있습니다. N을 마음대로 크게 잡을 수 있으므로 greedy는 arbitrarily bad가 됩니다.
이 예시는 MC 함정에서 자주 쓰입니다. 'locally best choice가 global optimum을 보장한다'는 말은 false입니다. 'Greedy는 빠르기 때문에 근사적으로라도 항상 좋다'도 course-specific claim으로 말하면 위험합니다. Lecture 07은 Greedy-TSP가 너무 greedy하다고 보여 주고, 이어서 Hill-Climbing과 Simulated Annealing 같은 metaheuristics를 Greedy와 구분합니다. Greedy는 exact correctness proof가 있으면 exact algorithm이고, proof가 없으면 단지 heuristic candidate입니다.
반례 문장: nearest-neighbor TSP는 매번 가장 싼 edge를 골라도 마지막 return edge 때문에 N+n-1이 되어 optimum n+2보다 훨씬 나빠질 수 있다.
Part III: DP는 table을 그리는 기술이 아니라 state를 정의하는 기술이다
Lecture 07은 DP 원리를 'overlapping subproblems를 재귀적으로 풀고 Zwischenergebnisse를 다시 사용한다(Memoization)'고 설명합니다. 처음에는 Fibonacci 예시가 나옵니다. naive Fib-Rek(n)은 Fib(n-1)과 Fib(n-2)를 계속 호출하고, 같은 Fib(k)를 여러 번 계산해서 대략 exponential tree가 생깁니다. Memoization을 쓰면 한 번 계산한 F[i]를 저장하고 다시 호출될 때 바로 반환합니다. 그래서 \(\Theta(n)\)Θ(n)이 됩니다. 이 예시는 DP의 감각을 잡기 좋지만, 시험 답안은 Fibonacci보다 더 엄격해야 합니다.
DP 답안의 첫 문장은 거의 항상 'D[...]는 무엇을 의미한다'입니다. 이 문장이 흐리면 transition이 아무리 그럴듯해도 점수가 흔들립니다. Minimum Edit Distance에서 D[i][j]는 X[1..i]를 Y[1..j]로 바꾸는 minimum edit cost입니다. Matrix-chain multiplication에서 D[i,j]는 \(\text{matrix} A_{i}...A_{j}\)matrix Aᵢ...Aⱼ를 곱하는 minimum scalar multiplication cost입니다. 둘 다 2D table이지만 의미가 완전히 다릅니다. 그러므로 table의 차원이 같다고 같은 runtime이라고 말하면 안 됩니다.
DP는 여섯 가지 항목으로 답합니다. state meaning, boundary/base case, transition, evaluation order, answer cell, Laufzeit/space입니다. Minimum Edit Distance는 \(D[0][j]=j, D[i][0]=i\)D[0][j]=j, D[i][0]=i라는 boundary가 있고, D[i][j]는 diagonal/up/left 셋 중 minimum입니다. order는 \(i=1..m, j=1..n\)i=1..m, j=1..n으로 위와 왼쪽과 대각선이 이미 계산된 상태를 보장합니다. answer cell은 D[m][n]입니다. states는 (m+1)(n+1), transition은 \(O(1)\)O(1)이므로 \(\Theta(\text{mn})\)Θ(mn)입니다.
DP 답안 템플릿: state, base, recurrence, fill order, answer, runtime/space를 빠짐없이 말한다.
4부: 최소 편집 거리(Minimum Edit Distance) 풀이
Minimum Edit Distance(Levenshtein-Distanz)는 한 string X를 다른 string Y로 바꾸기 위해 필요한 insert, delete, substitute의 최소 개수를 묻습니다. Lecture 07은 X='ein Test', Y='zwei Feste' 예시와 함께 table을 보여 줍니다. 수업의 핵심은 final number만 외우는 것이 아니라 cell 하나가 어떻게 만들어지는지 이해하는 것입니다.
D[i][j]를 X[1..i]를 Y[1..j]로 바꾸는 최소 cost라고 합시다. 마지막 operation을 생각하면 세 경우가 있습니다. 마지막에 X[i]와 Y[j]를 맞춘다면 이전에는 X[1..i-1]을 Y[1..j-1]로 바꿨어야 하고, cost는 D[i-1][j-1]+s입니다. 여기서 \(s=0 \text{if} X[i]=Y[j], \text{else} 1\)s=0 if X[i]=Y[j], else 1입니다. 마지막에 X[i]를 delete했다면 이전에는 X[1..i-1]을 Y[1..j]로 바꿨고 cost는 D[i-1][j]+1입니다. 마지막에 Y[j]를 insert했다면 이전에는 X[1..i]를 Y[1..j-1]로 바꿨고 cost는 D[i][j-1]+1입니다. 따라서 \(D[i][j]=\min\{D[i-1][j-1]+s, D[i-1][j]+1, D[i][j-1]+1\}\)D[i][j]=min{D[i-1][j-1]+s, D[i-1][j]+1, D[i][j-1]+1}입니다.
작은 예시로 X='ab', Y='ac'를 보겠습니다. boundary는 \(D[0][0]=0, D[1][0]=1, D[2][0]=2, D[0][1]=1, D[0][2]=2\)D[0][0]=0, D[1][0]=1, D[2][0]=2, D[0][1]=1, D[0][2]=2입니다. D[1][1]은 a와 a가 같아서 \(\min\{0+0,1+1,1+1\}=0\)min{0+0,1+1,1+1}=0입니다. D[1][2]는 a와 c가 다르므로 \(\min\{1+1,2+1,0+1\}=1\)min{1+1,2+1,0+1}=1입니다. D[2][1]은 b와 a가 다르므로 \(\min\{1+1,0+1,2+1\}=1\)min{1+1,0+1,2+1}=1입니다. D[2][2]는 b와 c가 다르므로 \(\min\{0+1,1+1,1+1\}=1\)min{0+1,1+1,1+1}=1입니다. 답은 \(\text{substitute} b\rightarrow c\)substitute b→c하나, 즉 1입니다.
D[i][j] = min{ D[i-1][j-1] + s, D[i-1][j] + 1, D[i][j-1] + 1 }Part V: Matrix-chain multiplication이 왜 2D인데 \(\Theta(n^{3})\)Θ(n³)인가
Matrix-chain multiplication은 DP runtime 함정을 잡기에 좋습니다. 여러 matrix A1...An을 같은 순서로 곱되 괄호를 어떻게 치느냐에 따라 scalar multiplication 수가 달라집니다. Lecture 07 pages 28-37은 이 DP를 다룹니다. 여기서 state D[i,j]는 A(i)...A(j)를 곱하는 최소 cost입니다. base는 \(D[i,i]=0\)D[i,i]=0입니다. matrix 하나는 이미 있으므로 곱셈 cost가 없습니다.
Transition은 마지막 split을 고르는 방식입니다. 구간 A(i)...A(j)를 마지막에 (A(i)...A(k))와 (A(k+1)...A(j))로 나누어 곱한다고 합시다. 왼쪽 최소 cost는 D[i,k], 오른쪽 최소 cost는 D[k+1,j]입니다. 두 결과 matrix를 마지막으로 곱하는 cost는 dimensions p(i-1)·p(k)·p(j)입니다. 그래서 모든 k in [i, j-1]에 대해 D[i,k]+D[k+1,j]+p(i-1)·p(k)·p(j)를 계산하고 minimum을 취합니다.
여기서 중요한 시험 포인트가 나옵니다. table cell은 \(O(n^{2})\)O(n²)개입니다. 하지만 cell 하나를 채울 때 split k를 \(O(n)\)O(n)개 시도합니다. 따라서 total Laufzeit는 \(\Theta(n^{3})\)Θ(n³)입니다. Minimum Edit Distance도 2D table이지만 cell 하나에서 후보가 diagonal/up/left 세 개뿐이어서 \(O(1)\)O(1)입니다. 그러므로 '2D DP table이면 \(\Theta(n^{2})\)Θ(n²)'라는 MC 문장은 false입니다. 정확한 계산은 #states * transition cost입니다.
D[i,j] = minᵢ ≤ k < j} { D[i,k] + D[k+1,j] + pᵢ-1} pₖ pⱼ }Part VI: Reduction은 문제를 푸는 방향 화살표다
Reduction(Reduktion)은 이 페이지에서 가장 source gap이 있는 부분입니다. 현재 indexed Lecture 07 chunks는 DP와 Greedy를 자세히 다루고, TSP가 어렵다는 말 뒤에 NP chapter로 넘어간다고 안내하지만, reduction lecture 전체는 이 자료 조각 안에 충분히 들어 있지 않습니다. 그래서 여기서는 course-specific reduction theorem을 새로 꾸며 내지 않고, AUD 시험에서 일반적으로 필요한 방향 논리만 명확히 둡니다.
\(A \le_{p} B\)A ≤p B는 A가 B로 polynomial-time reducible하다는 뜻입니다. 읽는 법은 'A를 풀기 위해 B solver를 빌린다'입니다. 입력 x는 A의 instance입니다. 우리는 x를 빠르게 f(x)로 바꿉니다. f(x)는 B의 instance여야 합니다. 그 다음 B solver를 호출합니다. 마지막으로 B의 yes/no 또는 solution을 A의 answer로 해석합니다. 그림으로는 \(A \text{입력} \rightarrow \text{transform} f \rightarrow B \text{입력} \rightarrow \text{solve}_{B} \rightarrow A \text{answer}\)A input → transform f → B input → solve(B) → A answer입니다.
결론 방향도 이 화살표에서 나옵니다. 만약 B가 쉽다면(B in P), A도 쉽습니다. 왜냐하면 A를 풀 때 transformation f와 B solver를 차례로 쓰면 되기 때문입니다. 반대로 A가 어렵다는 사실이 이미 알려져 있고 \(A \le_{p} B\)A ≤p B를 보였다면, B도 적어도 A만큼 어렵습니다. 만약 B가 쉬웠다면 A도 쉬워져야 하므로 모순이 됩니다. 하지만 B가 어렵다고 해서 A가 어렵다는 결론은 일반적으로 나오지 않습니다. 또한 \(A \le_{p} B\)A ≤p B를 \(B \le_{p} A\)B ≤p A로 뒤집으면 완전히 다른 주장입니다.
Reduction 답안 첫 줄: A instance x를 polynomial time에 B instance f(x)로 바꾸고, B solver의 답을 A의 답으로 해석한다.
Worked Example 1: design paradigm 분류하기
문제 상황을 세 개 보겠습니다. 상황 A: connected undirected graph에서 MST를 만들고 싶고, 매 단계에서 cut을 가로지르는 가장 가벼운 edge를 고릅니다. 이것은 Greedy 후보입니다. 답안은 'Prim/Kruskal style greedy'라고만 쓰면 부족합니다. light edge가 safe하다는 근거, 즉 cut/exchange intuition을 붙여야 합니다. 상황 B: 두 string X와 Y가 있고, X[1..i]를 Y[1..j]로 바꾸는 minimum cost를 D[i][j]에 저장합니다. 이것은 DP입니다. 답안은 \(\text{state}, \text{boundary} D[0][j]=j\)state, boundary D[0][j]=j와 \(D[i][0]=i, \text{diagonal}/\text{up}/\text{left} \text{transition}, \text{answer} D[m][n], \Theta(\text{mn})\)D[i][0]=i, diagonal/up/left transition, answer D[m][n], Θ(mn)을 말해야 합니다. 상황 C: 문제 A를 직접 풀기 어렵지만 A의 입력 x를 문제 B 입력 f(x)로 바꾼 뒤 B solver를 쓰려 합니다. 이것은 reduction입니다. 답안은 \(A \le_{p} B\)A ≤p B방향입니다.
이 worked example의 목적은 이름 맞히기가 아닙니다. 각 방법의 '검사 질문'을 붙이는 연습입니다. Greedy 검사 질문은 '지금 선택을 포함하는 optimal solution이 있음을 어떻게 보이나?'입니다. DP 검사 질문은 'table cell 하나가 무슨 뜻이고, predecessor states가 이미 계산되어 있나?'입니다. Reduction 검사 질문은 '어느 입력에서 어느 입력으로 가고, easy/hard conclusion을 어느 방향으로 읽나?'입니다.
분류 문제에서는 paradigm 이름 + 답안 의무를 같이 적어야 부분점수가 안정적입니다.
Worked Example 2: Edit Distance table 일부 채우기
X='cat', Y='cut'로 손계산을 해 봅시다. goal은 cat을 cut으로 바꾸는 최소 edit cost입니다. boundary는 빈 string에서 prefix를 만드는 cost입니다. \(D[0][0]=0, D[0][1]=1, D[0][2]=2, D[0][3]=3\)D[0][0]=0, D[0][1]=1, D[0][2]=2, D[0][3]=3이고 \(D[1][0]=1, D[2][0]=2, D[3][0]=3\)D[1][0]=1, D[2][0]=2, D[3][0]=3입니다. 이제 D[1][1]은 c와 c가 같으므로 0입니다. D[1][2]는 c와 u가 다르므로 \(\min\{D[0][1]+1=2, D[0][2]+1=3, D[1][1]+1=1\}=1\)min{D[0][1]+1=2, D[0][2]+1=3, D[1][1]+1=1}=1입니다. D[1][3]도 \(\min\{3,4,2\}=2\)min{3,4,2}=2입니다.
두 번째 row에서 D[2][1]은 a와 c가 다르므로 \(\min\{2,1,3\}=1\)min{2,1,3}=1입니다. D[2][2]는 a와 u가 다르므로 \(\min\{D[1][1]+1=1, D[1][2]+1=2, D[2][1]+1=2\}=1\)min{D[1][1]+1=1, D[1][2]+1=2, D[2][1]+1=2}=1입니다. D[2][3]은 a와 t가 다르므로 \(\min\{2,3,2\}=2\)min{2,3,2}=2입니다. 세 번째 row에서 D[3][1]은 t와 c가 달라 2, D[3][2]는 t와 u가 달라 2, D[3][3]은 t와 t가 같아서 \(\min\{D[2][2]+0=1, D[2][3]+1=3, D[3][2]+1=3\}=1\)min{D[2][2]+0=1, D[2][3]+1=3, D[3][2]+1=3}=1입니다. 답은 1, 즉 a를 u로 substitute하는 것입니다.
시험에서 table 전체를 그리라고 하지 않아도, 한 cell을 왜 그렇게 채우는지 말할 수 있어야 합니다. 특히 copy/substitution은 diagonal, deletion은 up, insertion은 left라는 predecessor 의미를 말하면 계산 실수도 줄어듭니다.
X='cat', Y='cut' => D[3][3]=1Proof Intuition: Greedy proof와 DP proof를 구분하기
Greedy proof와 DP proof는 둘 다 optimality를 다루지만 모양이 다릅니다. Greedy proof는 '첫 선택을 greedy choice로 고정해도 optimal solution을 잃지 않는다'를 보입니다. 그래서 exchange argument가 자주 등장합니다. 이미 optimal인 O가 greedy choice g를 포함하지 않는다고 가정하고, O 안의 어떤 element e를 g로 바꾸어도 feasibility가 유지되고 objective가 악화되지 않음을 보입니다. 이 증명이 끝나면 첫 선택을 고정하고 남은 subproblem으로 넘어갈 수 있습니다.
DP proof는 보통 optimal substructure와 recurrence correctness입니다. 예를 들어 Edit Distance에서 optimal sequence의 마지막 operation을 보아 copy/substitution, deletion, insertion 중 하나라고 분해합니다. 각 경우의 이전 상태가 정확히 D[i-1][j-1], D[i-1][j], D[i][j-1]이므로 minimum을 취하면 optimal cost가 됩니다. Matrix-chain에서는 optimal parenthesization의 마지막 split k가 반드시 하나 존재하고, 그 왼쪽과 오른쪽도 각각 optimal이어야 합니다. 그렇지 않으면 더 싼 부분해로 바꾸어 전체 cost를 줄일 수 있기 때문입니다.
Reduction proof는 또 다릅니다. algorithm의 step-by-step correctness보다 transformation correctness입니다. x가 A의 yes-instance iff f(x)가 B의 yes-instance라는 식의 iff를 보이거나, B solution을 A solution으로 복원하는 해석을 보입니다. 현재 source에서는 reduction 세부 예제가 부족하므로, 이 페이지에서는 방향과 결론을 중심으로만 학습합니다.
Greedy proof는 첫 선택의 안전성, DP proof는 recurrence의 완전성, reduction proof는 변환의 iff/해석을 보인다.
Misconceptions: 초보자가 꼭 지워야 할 오해
첫째, Greedy는 '빠르고 간단한 알고리즘'이 아닙니다. 빠른 구현일 수는 있지만, 정확한 Greedy algorithm으로 인정받으려면 local choice가 safe하다는 증명이 있어야 합니다. 둘째, DP는 'recurrence가 있으면 다 DP'가 아닙니다. DP는 overlapping subproblems와 저장되는 state가 있어야 하며, table을 어떤 순서로 채울지도 말해야 합니다. 셋째, reduction은 '비슷한 문제로 비유하기'가 아닙니다. A instance를 B instance로 실제로 변환하고, B solver의 답을 A answer로 해석해야 합니다.
넷째, Dijkstra가 Greedy라는 사실은 negative edge에서도 작동한다는 뜻이 아닙니다. Lecture 07과 Lecture 06은 negative edge counterexample를 명시적으로 보여 줍니다. 다섯째, Greedy와 DP 모두 optimal substructure를 이야기할 수 있지만 결론은 다릅니다. DP로 optimal하게 풀 수 있다고 해서 Greedy도 항상 optimal한 것은 아닙니다. exam memory protocol에도 'DP로 optimal하게 풀 수 있으면 Greedy도 항상 optimal' 같은 trap이 등장합니다. 여섯째, 2D DP table은 자동으로 \(\Theta(n^{2})\)Θ(n²)이 아닙니다. Matrix-chain처럼 cell마다 split을 \(O(n)\)O(n)개 보면 \(\Theta(n^{3})\)Θ(n³)입니다. 일곱째, \(A \le_{p} B\)A ≤p B에서 'B가 어렵다'만 보고 A가 어렵다고 말하면 방향 오류입니다.
오해 제거 문장: paradigm 이름은 결론이 아니라 시작점이며, 각 paradigm마다 별도 증명 또는 구조 의무가 있다.
반례로 바로잡는 객관식 함정(MC Trap Clinic)
MC 문제는 보통 정확한 설명을 살짝 뒤집습니다. 'Dynamisches Programmieren은 naive recursive algorithm이 같은 Teilproblem을 여러 번 풀 때 효율적이다'는 맞는 방향입니다. 하지만 'Dynamisches Programmieren은 non-overlapping subproblems를 전제로 한다'는 false입니다. non-overlapping은 Divide and Conquer 쪽 설명에 더 가깝고, DP는 overlapping subproblems를 재사용합니다. 'Sowohl DP als auch Greedy setzen optimale Teilstruktur voraus'는 조심스럽지만 대체로 맞는 형태로 나올 수 있습니다. 그러나 'DP로 optimal하게 풀 수 있으면 Greedy도 항상 optimal'은 false입니다.
Counterexample를 붙여 외우면 안전합니다. Greedy-TSP nearest neighbor는 locally cheapest edge를 계속 골라도 N+n-1이 되어 optimum n+2보다 나쁩니다. Dijkstra negative-edge graph는 \(\text{direct} \text{path} 1\rightarrow 5 \text{weight} 5\)direct path 1→5 weight 5를 확정하지만 실제 \(\text{shortest} \text{path} 1\rightarrow 2\rightarrow 4\rightarrow 3\rightarrow 5 \text{weight} 3\)shortest path 1→2→4→3→5 weight 3이 존재합니다. Matrix-chain은 2D table이지만 \(\Theta(n^{3})\)Θ(n³)입니다. Reduction은 \(A \le_{p} B\)A ≤p B와 \(B \le_{p} A\)B ≤p A를 바꾸면 다른 주장입니다. 시험장에서 option을 읽을 때는 'always', 'only', 'implies', 'must' 같은 단어를 특히 천천히 보세요.
MC option을 볼 때마다 '전제 조건, 방향, 항상/존재, runtime 계산식' 네 가지를 체크합니다.
Oral Exam Strategy: 답안을 시간별로 압축하기
60초 답안에서는 세 paradigm을 한 문장씩 말하고, 대표 trap 하나만 붙이면 됩니다. Greedy는 locally best choice를 고르되 safe proof가 필요합니다. DP는 overlapping subproblems의 answer를 state table에 저장하고 recurrence로 채웁니다. Reduction은 A input을 B input으로 바꾸어 B solver로 A를 풉니다. Trap으로는 \(\text{Dijkstra} \text{negative} \text{edge}, 2D \text{DP} \text{runtime}, A \le_{p} B \text{direction}\)Dijkstra negative edge, 2D DP runtime, A ≤p B direction중 하나를 말합니다.
3분 답안에서는 예시를 붙입니다. Greedy 예시는 Kruskal/Prim의 MST 또는 Dijkstra입니다. 단, Dijkstra는 \(w(e)\ge 0\)w(e)≥0전제를 말해야 합니다. DP 예시는 Minimum Edit Distance입니다. D[i][j]의 의미, boundary, transition, \(\Theta(\text{mn})\)Θ(mn)을 말합니다. Reduction은 source caveat를 붙여 일반 방향 논리만 설명합니다. Deep-dive 답안에서는 exchange argument, DP recurrence proof, reduction consequence를 모두 말합니다. 이때 'source-grounded caveat'를 정확히 말하는 것도 좋은 답안입니다: 현재 Lecture 07 chunks는 DP와 Greedy를 자세히 지원하지만 reduction lecture detail은 충분하지 않아서 일반 exam logic으로 다룬다고 밝힙니다.
구두 답안은 \(\text{definition} \rightarrow \text{example} \rightarrow \text{proof} \text{obligation} \rightarrow \text{trap}\)definition → example → proof obligation → trap순서로 말하면 흔들리지 않습니다.
Closing: 한 장 cheat-sheet로 압축
이 단원을 cheat-sheet 한 칸으로 줄이면 다음과 같습니다. Greedy: choose locally best candidate; must prove safe via greedy-choice property/exchange/cut; examples Dijkstra with \(w(e)\ge 0,\)w(e)≥0, Kruskal, Prim; traps negative edges and Greedy-TSP. DP: define state; fill base, transition, order, answer; runtime = #states * transition cost; examples Fibonacci memoization \(\Theta(n)\)Θ(n), Edit Distance \(\Theta(\text{mn})\)Θ(mn), Matrix-chain \(\Theta(n^{3})\)Θ(n³); traps recurrence-only answer and 2\(D=\text{quadratic}.\)D=quadratic. Reduction: \(A \le_{p} \)A ≤p B means x in A -> f(x) in B -> solve_B -> answer_A; consequences B easy => A easy and A hard => B hard; \(\text{traps} \text{reversing} \text{arrow}\quad\text{and}\quad \text{claiming} B \text{hard} \Rightarrow A \text{hard}.\)traps reversing arrow and claiming B hard => A hard.
마지막으로 스스로에게 세 질문을 던지세요. '이 Greedy 선택을 나중에 바꾸지 않아도 되는 이유는 무엇인가?' '이 DP cell은 정확히 어떤 subproblem의 answer인가?' '이 reduction arrow는 어느 입력에서 어느 입력으로 가는가?' 이 세 질문에 답할 수 있으면, 이 페이지의 초급 강의 목표는 달성된 것입니다.
마지막 기억법: 안전하게 선택하고, 상태를 기억하며, 환원 방향을 정확히 그립니다.
단계별 풀이 예제 (Worked Examples)
Worked example: Greedy-TSP counterexample 설명
문제: Lecture 07의 complete graph family에서 consecutive edge는 1, edge {1,n}은 N, 나머지는 2입니다. 시작점 1에서 nearest-neighbor Greedy-TSP와 optimal tour를 비교하세요.
- Greedy는 1에서 시작해 가장 싼 아직 방문하지 않은 vertex로 갑니다. consecutive edge가 weight 1이므로 \(1\rightarrow 2\rightarrow ...\rightarrow n\)
1→2→...→n으로 갑니다. - 모든 vertex를 방문한 뒤 시작점 1로 돌아가야 하므로 마지막 \(\text{edge} n\rightarrow 1\)
edge n→1을 씁니다. 이 edge weight는 N입니다. - 따라서 greedy cost는 1이 n-1번 가까이 반복된 값에 N을 더한 N+n-1 형태입니다.
- 반면 optimal tour는 큰 edge {1,n}을 피하고 weight 2 edge 몇 개를 섞어 n+2 형태로 만들 수 있습니다.
- N은 임의로 크게 만들 수 있으므로 locally cheapest choice만으로 optimality가 보장되지 않습니다.
Greedy-TSP nearest neighbor는 이 family에서 arbitrarily bad가 될 수 있으며, Greedy에는 별도 safe-choice proof가 필요합니다.
Worked example: Minimum Edit Distance 작은 table
문제: X='cat', Y='cut'일 때 D[i][j] recurrence로 D[3][3]을 구하세요.
- State: D[i][j]는 X[1..i]를 Y[1..j]로 바꾸는 minimum edit cost입니다.
- Boundary: \(D[0][j]=j, D[i][0]=i\)
D[0][j]=j, D[i][0]=i입니다. - \(D[1][1]=0 \text{because} c=c. D[1][2]=1, D[1][3]=2\)
D[1][1]=0 because c=c. D[1][2]=1, D[1][3]=2입니다. - \(D[2][1]=1, D[2][2]=1 \text{because} a\)
D[2][1]=1, D[2][2]=1 because a와 u는 다르고 diagonal D[1][1]+1이 최선입니다. - D[3][3]은 \(t=t\)
t=t라서 \(\text{diagonal} D[2][2]+0=1\)diagonal D[2][2]+0=1이 최선입니다.
\(D[3][3]=1,\)D[3][3]=1,즉 a를 u로 substitute하는 하나의 operation이면 됩니다.
Worked example: Matrix-chain runtime 판단
문제: Matrix-chain DP가 2D table인데 왜 \(\Theta(n^{3})\)Θ(n³)인지 설명하세요.
- State D[i,j]는 \(\text{interval} A_{i}...A_{j}\)
interval Aᵢ...Aⱼ의 minimum multiplication cost입니다. - Interval state 수는 i,j 쌍이므로 \(\Theta(n^{2})\)
Θ(n²)입니다. - 하지만 D[i,j] 하나를 채우려면 마지막 split k를 i부터 j-1까지 모두 시도해야 합니다.
- 각 cell의 transition cost가 최악 \(O(n)\)
O(n)이므로 total은 \(\Theta(n^{2})\)Θ(n²)*\(O(n)=\Theta(n^{3})\)O(n)=Θ(n³)입니다.
DP runtime은 table 차원만 보는 것이 아니라 #states * transition cost로 계산합니다.
자주 생기는 오개념 (Common Misconceptions)
Greedy는 항상 가장 빠른 정답 알고리즘이다.
Greedy는 local choice를 하는 설계법입니다. 정답 알고리즘이 되려면 greedy-choice property, exchange argument, cut property 같은 안전성 증명이 필요합니다.
Dijkstra는 Greedy이므로 negative edge에서도 괜찮다.
틀렸습니다. Dijkstra의 extract-min 확정 논리는 nonnegative weights에 의존합니다. Lecture 07과 Lecture 06은 negative-edge counterexample를 제공합니다.
Recurrence만 쓰면 DP 답안이다.
부족합니다. DP 답안에는 state meaning, boundary, transition, evaluation order, answer cell, Laufzeit/space가 필요합니다.
2D DP table이면 Laufzeit는 \(\Theta(n^{2})\)Θ(n²)이다.
transition cost를 봐야 합니다. Edit Distance는 \(O(1)\)O(1) transition이라 \(\Theta(\text{mn})\)Θ(mn)이지만 Matrix-chain은 cell마다 \(O(n)\)O(n) splits를 보므로 \(\Theta(n^{3})\)Θ(n³)입니다.
\(A \le_{p} B\)A ≤p B는 B를 A로 바꾼다는 뜻이다.
반대입니다. A instance를 B instance로 바꾸고 B solver를 사용해 A를 풉니다.
\(A \le_{p} B\)A ≤p B이고 B가 hard이면 A도 hard이다.
일반적으로 결론이 나오지 않습니다. 올바른 hardness 방향은 \(A \text{hard}\quad\text{and}\quad A \le_{p} B \text{implies} B \text{hard}\)A hard and A ≤p B implies B hard입니다.
반례로 확인하는 객관식 함정 (MC Traps With Counterexamples)
지역적으로 가장 좋은 선택만 하면 탐욕법의 정확성이 증명된다.
수정: False. locally best는 후보 rule일 뿐이며 safe-choice proof가 필요합니다.
반례/근거: Lecture 07 Greedy-TSP family에서 nearest neighbor는 N+n-1 cost를 내지만 optimal tour는 n+2입니다.
Dijkstra는 탐욕 알고리즘이므로 음수 간선에서도 동작한다.
수정: False. Dijkstra의 correctness는 \(w(e)\ge 0\)w(e)≥0전제에 의존합니다.
반례/근거: Lecture 07/06 counterexample에서 Dijkstra는 \(1\rightarrow 5 \text{weight} 5\)1→5 weight 5를 고르지만 실제 shortest path는 \(1\rightarrow 2\rightarrow 4\rightarrow 3\rightarrow 5 \text{weight} 3\)1→2→4→3→5 weight 3입니다.
모든 2차원 동적 계획법 표는 제곱 시간에 계산된다.
수정: False. cell 수와 cell 하나를 채우는 transition cost를 곱해야 합니다.
반례/근거: Matrix-chain multiplication은 \(\Theta(n^{2})\)Θ(n²) states와 \(O(n)\)O(n) split choices 때문에 \(\Theta(n^{3})\)Θ(n³)입니다.
\(D[i][j]=\min(...)\)D[i][j]=min(...)전이식만 쓰면 동적 계획법 답안으로 충분하다.
수정: False. state meaning, boundary, fill order, answer cell, Laufzeit/space가 함께 있어야 합니다.
반례/근거: D[i][j]의 의미가 edit distance인지 matrix-chain cost인지 다르면 같은 min notation도 전혀 다른 문제입니다.
동적 계획법으로 최적해를 구할 수 있으면 탐욕법도 항상 최적해를 찾는다.
수정: 거짓입니다. 동적 계획법의 최적성은 탐욕법의 최적성을 뜻하지 않습니다.
반례/근거: Greedy-TSP nearest neighbor는 local optimum을 고르지만 global optimum을 놓칩니다.
\(A \le_{p} B\)A ≤p B는 B의 입력을 A의 입력으로 바꾼다는 뜻이다.
수정: 거짓입니다. A의 입력 x를 B의 입력 f(x)로 바꿉니다.
반례/근거: A를 풀기 위해 B solver를 빌리는 그림이므로 arrow는 \(A \rightarrow B\)A → B입니다.
\(A \le_{p} B\)A ≤p B이고 B가 어려우면 A도 어렵다.
수정: False in general. 올바른 결론은 \(B \text{easy} \Rightarrow A \text{easy}, A \text{hard} \Rightarrow B \text{hard}\)B easy => A easy, A hard => B hard입니다.
반례/근거: 어려운 B solver를 사용할 수 있다고 해서 A가 자동으로 어려워지는 것은 아닙니다.
Hill-Climbing 같은 메타휴리스틱은 항상 전역 최적해를 찾는다.
수정: 거짓입니다. Lecture 07의 지역·전역 최댓값 그림처럼 Hill-Climbing은 지역 최적점에 갇힐 수 있습니다.
반례/근거: TSP local search example에서 Greedy solution 주변의 swap neighborhood에는 더 나은 solution이 없지만 global optimum은 따로 존재합니다.
핵심 학습 항목 (Active Recall With Hints)
1
- 힌트: 세 동사로 시작하세요. Greedy, DP, reduction을 각각 choose now / remember subanswers / translate problem과 연결해 한 문장씩 정의하세요.
2
- 힌트: rule 다음 proof gate입니다. Greedy에서 locally best choice가 safe하다는 말을 어떤 성질 또는 증명 기법으로 보이나요?
3
- 힌트: O, e, g, O'를 사용하세요. Exchange argument의 기본 틀 O'=O-e+g를 말하고 feasible과 cost 조건을 설명하세요.
4
- 힌트: 전제 조건 하나입니다. Dijkstra의 extract-min 확정이 \(w(e)\ge 0\)
w(e)≥0에 의존하는 이유를 shortest path proof intuition으로 말하세요.
5
- 힌트: 큰 N을 떠올리세요. Greedy-TSP counterexample에서 greedy cost N+n-1과 optimum n+2가 어떻게 생기는지 설명하세요.
6
- 힌트: 여섯 항목입니다. DP 답안 template state, boundary, transition, order, answer, Laufzeit/space를 순서대로 말하세요.
7
- 힌트: prefix 의미입니다. Minimum Edit Distance에서 D[i][j]가 무엇을 의미하는지 정확히 말하세요.
8
- 힌트: diagonal/up/left입니다. Edit Distance transition의 세 후보가 각각 copy/substitution, deletion, insertion과 어떻게 연결되나요?
9
- 힌트: #states * transition cost입니다. Edit Distance가 \(\Theta(\text{mn})\)
Θ(mn)인 이유를 states와 transition cost로 설명하세요.
10
- 힌트: split k입니다. Matrix-chain multiplication이 2D table인데 \(\Theta(n^{3})\)
Θ(n³)인 이유를 말하세요.
11
- 힌트: arrow를 그리세요. \(A \le_{p} B\)
A ≤p B에서 \(x, f(x), \text{solve}_{B}, \text{answer}_{A}\)x, f(x), solve(B), answer(A)의 순서를 설명하세요.
12
- 힌트: easy/hard direction입니다. \(A \le_{p} B\)
A ≤p B일 때 \(B \text{easy} \Rightarrow A \text{easy}\)B easy => A easy와 \(A \text{hard} \Rightarrow B \text{hard}\)A hard => B hard가 왜 맞는지 말하세요.
13
- 힌트: 잘못된 방향을 찾으세요. \(A \le_{p} B\)
A ≤p B이고 B hard이면 A hard라는 주장이 왜 일반적으로 틀렸나요?
14
- 힌트: source caveat도 답안 능력입니다. 이 페이지에서 reduction을 일반 논리로 제한한 이유를 source-grounded하게 말하세요.
구두시험 답변 연습 (Oral Exam Scripts)
핵심 학습 항목 (60-second)
Greedy, DP, reduction은 세 가지 Entwurfsmethoden입니다. Greedy는 solution을 locally best choices로 만들지만, 답안에서는 그 choice가 safe하다는 greedy-choice property나 exchange argument를 말해야 합니다. DP는 overlapping subproblems의 answer를 state table에 저장합니다. 그래서 state, boundary, transition, order, answer cell, Laufzeit를 말합니다. Reduction은 \(A \le_{p} B\)A ≤p B방향입니다: A input x를 B input f(x)로 바꾸고 B solver로 A를 풉니다. 대표 함정은 Dijkstra negative edge, 2D DP가 항상 quadratic이라는 착각, reduction arrow reversal입니다.
핵심 학습 항목 (3-minute)
먼저 Greedy입니다. Lecture 07의 정의처럼 prefix solution에 locally most favorable candidate를 붙입니다. 하지만 correctness는 local choice 자체에서 나오지 않습니다. Kruskal과 Prim은 light edge가 safe하다는 MST cut/exchange intuition으로 설명하고, Dijkstra는 \(w(e)\ge 0\)w(e)≥0일 때 extract-min vertex의 dist가 final이라는 proof idea로 설명합니다. Negative edge에서는 Lecture 07/06 counterexample처럼 실패합니다.
다음은 DP입니다. Lecture 07의 Fibonacci는 repeated subproblems를 memoization으로 줄이는 직관이고, Minimum Edit Distance는 exam-ready template입니다. D[i][j]는 X[1..i]를 Y[1..j]로 바꾸는 minimum cost입니다. Boundary는 \(D[0][j]=j\)D[0][j]=j와 \(D[i][0]=i\)D[i][0]=i이고, transition은 diagonal/up/left minimum입니다. States는 \(\Theta(\text{mn})\)Θ(mn), transition은 \(O(1)\)O(1), 그래서 \(\Theta(\text{mn})\)Θ(mn)입니다. Matrix-chain은 2D state지만 each cell scans split k, 그래서 \(\Theta(n^{3})\)Θ(n³)입니다.
마지막으로 reduction입니다. 현재 indexed source는 reduction detail이 부족하므로 일반 방향 논리로 말합니다. \(A \le_{p} B\)A ≤p B는 A를 풀기 위해 B solver를 빌린다는 뜻이고, \(A \text{입력} \rightarrow B \text{입력} \rightarrow B \text{solver} \rightarrow A \text{answer}\)A input → B input → B solver → A answer입니다. 따라서 B easy이면 A easy이고, A hard이면 B hard입니다. 반대 방향 결론은 조심해야 합니다.
핵심 학습 항목 (deep-dive)
Deep dive에서는 proof obligations를 비교하겠습니다. Greedy correctness는 첫 선택의 안전성입니다. 어떤 optimal solution O가 greedy choice g를 포함하지 않는다고 가정하고, O에서 e를 빼고 g를 넣은 O'=O-e+g가 feasible이며 objective가 나빠지지 않음을 보이면 exchange argument가 됩니다. MST cut property는 이 구조를 edge와 cut으로 구현합니다. Dijkstra는 exchange보다는 settled set invariant에 가깝습니다. S에 들어간 vertex는 shortest distance가 확정되어 있고, extract-min u가 틀렸다고 가정하면 shortest path에서 S 밖으로 처음 나가는 y를 잡아 nonnegative weights와 extract-min order로 모순을 만듭니다.
DP correctness는 recurrence의 완전성입니다. Edit Distance의 optimal edit sequence는 마지막 operation이 copy/substitution, deletion, insertion 중 하나입니다. 이 세 경우가 각각 diagonal, up, left predecessor state를 정확히 덮기 때문에 min recurrence가 맞습니다. Matrix-chain은 optimal parenthesization의 마지막 split k가 있고, 왼쪽과 오른쪽 interval이 optimal이어야 합니다. 그렇지 않으면 더 싼 부분해로 전체 cost를 줄일 수 있습니다.
Reduction correctness는 transformation correctness입니다. x가 A의 yes-instance이면 f(x)가 B의 yes-instance이고, 반대로 f(x)가 B의 yes-instance이면 x가 A의 yes-instance임을 보이거나, solution 변환을 설명합니다. 이 페이지에서는 source gap 때문에 특정 NP reduction을 새로 주장하지 않고, \(A \le_{p} B\)A ≤p B의 방향과 easy/hard consequences를 exam logic으로 고정합니다.
기호와 수식 (Symbols and Formulas)
| 항목 (Symbol / term) | 항목 (Meaning) | 항목 (Exam note) |
|---|---|---|
\(x=(x1,...,\text{xn})\)x=(x1,...,xn) |
Greedy가 단계별로 만들어 가는 solution sequence | xi를 locally best candidate로 고른 뒤 safe proof가 필요합니다. |
g |
현재 greedy rule이 고른 choice | g를 포함하는 optimal solution이 있음을 보여야 합니다. |
\(O' = O - e + g\)O' = O - e + g |
Exchange argument에서 기존 optimal solution O를 greedy choice g가 들어가도록 바꾼 solution | feasible(O')와 cost(O') <= cost(O)를 함께 말합니다. |
\(w(e) \ge 0\)w(e) ≥ 0 |
Dijkstra correctness에 필요한 nonnegative edge weight condition | zero edge는 가능하지만 negative edge는 counterexample가 있습니다. |
D[i][j] |
DP state. 문제마다 의미를 먼저 정의해야 하는 table cell | Edit Distance에서는 \(X[1..i] \rightarrow Y[1..j] \text{minimum} \text{cost}\)X[1..i] → Y[1..j] minimum cost입니다. |
\(D[0][j]=j, D[i][0]=i\)D[0][j]=j, D[i][0]=i |
최소 편집 거리의 경계값(Minimum Edit Distance boundary conditions) | 빈 string에서 prefix를 만들거나 prefix를 빈 string으로 지우는 cost입니다. |
\(D[i][j]=\min\{\text{diag}+s, \text{up}+1, \text{left}+1\}\)D[i][j]=min{diag+s, up+1, left+1} |
편집 거리의 전이식(Edit Distance transition) | \(\text{diagonal}=\text{copy}/\text{substitution}, \text{up}=\text{delete}, \text{left}=\text{insert}\)diagonal=copy/substitution, up=delete, left=insert입니다. |
상태 수 × 전이 비용 |
DP Laufzeit 계산의 기본 규칙 | 2D table이라고 자동으로 quadratic이라고 하지 마세요. |
\(D[i,j]=\text{min}_{i \le k < j}{D[i,k]+D[k+1,j]+p_{i-1} p_{k} p_{j}}\)D[i,j]=minᵢ ≤ k < j}{D[i,k]+D[k+1,j]+pᵢ-1} pₖ pⱼ} |
행렬 곱셈 순서의 구간 동적 계획법 전이식(Matrix-chain transition) | 각 cell에서 k를 여러 개 시도하므로 \(\Theta(n^{3})\)Θ(n³)입니다. |
\(A \le_{p} B\)A ≤p B |
A는 B로 다항 시간 환원 가능(A is polynomial-time reducible to B) | A input을 B input으로 바꾸고 B solver를 빌립니다. |
\(B\in P \Rightarrow A\in P\)B ∈ P => A ∈ P |
\(A \le_{p} B\)A ≤p B일 때 easy direction |
B solver가 빠르면 A도 transformation + solver로 빠르게 풉니다. |
\(A \text{hard} \Rightarrow B \text{hard}\)A hard => B hard |
\(A \le_{p} B\)A ≤p B일 때 hardness direction |
B가 쉬우면 A도 쉬워져야 하므로 A의 어려움이 B로 전달됩니다. |
출처에 근거한 설명 (Source-Grounded Notes)
- Vorlesung\07AdvancedDesigns.pdf 1~3쪽: 분할 정복, 백트래킹, 동적 계획법, 탐욕법, 메타휴리스틱을 포함한 고급 설계 방법 개요.
- Vorlesung\07AdvancedDesigns.pdf 52~55쪽: 동적 계획법 원리, 피보나치 중복 계산 트리, 메모이제이션, \(\Theta(n)\)
Θ(n)동적 버전. - Vorlesung\07AdvancedDesigns.pdf 56~72쪽: 최소 편집 거리 정의, D[i][j] 상태, 경계 행·열, 대각선·위·왼쪽 전이, \(\Theta(\text{mn})\)
Θ(mn), 복원 설명. - Vorlesung\07AdvancedDesigns.pdf 28~37쪽: 행렬 곱셈 순서 동적 계획법과 구간 분할 아이디어.
- Vorlesung\07AdvancedDesigns.pdf 73~75쪽: 탐욕 원리, Dijkstra·Kruskal 예시, 음수 간선 Dijkstra 반례.
- Vorlesung\07AdvancedDesigns.pdf 76~81쪽: TSP 정의, 최근접 이웃 Greedy-TSP, 탐욕 비용 N+n-1과 최적 비용 n+2의 반례 계열.
- Vorlesung\07AdvancedDesigns.pdf 83~97쪽: 휴리스틱·메타휴리스틱, Hill-Climbing, 지역·전역 최댓값, Simulated Annealing과 정확한 탐욕법·동적 계획법의 증명 의무 비교.
- Vorlesung\06GraphAlgorithms.pdf 및 Vorlesung\06GraphAlgorithms__moodle_2026-06-16.pdf 106~108쪽 부근: Kruskal·Prim MST 문맥과 Prim의 가벼운 간선 성장 아이디어.
- Vorlesung\06GraphAlgorithms__moodle_2026-06-16.pdf 161~174쪽: Dijkstra 정확성 직관과 음수 간선 실패 세부 내용.
- AuD 2025년 여름학기 복기 자료의 객관식 구간: 동적 계획법의 반복 하위 문제, 탐욕법과 동적 계획법의 최적성, 탐욕 알고리즘으로서의 Dijkstra, 백트래킹, 메타휴리스틱, '동적 계획법은 겹치지 않는 하위 문제를 쓴다'는 거짓 문장.
- 자료 범위 한계: 색인된 로컬 조각에는 구체적인 NP 환원을 포함한 환원 강의 전체가 없습니다. 따라서 근거 없는 강의별 예시를 만들지 않고 일반적인 \(A \le_{p} B\)
A ≤p B의 방향과 결론까지만 설명합니다.
AI 후속 학습 프롬프트
관련 개념
다음 튜터 프롬프트
마지막 생성: 2026-08-03 03:24