January 26, 2021
https://www.acmicpc.net/problem/10815
문제
첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다. 두 숫자 카드에 같은 수가 적혀있는 경우는 없다.
셋째 줄에는 M(1 ≤ M ≤ 500,000)이 주어진다. 넷째 줄에는 상근이가 가지고 있는 숫자 카드인지 아닌지를 구해야 할 M개의 정수가 주어지며, 이 수는 공백으로 구분되어져 있다. 이 수도 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다
입력
첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들이 A안에 존재하는지 알아내면 된다. 모든 정수의 범위는 -231 보다 크거나 같고 231보다 작다.
출력
첫째 줄에 입력으로 주어진 M개의 수에 대해서, 각 수가 적힌 숫자 카드를 상근이가 가지고 있으면 1을, 아니면 0을 공백으로 구분해 출력한다.
이진 탐색으로 풀면 쉽게 풀리는 문제였다. 이진 탐색은 일단 대상 배열이 정렬되어야 하기 때문에 sort 함수를 사용해서 정렬한 후에, 이진 탐색 알고리즘을 적용해서 target 값을 찾으면 true를, 아니면 false 를 반환하도록 했다.
#include <cstdio>
#include <algorithm>
int cards[500001];
using namespace std;
bool binarySearch(int size, int target){
int head = 0;
int tail = size - 1;
int mid;
while(head <= tail){
mid = (head + tail) / 2;
if (cards[mid] == target) return true;
else if (cards[mid] < target) head = mid + 1;
else if (cards[mid] > target) tail = mid - 1;
}
return false;
}
int main (){
int N;
scanf("%d", &N);
for (int i = 0 ; i < N ; i++){
scanf("%d", &cards[i]);
}
sort(cards, cards+N);
int M;
scanf("%d", &M);
while(M--){
int target;
scanf("%d", &target);
if(binarySearch(N, target)) printf("1 ");
else printf("0 ");
}
}
}