https://www.acmicpc.net/problem/1920
1. 분류
이분탐색
2. 풀이
먼저 N개의 숫자를 입력받은 뒤 이어서 입력받는 M개의 숫자가 먼저 받은 N개 숫자들 중 있는지를 찾는 문제.
N, M 둘다 최대 10만 개까지 입력이 가능하기 때문에 O(N^2) 이상은 무조건 시간 초과가 난다.
입력받은 숫자를 오름차순으로 정리한 뒤 이분탐색으로 찾는다면?
N개 입력 : O(N)
정렬 : sort 함수 이용 - O(NlogN)
탐색 : O(MlogN)
이 정도면 제한시간 내에 무리없이 찾아낼 수 있을 것이다.
3. 소스코드
#include <cstdio>
#include <algorithm>
int a[100000];
int main()
{
freopen("input.txt", "r", stdin);
int n, m;
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &a[i]);
std::sort(a, a + n);
for (scanf("%d", &m); m > 0; m--)
{
int b;
scanf("%d", &b);
int low = 0, high = n - 1, mid = 0, ans = 0;
while (low <= high)
{
mid = (low + high) / 2;
if (b > a[mid])
low = mid + 1;
else if (b < a[mid])
high = mid - 1;
else
{
ans = 1;
break;
}
}
printf("%d\n", ans);
}
return 0;
}
'알고리즘' 카테고리의 다른 글
| BOJ [11501] 이항 계수 2 (0) | 2017.08.15 |
|---|---|
| BOJ [2225] 합분해 (0) | 2017.08.15 |
| BOJ [1629] 곱셈 (0) | 2017.08.13 |
| BOJ [1780] 종이의 개수 (0) | 2017.08.13 |
| BOJ [1654] 랜선 자르기 (0) | 2017.08.13 |