https://www.acmicpc.net/problem/10815
이분탐색
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool binary_search(vector<int>& cards, int left, int right, int target)
{
// 찾는 값이 없는 경우
if (left > right)
{
return false;
}
int mid = (left + right) / 2;
int mid_val = cards[mid];
// 값을 찾으면
if (mid_val == target)
{
return true;
}
// 중간 값이 target보다 작으면 : [mid + 1, right]범위에서 재 탐색
else if (mid_val < target)
{
return binary_search(cards, mid + 1, right, target);
}
// 중간 값이 target보다 크면 : [left, mid - 1]범위에서 재 탐색
else
{
return binary_search(cards, left, mid - 1, target);
}
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
// 입력
int N, M;
cin >> N;
vector<int> cards(N);
for (int i = 0; i < N; ++i)
{
cin >> cards[i];
}
// 이분탐색을 위한 오름차순 정렬
sort(cards.begin(), cards.end());
cin >> M;
for (int i = 0; i < M; ++i)
{
int test;
cin >> test;
// 각 테스트케이스들의 값이 cards에 있는지 이분탐색으로 확인
cout << binary_search(cards, 0, N - 1, test) << ' ';
}
return 0;
}
숫자열을 주고, 각 테스트 케이스의 숫자가 주어진 배열에 포함되는지 확인하는 문제이다.
숫자 카드의 개수 N은 (1 ≤ N ≤ 500,000),
테스트 케이스의 개수 M은 (1 ≤ M ≤ 500,000) 의 범위를 가지기 때문에
단순 반복문으로 검색하면 최악의 경우 O(NM)로 시간제한에 걸린다.
따라서 이분탐색을 통해 O(M * log N)으로 풀어야 한다.
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ]11728번: 배열 합치기 (c++) (0) | 2020.07.07 |
---|---|
[BOJ]10816번: 숫자 카드 2 (c++) (0) | 2020.07.07 |
[BOJ]1790번: 수 이어 쓰기 2 (c++) (0) | 2020.07.07 |
[BOJ]1377번: 버블 소트 (c++) (0) | 2020.07.07 |
[BOJ]11652번: 카드 (c++) (0) | 2020.07.07 |
댓글