
Binary Search의 정의
- 문제를 둘로 쪼개서 답이 나올 수 있는 범위만 탐색하는 것
Binary Search의 특징
Divide and Conquer & Binary Search
분할 정복 알고리즘(Divide and Conquer)
- Divide : 문제를 하나 또는 둘 이상으로 나눈다.
- Conquer : 나눠진 문제가 충분히 작고, 해결이 가능하다면 해결하고, 그렇지 않다면 다시 나눈다.
이진 탐색(Binary Search)
- Divide : 리스트를 두 개의 서브 리스트로 나눈다.
- Conquer : 검색할 숫자가 중간 값보다 작다면 앞부분의 서브 리스트에서 검색할 숫자를 찾고 검색할 숫자가 중간 값보다 크다면 뒷부분의 서브 리스트에서 검색할 숫자를 찾는다.
- 재귀적으로 구현한다.
Binary Search 시간복잡도
- 처리할 때마다 탐색할 데이터가 21씩 감소한다.
- O(log2n+1)의 시간 복잡도를 가진다.(1은 마지막 배열의 크기가 1일 때의 비교)
대표 예제
[백준] 1920번 수 찾기
📝 문제

📌 풀이
- 입력받은 배열을 정렬한다.
- Binary Search를 이용하여 해결하며, 이는 배열의 중간 값을 찾고 그보다 검색하는 수가 크면 오른쪽 배열에서 찾고 작으면 왼쪽배열에서 찾는 방식으로 해결하는 방식이다.
- BS 함수의 인수로는 (시작, 끝, 검색할 수)가 들어가며 만약 BS(0, 5, 4)인 경우에는 인덱스 0, 1, 2, 3, 4 중에 4를 찾는다는 것을 의미한다.
- 재귀적으로 해결한다.
💻 코드
#include <iostream>
#include <algorithm>
using namespace std;
int A[100000];
int BS(int start, int end, int search) {
if (end - start == 1 && search == A[start]) {
return 1;
}
if (end - start == 1 && search != A[start]) {
return 0;
}
if (end - start == 0) {
return 0;
}
int medium = (start + end) / 2;
if (search == A[medium]) {
return 1;
}
else {
if (search > A[medium]) {
return BS(medium, end, search);
}
else if (search < A[medium]) {
return BS(start, medium, search);
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N;
cin >> N;
for (int i = 0; i < N; i++) {
cin >> A[i];
}
sort(A, A + N);
int M;
cin >> M;
for (int i = 0; i < M; i++) {
int tmp;
cin >> tmp;
cout << BS(0, N, tmp) << '\n';
}
return 0;
}