백준 1920번

백준 1920번

수 찾기

시간 제한 : 1초 메모리 제한 : 128 MB

문제

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을 출력한다

해설

이 문제는 첫번째 입력 받은 배열 중 두번째 배열에서 입력한 값이 있으면 1 없으면 0을 출력하는 간단한 문제이다. 첫번째 배열에서 같은 값을 빠르게 찾으려면 이진탐색법으로 간단하게 풀수있다. 첫번째 배열을 qsort로 정렬 후 이진탐색법을 이용해서 있으면 1 없으면 0을 출력하게 하면 된다.

#define _CRT_SECURE_NO_WARNINGS    
#include <stdio.h>
#include <stdlib.h>

int compare(const void* a, const void* b) {
	int num1 = *(int*)a;
	int num2 = *(int*)b;

	if (num1 < num2)
	{
		return -1;
	}
	if (num1 > num2)
	{
		return 1;
	}
	return 0;
}


int bray(int data[], int a, int high) {
    int low = 0;
    while (low <= high)
    {
        int mid = (low + high) / 2;
        if (data[mid] == a)
        {
            return 1;
        }
        else if (data[mid] > a)
        {
            high = mid - 1;
        }
        else if (data[mid] < a)
        {
            low = mid + 1;
        }
    }
    return 0;
}

int main(void) {
	int n;
	scanf("%d", &n);
	int arr[n];

	for (int i = 0; i < n; i++) {
		scanf("%d", &arr[i]);
	}

	int m;
	scanf("%d", &m);
	int arr2[m];

	for (int i = 0; i < m; i++) {
		scanf("%d", &arr2[i]);
	}

	qsort(arr, n, sizeof(int), compare);

	for (int j = 0; j < m; j++) {
		printf("%d\n", bray(arr, arr2[j], n-1));
	}
	return 0;
}
Written on September 25, 2022