정렬된 배열에서 특정 데이터를 빠르게 찾는 탐색 알고리즘이다. 데이터를 찾을 때 순차가 아닌 범위를 반씩 좁혀나가며 탐색한다. 쉽게 표현하면 업다운 게임에서 1~50숫자중 하나를 맞출 때 25를 처음에 외치는 이유와 비슷하다.

그림과 같이 배열이 존재할 때 22번을 찾는 방법은 다음과 같다.



해당 그림으로 배열에서 22를 찾는 방법이 정리되어 있다. 이를 통해 이분 탐색 알고리즘을 정리하면 다음과 같다.
이분 탐색 알고리즘의 정리는 위 내용으로 끝난다. 그러면 이제 코드를 작성하면 다음과 같다.
#include <bits/stdc++.h>
using namespace std;
int a[100002];
int n, num;
bool binarySearch(int num)
{
int st = 0;
int en = n-1;
while(st <= en)
{
int mid = (st+en)/2;
if(a[mid] == num)
{
return 1;
}
else if(a[mid] < num) st = mid + 1;
else en = mid - 1;
}
return 0;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for(int i=0;i<n;i++) cin >> a[i];
sort(a, a+n);
cin >> num;
cout << binarySearch(num);
return 0;
}
// 입력
5
4 1 5 2 3
5
// 출력
1
이분 탐색은 생각보다 간단하나 이를 변형하고 문제로 풀면 많이 어렵다고 들었다.
또한 Parametric Search에도 연관이 있다 들었는데 이런 경우는 조금만 틀어도 난이도가 극악으로 치솟는다는데 상당히 많은 문제를 풀어봐야 할 듯하다.
Reference
[실전 알고리즘] 0x13강 이분탐색 - BaaaaaaaarkingDog