[C] 1920번: 수 찾기

[C] 1920번: 수 찾기
2026-03-07

문제#

https://www.acmicpc.net/problem/1920

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-2^{31} 보다 크거나 같고 2312^{31} 보다 작다.

출력#

M개의 줄에 답을 출력한다. 존재하면 1을, 존재하지 않으면 0을 출력한다.

풀이#

배열에서 어떤 수가 존재하는지 빠르게 확인하려면 먼저 정렬해야 합니다.

그다음 각 질의값마다 이분 탐색을 수행하면 됩니다.

  • 배열을 정렬한다
  • 찾고 싶은 값을 이분 탐색한다
  • 찾으면 1, 없으면 0 출력한다

입력 크기가 크기 때문에, 단순 선형 탐색으로 매번 찾으면 시간이 오래 걸립니다.
정렬 후 이분 탐색을 사용하면 각 질의마다 빠르게 확인할 수 있습니다.

코드#

#include <stdio.h>
#include <stdlib.h>
int a[100000];
int compare(const void *x, const void *y) {
int n1 = *(const int *)x;
int n2 = *(const int *)y;
if (n1 < n2) return -1;
if (n1 > n2) return 1;
return 0;
}
int binary_search(int key, int size) {
int low = 0;
int high = size - 1;
while (low <= high) {
int mid = (low + high) / 2;
if (a[mid] == key) {
return 1;
} else if (key < a[mid]) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return 0;
}
int main() {
int n, m;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
qsort(a, n, sizeof(int), compare);
scanf("%d", &m);
for (int i = 0; i < m; i++) {
int x;
scanf("%d", &x);
printf("%d\n", binary_search(x, n));
}
return 0;
}