2776번: 암기왕
연종이는 엄청난 기억력을 가지고 있다. 그래서 하루 동안 본 정수들을 모두 기억 할 수 있다. 하지만 이를 믿을 수 없는 동규는 그의 기억력을 시험해 보기로 한다. 동규는 연종을 따라 다니며,
www.acmicpc.net
수첩1, 수첩2에 적힌 수를 각각 입력받아 수첩2의 번호가 수첩1에 있었는지(0, 1) 출력하는 문제였습니다.
처음에 해시를 사용하여 풀었다가 시간초과가 나서 이분탐색을 사용하여 풀었습니다.
이분탐색에서도 시간초과가 났었는데, cstdio를 사용하니 해결되었습니다!
- 정렬
- left = 0, right = N-1
- mid = (left+right)/2
- mid가 가리키는 값이면 return
- mid가 가리키는 값보다 클 때 -> right = mid + 1
- mid가 가리키는 값보다 작을 때 -> left = mid - 1 => 3번으로 돌아감
이분탐색
더보기
int left = 0, right = N-1;
while(right >= left){
int mid = (left + right)/2;
if(v[mid]==n){
ans = 1;
break;
}
else if(v[mid]>n){
right = mid -1;
}
else{ //v[mid]<n
left = mid + 1;
}
전체코드
더보기
#include <algorithm>
#include <vector>
#include <cstdio>
using namespace std;
int main(){
int T;
scanf("%d", &T);
for(int i = 0; i<T; i++){
vector<int> v;
int N;
scanf("%d", &N);
for(int i = 0; i<N; i++){
int n;
scanf("%d", &n);
v.push_back(n);
}
sort(v.begin(), v.end());
scanf("%d", &N);
for(int i = 0; i<N; i++){
int n;
scanf("%d", &n);
int left = 0, right = N-1;
int ans = 0;
while(right >= left){
int mid = (left + right)/2;
if(v[mid]==n){
ans = 1;
break;
}
else if(v[mid]>n){
right = mid -1;
}
else{ //v[mid]<n
left = mid + 1;
}
}
printf("%d\n", ans);
}
}
}
'Koala - 2기 > A반' 카테고리의 다른 글
[프로그래머스] 카드 짝 맞추기 (0) | 2021.02.24 |
---|---|
[2531번] 회전 초밥 (0) | 2021.02.02 |
[1339번] 단어 수학 (0) | 2021.02.01 |
백준 2565번 - 전깃줄 (0) | 2021.01.27 |
[17404번] RGB거리 2 (0) | 2021.01.21 |