[백준 / C언어] 1920번: 수 찾기

728x90
728x90

슬라이드1.JPG

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

1920.png

난이도: solved.ac 실버 4

 

 

정렬과 이분 탐색(Binary Search)을 활용한 문제다

 

나는 A라는 배열에 M개의 수를 저장한 후 qsort를 돌려주었고

 

B라는 배열에 M개의 수를 저장한 후 Binary Search 함수를 이용해 값이 있으면 1, 값이 없으면 0을 리턴하도록 만들었다

 

 

만약 나처럼 compare 함수를 이렇게 썼다면 아래의 전체 코드에 있는 compare 함수처럼 바꿔야 한다

 

int compare(int* a, int* b) {
return *a - *b;
}

 

위처럼 하면 5%에서 오답 처리가 되는데

 

아래의 케이스처럼 input에 2^(-32)나 2^32 가 있을 때 문제가 된다

4
2147483647 -5 -8 -11
4
2147483647 -5 -8 -11

 

 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int A[100000];
int B[100000];
int compare(const void* a, const void* b) {
int x = *(int*)a;
int y = *(int*)b;
if (x < y) return -1;
else if (x > y) return 1;
else return 0;
}
int main() {
int N, M, i;
scanf("%d", &N);
for (i = 0; i < N; i++)
scanf("%d", &A[i]);
qsort(A, N, sizeof(int), compare);
scanf("%d", &M);
for (i = 0; i < M; i++)
scanf("%d", &B[i]);
for (i = 0; i < M; i++)
printf("%d\n", find(B[i], 0, N - 1));
return 0;
}
int find(int num, int start, int end) {
if (end < start)
return 0;
int middle = (start + end) / 2;
if (num == A[middle])
return 1;
else if (num < A[middle])
find(num, start, middle - 1);
else
find(num, middle + 1, end);
}
반응형