1920번: 수 찾기
첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들
www.acmicpc.net
학회 스터디 강의할 때 다룬 문제
이분 탐색을 구현해서 푸는 코드와 STL 사용하는 코드 모두 보여드렸다.
int arr[100000];
bool search(int left, int right, int key);
int main()
{
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int n, m;
cin >> n;
for (int i = 0; i < n; i++) cin >> arr[i];
sort(arr, arr + n); // 정렬 필수, <algorithm> 헤더에 포함
cin >> m;
while (m--) {
int query; cin >> query;
cout << search(0, n, query) << ENDL; // [0, n) 인덱스의 배열에 query 값이 있는지 확인
}
}
bool search(int left, int right, int key) {
if (!(left < right)) { // 탐색할 구간의 크기가 0인 경우
return false; // 찾는 값이 없었으므로 false 반환
}
int mid = (left + right) / 2;
if (arr[mid] == key) { // 찾는 값이 있으면 true 반환
return true;
}
else if (key < arr[mid]) { // 중앙값이 key보다 크므로 왼쪽 절반 구간으로 이동
return search(left, mid, key);
}
else if (arr[mid] < key) { // 중앙값이 key보다 작으므로 오른쪽 절반 구간으로 이동
return search(mid + 1, right, key);
}
}
int arr[100000];
int main()
{
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int n; cin >> n;
for (int i = 0; i < n; i++) cin >> arr[i];
sort(arr, arr + n);
int m; cin >> m;
while (m--) {
int query; cin >> query;
cout << binary_search(arr, arr + n, query) << ENDL; //<algorithm> 헤더
}
}