[백준 10816번 C/C++] 숫자 카드 2

 

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

 

10816번: 숫자 카드 2

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

www.acmicpc.net

 


 

해결전략

 

map과 set은 중복값을 허용하지 않는다.

따라서 이 문제에서는 unordered_map을 사용하였다. unordered_map에 사용되는 헤더는 #include <unordered_map>이다. 

 

 

주어진 카드 숫자를 인덱스 번호로 사용하는 unorder_map을 만든다.

 

unordered_map<int, int> unMap;

 

unMap[input]에서 input이 처음에 주어지는 카드 번호들이다. 위의 예제 입력의 경우 3, 10, -10은 중복으로 주어진다.

 

unMap[6]=1

unMap[3]=2

unMap[2]=1

unMap[10]=3

unMap[-10]=2

unMap[7]=1

 

unMap에 값을 넣으면 다음과 같을 것이다.


 

 

코드

 

unordered_map

#include <iostream>
#include <unordered_map>
using namespace std;

int n, m, input, card;
unordered_map<int, int> unMap;

int main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	cin >> n;
	for(int i=0; i<n; i++){
		cin >> input;
		unMap[input]++;
	}

	cin >> m;
	for (int i = 0; i < m; i++) {
		cin >> card;

		cout << unMap[card]<< " ";
	}

	return 0;
}

 

 

map

#include <iostream>
#include <map>
using namespace std;

map<int, int> myMap;

int main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n, m, input, card;
	
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> input;
		myMap[input]++;
	}

	cin >> m;
	for (int i = 0; i < m; i++) {
		cin >> card;
		cout << myMap[card] << " ";
	}

	return 0;
}

 

 

unordered_map이나 map 둘 다 사용가능하지만, 위의 경우 unordered_map이 더 빠르다.

 


 

 

 

map이나 unordered_map 이라는 자료형이 생각나지 않는 경우 

 

문제를 풀다보면 적절한 STL이 생각나지 않을 때도 있다.

이 문제의 경우 주어진 값의 범위가 "-10,000,000보다 크거나 같고, 10,000,000보다 작거나 같다."라는 사실을 활용해서 배열을 만들 수 있다.

 

카드가 음수 일 수도 있기 때문에

Count[ input + 10000000 ] 로 만든다.

#include<iostream>
using namespace std;

int n, m, input, card;
int Count[20000001];

int main(void) {
	cin.tie(NULL);
	ios::sync_with_stdio(false);
	cout.tie(NULL);
		
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> input;
		Count[input + 10000000]++;
	}
	cin >> m;
	for (int i = 0; i < m; i++)
	{
		cin >> card;
		cout << Count[card + 10000000] << " ";
	}
}