잡동사니/[2022] 회로이론

[백준/C] 1920번 수 찾기 (이진 탐색)

heylo 2022. 12. 11. 02:57

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

 

1920번: 수 찾기

첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들

www.acmicpc.net

 

이진탐색은 이미 소팅이 되어있어야 사용할 수 있다

C언어 내장함수 퀵 소트 함수 qsort를 이용하기 위해

compare 함수도 함께 선언하였다

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define MAX 100001
#define COMPARE(x, y) ( ((x) < (y)) ? -1 : ((x) == (y) ? 0: 1 ) )

int compare(const void* a, const void* b) // 비교함수: 뒷 수가 크면 -1, 같으면 0, 앞의 수가 크면 1
{
    int num1 = *(int*)a;
    int num2 = *(int*)b;

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

int iterbinsearch(int list[], int find, int left, int right){
    int middle;
    while (left <= right) {
        middle = (left + right) / 2;

        int compareNum = COMPARE(list[middle], find);

        if (compareNum == 0) {
            printf("1\n");
            return 0;
        }

        else if (compareNum > 0) {
            right = middle - 1;
        }

        else if (compareNum < 0) {
            left = middle + 1;
        }

    }
    printf("0\n");
    return 0;
}


int main(void) {

    int i; // iteration
    int N, numbers[MAX];
    scanf("%d", &N);

    for (i = 0; i < N; i++) {
        scanf("%d", &numbers[i]);
    }

    qsort(numbers, N, sizeof(int), compare); // (정렬할 배열, 요소개수, 요소크기, 비교함수)

    int M, search;
    scanf("%d", &M);
    
    for (i = 0; i < M; i++) {
        scanf("%d", &search);
        iterbinsearch(numbers, search, 0, N-1);
    }
    
    return 0;
}