배열 크기를 절반으로 줄이면서 답을 찾는것
반복문으로 구현
O(logn)
입력 범위 N이 큰편
미리 정렬 필수
최적화 문제를 결정문제로 바꾸어 풀기 (YES/NO로)
ex1) 자동차를 탈 수 있는 가장 어린 사람의 번호는? (19세 이상만 가능)
→ 자동차를 탈 수 있는 사람인지 결정하는 문제로 바꾸어 생각하기
나이순으로 정렬이 되어있는 상태에서, 이분탐색을 하는것.
다만 정확한 숫자를 찾는 것은 아니므로, 자동차를 탈 수 있는 대상을 찾았다 하더라도, 왼쪽에 있는 사람도 탈 수 있는 나이인지 확인해야함.
ex2) 공유기 C개를 설치할때, 가장 인접한 공유기 사이의 최대 거리는?
→ 가장 인접한 공유기 사이 거리가 K일때, C개를 설치할 수 있는가?
→ YES인 애들중에서 최댓값이 최대거리인것
→ 인덱스를 거리로 두고, 원소값이 바로 최대 공유기 개수
시간복잡도 = O(logn)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> arr;
int binary_search(int left, int right, int target) {
//재귀로 하면 너무 오래걸림 절대 안됨
while(left <= right) {
int mid = (left + right) / 2;
if(arr[mid] == target) return 1;
else if (arr[mid] > target) right = mid - 1;
else left = mid + 1;
}
return 0;
}
int main() {
int n, m, input;
cin >> n;
arr.assign(n, 0); //선언 후에 이렇게 초기화할 수 있구나
for(int i = 0; i < n; i++) {
cin >> arr[i];
}
sort(arr.begin(), arr.end());
cin >> m;
for(int i = 0; i < m; i++) {
cin >> input;
cout << binary_search(0, n-1, input) << "\n";
}
}