백준 문제풀이/실버5

10815번 - 숫자 카드

void_melody 2022. 6. 8. 12:47

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

 

10815번: 숫자 카드

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

www.acmicpc.net

풀이는 두 가지로 풀었다.

1) set을 활용. 중복인지 찾으려고 활용하였다.

#include <iostream>
#include <set>

using namespace std;

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

	int n, m;
	set<int> s;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		int a;
		cin >> a;
		s.insert(a);
	}
	cin >> m;
	for (int i = 0; i < m; i++)
	{
		int a;
		cin >> a;
		if (s.find(a) != s.end())
			cout << 1 << ' ';
		else
			cout << 0 << ' ';
	}
	
	return 0;
}

하지만 set의 원소 갯수만큼을 다 뒤져야하기 때문에 시간이 n^2이 걸린다.

2) binary search, 즉 이분 탐색을 활용.

이분 탐색을 활용하면 log n 이므로 시간이 단축된다.

이분탐색의 주의점은 정렬이 되어있어야 활용이 가능하다.

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

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

	int n, m;
	cin >> n;
	vector<int> v(n);
	for (int i = 0; i < n; i++)
	{
		int a;
		cin >> a;
		v[i] = a;
	}
	sort(v.begin(), v.end());
	cin >> m;
	for (int i = 0; i < m; i++)
	{
		int a;
		cin >> a;
		if (binary_search(v.begin(), v.end(), a))
		{
			cout << 1 << ' ';
		}
		else
			cout << 0 << ' ';
	}
	
	return 0;
}