이분 탐색이란?
이분 탐색(binary search) 은 정렬된 데이터에서 찾는 값의 위치를 매번 후보
범위를 절반으로 줄여 가며 \(O(\log N)\)에 찾는 알고리즘입니다.
전화번호부에서 이름을 찾을 때 처음부터 한 장씩 넘기지 않고, 중간을 펼쳐 보고
앞/뒤를 결정하는 것과 똑같은 원리입니다.
전제 조건은 단 하나: 데이터가 정렬되어 있어야 합니다.
1. 동작 과정
찾는 값 target을 정렬된 배열에서 찾는 과정:
- 범위의 가운데
mid를 본다. a[mid] == target이면 찾았다.a[mid] < target이면 답은 오른쪽 절반에 있다 → 왼쪽 버림.a[mid] > target이면 답은 왼쪽 절반에 있다 → 오른쪽 버림.- 범위가 빌 때까지 반복.
매 단계마다 후보가 절반으로 줄어드니, \(N\)개를 단 \(\log_2 N\)번 만에 다 걸러냅니다.
2. 왜 \(O(\log N)\)인가
\(N\)을 절반으로 몇 번 나누면 1이 될까요? \(N \to N/2 \to N/4 \to \cdots \to 1\),
즉 \(\log_2 N\)번입니다. \(N = 10^9\)여도 약 \(30\)번이면 끝납니다.
| \(N\) | 선형 탐색 \(O(N)\) | 이분 탐색 \(O(\log N)\) |
|---|---|---|
| \(10^3\) | 1,000 | 약 10 |
| \(10^6\) | 1,000,000 | 약 20 |
| \(10^9\) | 10억 | 약 30 |
이 압도적인 차이가 이분 탐색을 강력하게 만듭니다.
3. 단순 검색을 넘어서: 경계 찾기
이분 탐색의 진짜 위력은 "값이 있나?"가 아니라 "조건을 만족하는 경계" 를 찾는
데 있습니다.
- lower_bound:
target이상인 첫 위치. - upper_bound:
target초과인 첫 위치.
이 둘만 있으면 "특정 값의 개수"(= upper - lower), "내 값 이상인 가장 작은 값"
등을 모두 구할 수 있습니다.
4. 결정 문제로의 일반화
배열이 아니어도 "답을 기준으로 조건이 한 번 거짓→참(또는 참→거짓)으로 바뀌는"
단조성이 있으면 이분 탐색을 쓸 수 있습니다. 이를 매개 변수 탐색
(parametric search) 이라 하며 별도 주제로 깊이 다룹니다.
예: "케이블을 길이 \(x\)로 자르면 \(K\)개 이상 나오는가?"는 \(x\)가 작을수록 참,
클수록 거짓입니다. 이 경계 \(x\)를 이분 탐색으로 찾습니다.
5. 정확성의 열쇠: 단조성
이분 탐색이 옳으려면 단조성(monotonicity) 이 반드시 있어야 합니다. 정렬된
배열에서는 "값이 커지는 순서"가 곧 단조성입니다. 결정 문제에서는 "조건의
참/거짓이 한 번만 바뀌는" 성질입니다. 이 성질이 없으면 절반을 버리는 것이
정당하지 않아 답이 틀립니다.
정리
이분 탐색은 정렬(또는 단조성)을 무기로 후보를 매번 절반씩 버려 \(O(\log N)\)에
답을 찾습니다. 단순 검색뿐 아니라 lower/upper_bound, 매개 변수 탐색으로 확장되는
강력한 도구입니다. 다음 강의에서 구현의 함정을 정복합니다.