1. 문제 정리
- N개의 수와 M개의 수가 주어진다.
- M개의 수 각각이 N개의 수 배열에 포함되는지를 검증한다.
2. 접근
- 전형적인 이진탐색 문제라고 생각했다.
- N개의 수가 들어있는 배열은 정렬을 하고, M개의 수는 그대로 사용하고자 하였다.
- M개의 수를 N개의 배열에 이진탐색을 시도하는 것으로 시간 복잡도는 O(M*logN)이며, 이는 최대값으로 보았을 때, 500000*log(500000) = 약 1100만 이므로 2초 시간제한 안에 들어온다.
3. 풀이
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int n, m;
vector<int> a;
vector<int> comp;
bool bis(int target){
int hi, lo;
hi = n-1;
lo = 0;
while(lo <= hi){
int mid = (lo+hi) / 2;
if(target == a[mid]) return true;
if(target < a[mid]) hi = mid-1;
else lo = mid+1;
}
return false;
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(nullptr);
cin >> n;
for(int i = 0; i < n; i++){
int input;
cin >> input;
a.push_back(input);
}
sort(a.begin(), a.end());
cin >> m;
for(int i = 0; i < m; i++){
int input;
cin >> input;
comp.push_back(input);
}
for(int i = 0; i < m; i++){
if(bis(comp[i]))cout << 1 << ' ';
else cout << 0 << ' ';
}
}
- vector<int> a, vector<int> comp : a는 N개의 정수, comp는 M개의 정수를 저장할 벡터이다.
- bool bis(int target) : target값이 a 벡터에 존재하는 지 이진탐색으로 결과를 반환하는 함수이다.
- int main() : 마지막 for loop에서 bis를 각 comp 벡터의 원소 값을 target parameter로 전달하여 실행하고 그 결과에 따라 반환값이 true일 경우 1, false일 경우 0을 출력한다.
4. 소감
그다지 어렵지는 않은 문제였지만, 이진탐색 문제를 풀어보기 시작한 나에게는 적당한 문제였던 것 같다. 긴장감도 낮춰주고 조금씩 적응해나갈 수 있게 해준 문제라 좋았다. 시간 복잡도 계산도 최근 들어 더 열심히 하려고 노력 중이라, 문제를 보고 겁먹기 보다는 생각난 아이디어를 논리적으로 분석해서 가능성이 있을지를 판단하는 것을 더 노력해야겠다고 생각했다.
'study > coding test' 카테고리의 다른 글
백준 10816 - 숫자 카드 2 (0) | 2021.12.09 |
---|---|
백준 2110 - 공유기 설치 (0) | 2021.12.09 |
백준 2805 - 나무 자르기 (0) | 2021.12.08 |
백준 1654 - 랜선 자르기 (0) | 2021.12.08 |
백준 14395 : 4연산 (0) | 2021.12.07 |
댓글