티스토리 뷰
알고리즘
- 자료 구조
- 정렬
- 이분 탐색
풀이
1. 가지고 있는 숫자 카드를 card 배열에 오름차순으로 정렬한다.
2. 가지고 있는지 구분하기 위해서
lt=0, rt=n-1로 카드의 존재 여부를 표시하는 변수 exist=0으로 초기화한다.
3. mid=(lt+rt)/2하여
card[mid] 값이 확인하고자 하는 숫자와 일치하면
exist 변수를 1로 하고 반복문을 탈출한다.
card[mid] 값이 확인하고자 하는 숫자보다 작으면
lt=mid+1로 하여 탐색한다.
card[mid] 값이 확인하고자 하는 숫자보다 크면
rt=mid-1로 하여 탐색한다.
이 과정은 lt<=rt인 동안 반복한다.
반복문 탈출 시 exist가 0이면 카드가 없는 것이고 exist가 1이면 카드가 있는 것이 된다.
함수 이용 시 시간초과
- 함수의 매개변수로 vector 배열을 사용하여 복사하는 과정에서 시간초과 발생한 것 같다.
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
void search(int num, vector<int> card){
int lt=0, rt=card.size()-1, exist=0, mid;
while(lt<=rt){
mid = (lt+rt)/2;
if(card[mid]==num){
exist=1;
break;
} else if(card[mid]>num){
rt=mid-1;
} else{
lt=mid+1;
}
}
cout << exist << " ";
}
int main() {
// freopen("input.txt", "rt", stdin);
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n, m, c, num;
vector<int> card;
cin >> n;
for(int i=0; i<n; i++){
cin >> num;
card.push_back(num);
}
sort(card.begin(), card.end());
cin >> m;
for(int i=0; i<m; i++){
cin >> num;
search(num, card);
}
return 0;
}
성공 코드
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
// freopen("input.txt", "rt", stdin);
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n, m, c, num, lt, rt, mid, exist;
vector<int> card;
cin >> n;
for(int i=0; i<n; i++){
cin >> num;
card.push_back(num);
}
sort(card.begin(), card.end());
cin >> m;
for(int i=0; i<m; i++){
exist=0, lt=0, rt=n-1;
cin >> num;
while(lt<=rt){
mid = (lt+rt)/2;
if(card[mid]==num){
exist=1;
break;
} else if(card[mid]>num){
rt=mid-1;
} else{
lt=mid+1;
}
}
cout << exist << " ";
}
return 0;
}
'알고리즘' 카테고리의 다른 글
[백준 1931번/c++] 회의실 배정 (0) | 2022.07.24 |
---|---|
[백준 10816번/c++] 숫자 카드 2 (0) | 2022.07.09 |
[백준 1654번/c++] 랜선 자르기 (0) | 2022.07.09 |
[백준 10989번/c++] 수 정렬하기 3 (0) | 2022.07.03 |
[백준 1181번/c++] 단어 정렬 (0) | 2022.07.03 |