안녕하세요 황지원입니다.
한 달 전에 정렬하는 법 몰라서 못 풀었던 문제 오늘 풀었습니다.
실버 4의 문제인데요, 푸는 방법은 이렇습니다.
n개의 정수 A[N]을 정렬해준 다음에
m개의 정수가 A안에 있는지 찾아주기만 하면 되는 간단한 문제입니다.
실버 4인데 이분탐색 안 쓸 줄 알고 알고리즘 고민하다가 설마 이분탐색 쓰나 봤더니 정말 이분탐색 쓰던군요.
유의하셔야 할 점은 딱히 없습니다.
정수의 범위가 -2^31 ~ 2^31 이라는 점에 유의해서 int 형이 아닌 long long을 써보세요.
반례 드리겠습니다.
4
2147483647 10 -2147483640 0
5
0 0 0 2147483647 9
정답
1
1
1
1
0
5
0 0 0 0 0
5
1 1 1 1 0
정답
0
0
0
0
1
1
1
1
1
정답
1
#include <stdio.h>
void quickSort(long long arr[], int L, int R) {
int left = L, right = R;
int pivot = arr[(L + R) / 2];
int temp;
do
{
while (arr[left] < pivot)
left++;
while (arr[right] > pivot)
right--;
if (left<= right)
{
temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
left++;
right--;
}
} while (left<= right);
if (L < right)
quickSort(arr, L, right);
if (left < R)
quickSort(arr, left, R);
}
int main() {
long long arr[100000] ={}, brr[100000] = {};
long long n, m, a;
scanf("%lld", &n);
for(int i = 0; i < n; i++) {
scanf("%lld", &arr[i]);
}
scanf("%lld", &m);
for(int i = 0; i < m; i++) {
scanf("%lld", &brr[i]);
}
quickSort(arr, 0, n - 1);
for(int i = 0; i < m; i++) { //이분탐색 구간입니다.
long long end = n-1, first = 0;
for(int j = 0; j < 20; j++) {
if(arr[(end + first)/ 2] > brr[i]) {
end = (end + first) / 2;
}
else first = (end + first) / 2;
}
if(arr[first] == brr[i] || arr[end] == brr[i]) {
printf("1\n"); //줄바꿈에 유의하세요
}
else printf("0\n"); //줄바꿈에 유의하세요
}
}
'백준' 카테고리의 다른 글
2022 서강대학교 청정수컵 36위 기념 문제풀이 (0) | 2022.05.21 |
---|---|
[C언어/C++] 15927번 회문은 회문아니야!! + 반례 모음 (0) | 2022.05.09 |
[C언어/C++] 14370번 전화번호 수수께끼 (Large) + 반례 모음 (2) | 2022.05.08 |
[C언어] 백준 | 17404번 RGB거리 2 (0) | 2022.04.29 |
[C언어] 백준 | 1484번 다이어트 (0) | 2022.04.25 |