BOJ 2776 - 암기왕
알고리즘/이분 탐색문제
풀이
이분 탐색 말고 다른 풀이 방법도 있을것 같은데 아 잘 모르겠다. 나는 멍청한가봐. 사실 이 풀이도 888ms로 아슬아슬하게 AC 받았다.
맨 처음에 이 문제를 접했을때는 그냥 막연하게 `해쉬테이블 같은걸 사용하면 편하겠다!`라는 생각으로 <map>을 사용했었는데 당연하게도 시간 초과가 나와서 그냥 때려치고 두달동안 묵혀두다가 지금 다시 풀어봤는데 그냥 <vector> + std::sort 이분 탐색으로 풀면 될것같아서 풀어봤는데 그대로 AC가 나왔다. STL <set>으로 풀어도 될것같은데 이건 안해봤다.
#include <cstdio> #include <vector> #include <algorithm> using namespace std; int main() { int t; scanf("%d",&t); while(t--){ vector<int> seen; int n,m,i,x,left,right,mid,found; scanf("%d",&n); for(i=0;i<n;i++){ scanf("%d",&x); seen.push_back(x); } sort(seen.begin(),seen.end()); scanf("%d",&m); for(i=0;i<m;i++){ scanf("%d",&x); found = 0; left = 0; right = n-1; while(left <= right){ mid = (left+right)/2; if(x==seen[mid]){ found = 1; break; }else if(x < seen[mid]) right = mid-1; else left = mid + 1; } printf("%d\n",found); } } return 0; }