어떤 문제를 푸는가
"가능한 최댓값/최솟값은 얼마인가?" 형태의 최적화 문제를, "값 \(X\)가 가능한가?"
라는 예/아니오 판정 문제로 바꿔 그 답 자체를 이분 탐색하는 기법입니다.
매개 변수 탐색(parametric search), 흔히 "답에 대한 이분 탐색"이라 부릅니다.
예: "전선 \(K\)개를 길이 \(X\)씩 자를 수 있는가?", "\(M\)개 공유기를 최소 간격 \(X\)
이상으로 놓을 수 있는가?" — 직접 최적값을 구하긴 어렵지만, 특정 \(X\)의 가능
여부는 쉽게 판정할 수 있습니다.
성립 조건 — 단조성(monotonicity)
이 기법이 통하려면 판정 함수 feasible(X)가 단조 여야 합니다.
$$ \text{어떤 } X_0 \text{에서 } \text{feasible 가 } \text{거짓→참(또는 참→거짓)으로 한 번만 바뀐다} $$
예를 들어 "길이 \(X\) 이하로 자르기가 가능"이 어떤 경계 아래에서는 항상 참,
위에서는 항상 거짓이면, 그 경계를 이분 탐색으로 찾을 수 있습니다.
직관: \(X\)가 작을수록(또는 클수록) 조건을 만족하기 쉬워지는 구조가 있어야
합니다. 이 단조성이 없으면 이분 탐색이 엉뚱한 곳에 수렴합니다.
절차
- 답이 들어 있는 탐색 범위 \([lo, hi]\)를 잡는다.
- 중간값 \(mid\)에 대해
feasible(mid)를 판정한다. - 참이면 더 좋은 쪽으로(예: 최댓값을 찾으면 \(lo = mid\)), 거짓이면 반대쪽으로
범위를 좁힌다. - 범위가 한 점으로 수렴할 때까지 반복.
복잡도
판정 한 번이 \(O(C)\), 탐색 범위가 \(R\)이면
$$ O(C \cdot \log R) $$
직접 최적화가 \(O(C \cdot R)\)이나 더 나쁜 것을 \(\log R\) 배로 줄여 줍니다.
\(R\)이 \(10^9\)이라도 약 30번 판정이면 충분합니다.
핵심 사고법
문제를 보고 "이 양을 직접 구하긴 어려운데, 특정 값으로 충분/가능한지 판정
하기는 쉽지 않은가?"를 자문하세요. 그 질문에 "예"라면 매개 변수 탐색의
신호입니다. 어려운 최적화를 쉬운 판정으로 바꾸는 발상의 전환이 본질입니다.
다음 강의에서 정수/실수 구현과 경계 처리를 봅니다.