10815번: 숫자 카드
첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,
www.acmicpc.net
간단한 이분탐색 문제였다. 입력받은 숫자들을 오름차순으로 정렬하고, 그 다음으로 입력받는 정수들을 이분 탐색을 통해 검색해 존재할 경우 1, 존재하지 않을 경우 0을 출력해주면 원하는 결과를 얻을 수 있다.
ps. 입력과 출력의 횟수가 크기때문에 ios_base::sync_with_stdio(0); 과 cin.tie(NULL); 을 추가해주는 것이 좋다.
(대부분의 시간초과는 입출력 부분에서 잡아먹는 시간때문에 발생한다.)
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(void)
{
ios_base::sync_with_stdio(0);
cin.tie(NULL);
vector<int> card;
int N;
cin >> N;
for (int i = 0; i < N; i++)
{
int num;
cin >> num;
card.push_back(num);
}
sort(card.begin(), card.end());
int M;
cin >> M;
for (int i = 0; i < M; i++)
{
int num;
cin >> num;
bool state = false;
int start = 0, end = card.size()-1;
while (start <= end)
{
int mid = (start + end) / 2;
if (num < card[mid])
end = mid-1;
else if (num > card[mid])
start = mid+1;
else
{
cout << "1 ";
state = true;
break;
}
}
if (!state) cout << "0 ";
}
return 0;
}
또한 c++의 set 컨테이너에 정수를 담고 set의 멤버함수인 find() 를 사용하면 매우 간단하게 구현할 수 있다.
#include <iostream>
#include <set>
using namespace std;
int main(void)
{
ios_base::sync_with_stdio(0);
cin.tie(NULL);
set<int> card;
int N;
cin >> N;
for (int i = 0; i < N; i++)
{
int num;
cin >> num;
card.insert(num);
}
int M;
cin >> M;
for (int i = 0; i < M; i++)
{
int num;
cin >> num;
if (card.find(num) != card.end()) cout << "1 ";
else cout << "0 ";
}
return 0;
}
알고리즘 200일 프로젝트 - 44day
'알고리즘 > BOJ' 카테고리의 다른 글
백준 2869번: 달팽이는 올라가고 싶다 (0) | 2020.05.19 |
---|---|
백준 10816번: 숫자 카드 2 (0) | 2020.05.19 |
백준 1620번: 나는야 포켓몬 마스터 이다솜 (0) | 2020.05.18 |
백준 6236번: 용돈 관리 (0) | 2020.05.13 |
백준 1780번: 종이의 개수 (0) | 2020.05.12 |