N개의 정수 A[1], A[2], …, A[N]이 주어져 있을 때, 이 안에 X라는 정수가 존재하는지 알아내는 프로그램을 작성하시오.
첫째 줄에 자연수 N(1≤N≤100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1≤M≤100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들이 A안에 존재하는지 알아내면 된다. 모든 정수의 범위는 -231 보다 크거나 같고 231보다 작다.
M개의 줄에 답을 출력한다. 존재하면 1을, 존재하지 않으면 0을 출력한다.
이분 탐색을 하기위해선 정렬된 값들이 필요하다.
받은 값을 정렬 후 시작점과 끝점을 설정해준다.
begin = 0; end = n;
다음으로 중간점을 설정해준다.
mid = begin + end >> 1
찾을 값이 mid 값보다 작으면 end값을 mid로 바꿔주고 mid 값보다 크면 begin값을 mid로 바꿔준다.
시작값과 끝값의 차이가 2이상 날때 mid 값이 바뀌게 됨으로 begin + 1 < end
까지 수행한다.
(ex. begin = 4, end = 5이면 mid가 항상 4가 됨)
#include <iostream>
#include <algorithm>
using namespace std;
bool check(int x, int num)
{
return x <= num;
}
int main()
{
#ifdef LOCAL
freopen("input.txt", "r", stdin);
#endif
cin.tie(NULL);
cout.tie(NULL);
ios::sync_with_stdio(false);
int arr[100001];
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> arr[i];
}
sort(arr, arr + n, less<int>());
int m;
cin >> m;
for (int i = 0; i < m; i++)
{
int num;
cin >> num;
int begin = 0, end = n;
while (begin + 1 < end)
{
int mid = begin + end >> 1;
if (check(arr[mid], num))
begin = mid;
else
end = mid;
}
if (arr[begin] == num)
cout << 1 << "\n";
else
cout << 0 << "\n";
}
}