10816번 : 숫자 카드 2
숫자 카드는 정수 하나가 적혀져 있는 카드이다. 상근이는 숫자 카드 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개의 수에 대해서, 각 수가 적힌 숫자 카드를 상근이가 몇 개 가지고 있는지를 공백으로 구분해 출력한다.
생각해 볼 점
파이썬이나 자바스크립트 등이라면, dictionary 타입을 사용하면 간단하게 풀 수 있을 것입니다.
저는 C++이므로 map 라이브러리를 사용해 풀었습니다.
해당 문제의 분류는 "이분 탐색"이지만, 해시의 find 메서드가 속도가 크게 느리지는 않은 것으로 알고 있으므로, 그냥 map 구조를 사용해 풀었습니다.
만약, 이분 탐색을 구현하려면 vector 등의 자료구조에 pair 형태로 숫자와 개수를 저장하여 정렬 후 풀면 될 것 같습니다.
코드
#include <iostream>
#include <map>
using namespace std;
int main() {
int N, M;
scanf("%d", &N);
map<int, int> hash; //딕셔너리 <숫자, 갯수>
for(int i = 0; i < N; i++)
{
int input;
scanf("%d", &input);
map<int, int>::iterator it = hash.find(input);
if(it == hash.end()) hash.insert(make_pair(input, 1)); //없으면 <input, 1> 추가
else it->second++; //있으면 개수 증가
}
scanf("%d", &M);
for(int i = 0; i < M; i++)
{
int target;
scanf("%d", &target);
map<int, int>::iterator it = hash.find(target);
if(it == hash.end()) printf("0 ");
else printf("%d ", it->second);
}
return 0;
}
그 외
반복문 내부에서 출력이 일어나는 경우 cin, cout의 출력 시간에 유의하는 것이 좋습니다.
'공부 및 정리 > 백준 코드' 카테고리의 다른 글
[C++]백준 - 2630번 문제 (0) | 2021.06.23 |
---|---|
[C++]백준 - 2565번 문제 (0) | 2021.06.23 |
[C++]백준 - 11054번 문제 (0) | 2021.06.23 |
[C++]백준 - 11053번 문제 (0) | 2021.06.18 |
[C++]백준 - 2156번 문제 (0) | 2021.06.18 |