본문 바로가기

[Baekjoon] C++/Silver

[baekjoon] 10815 : 숫자 카드 (C++)

문제


숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 N개를 가지고 있다. 정수 M개가 주어졌을 때, 이 수가 적혀있는 숫자 카드를 상근이가 가지고 있는지 아닌지를 구하는 프로그램을 작성하시오.

 

입력


첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드가 적혀있는 정수가 주어진다. 숫자 카드에 적혀 있는 수는 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다. 두 숫자 카드에 같은 수가 적혀있는 경우는 없다.

셋째 줄에는 M(1 ≤ M ≤ 500,000)이 주어진다. 넷째 줄에는 상근이가 가지고 있는 숫자 카드인지 아닌지를 구해야 할 M개의 정수가 주어지며, 이 수는 공백으로 구분되어져 있다. 이 수도 -10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다.

 

출력


첫째 줄에 입력으로 주어진 M개의 수에 대해서, 각 수가 적힌 숫자 카드를 상근이가 가지고 있으면 1을, 아니면 0을 공백으로 구분해 출력한다.

 

예제 입출력


https://www.acmicpc.net/problem/10815

 

10815번: 숫자 카드

첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,

www.acmicpc.net

 

문제 풀이


먼저 숫자 카드의 개수를 입력받고 받은 만큼 for문을 사용해 vector에 넣어주었다.

다음 상근이가 가지고 있는 숫자 카드를 입력받은 벡터를 sort 함수를 사용하여 정렬해 주었고 binary_search 함수를 사용하여 있다면 1을, 없다면 0을 또다른 벡터에 넣어주었고 이것을 출력해 주었다.

이렇게 하면 코드는 돌아가는데 백준에 제출하면 시간 초과가 뜬다. cin은 printf 에 비해 시간이 오래 걸리기 때문이었다. 그래서 이것을 해결하려면 코드 몇줄만 더 추가해 주면 되는 문제였다.

ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);

이 세줄만 적어주면 cin이 printf와 비슷한 시간을 가지게 되어 시간초과가 뜨지 않는다.

 

오류 코드


원래는 binary_search 함수를 사용하지 않고 find 함수를 사용하여 비교해주고 찾는 방법을 선택했었지만 어떤 방법을 사용해도 시간초과를 피할 순 없었다..

아래와 같이 find 함수를 사용해도 코드가 돌아가긴 한다.

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int N, M;
	vector<int> n, m;
	vector<int> answer;
	cin >> N;
	for (int i = 0; i < N; i++) {
		int a;
		cin >> a;
		n.push_back(a);
	}

	cin >> M;
	for (int i = 0; i < M; i++) {
		int b;
		cin >> b;
		m.push_back(b);

		if (find(n.begin(), n.end(), m[i]) != n.end())
			answer.push_back(1);
		else
			answer.push_back(0);

		cout << answer[i] << ' ';
	}
}

 

최종 코드


#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	int N, M;
	vector<int> n, m;
	vector<int> answer;
	cin >> N;
	for (int i = 0; i < N; i++) {
		int a;
		cin >> a;
		n.push_back(a);
	}
	sort(n.begin(), n.end()); 

	cin >> M;
	for (int i = 0; i < M; i++) {
		int b;
		cin >> b;
		m.push_back(b);

		if (binary_search(n.begin(), n.end(), b))
			answer.push_back(1);
		else
			answer.push_back(0);
		cout << answer[i] << ' ';
	}
}