1. 풀이방법
- 일단 문제 input사이즈를 보면 크다 500,000
- 만약 두번의 for문을 돌려서 탐색을 할경우 최악의경우 250,000,000,000 인데,
- c++기준 대략 1초에 1억번의 연산을 한다고 가정하여도, 시간제한 2초를 훨씬 넘기 때문에
- 선형탐색을 사용해서는 안된다 ----->이진탐색(binary search)를 사용하자.
- 오름차순으로 sorting을 한 후 시작한다.
2.주의사항
- 전형적인 이진탐색문제로서 이론을 그대로 코드로 옮겨주면 되겠다.
- 조건을 살짝씩 빼먹을 경우 무한루프에 자주 빠지니 조건을 꼼꼼하게 체크 해주자....>!
3. 나의코드
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int N, M;
int Narr[500001];
int Marr[500001];
void inputs() {
cin >> N;
for (int i = 0; i < N; i++) {
cin >> Narr[i];
}
cin >> M;
for (int i = 0; i < M; i++) {
cin >> Marr[i];
}
}
void bs(int start,int end,int searchnum) {
int mid = (start + end) / 2;
if (Narr[mid] == searchnum) { cout << 1 << " "; return; }
if (mid >= end) { cout << 0 << " "; return; }
if (Narr[mid] > searchnum) { bs(start, mid-1, searchnum); }
if (Narr[mid] < searchnum) { bs(mid+1, end, searchnum); }
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
inputs();
sort(Narr, Narr+N);
for (int i = 0; i < M; i++) {
bs(0, N - 1, Marr[i]);
}
return 0;
}
'알고리즘 문제풀이 > 탐색' 카테고리의 다른 글
백준 1254 [C++] (0) | 2021.01.15 |
---|---|
백준 6064 [C++] (0) | 2020.11.30 |
최대공약수 구하기 (재귀,유클리드호제법) (0) | 2020.10.08 |
백준 1100 (0) | 2020.03.02 |
백준 1316 (0) | 2020.02.28 |