문제의 입력은 총 4가지이다.
첫 번째 입력은 카드의 수, 최대 50만이다.
두 번째 입력은 카드에 적힌 숫자. 첫 번째 입력 갯수만큼이며 범위는 -1억에서 1억이다.
세 번째 입력은 구해야 할 카드 갯수이다.
네 번째 입력은 숫자 카드의 종류이다. 세 번째 입력 갯수만큼이며 범위는 두 번째와 같다.
간단하게 숫자 범위만큼 배열을 만들고 해당 숫자를 인덱스로 갯수를 저장하면
속도가 빠르긴 하겠지만 숫자의 범위가 2억이기 때문에 사실상 어렵다.
두 번째로 생각해 본 방법은 c++ algorithm 헤더에서 제공하는 count 함수였다.
count 함수는 해당 요소가 몇 개 있는지 갯수를 반환해주는 함수이다.
입력받아서 벡터에 저장 후 count 함수를 호출해 처리해봤지만 시간 초과가 났다.
count 함수는 O(N) 시간에 작업을 수행하기 때문에 시간이 부족했던 것 같다.
마지막으로 생각한 방법은 map을 사용하는 것이었다.
map의 검색/삽입/삭제에 걸리는 시간은 O(log N) 이기 때문에
count 함수를 사용하는 것보다 훨씬 빠를 것이라 생각했다.
key와 value를 각각 카드 종류, 카드 갯수로 두고
입력을 받을 때 카드의 종류를 map에서 찾아 없다면 insert하고
이미 존재한다면 value를 증가시키는 방법으로 코드를 작성했다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
map<int, int> cards;
int card;
for (int i = 0; i < n; i++) {
cin >> card;
if (cards.count(card)) {
cards[card]++;
}
else {
cards[card] = 1;
}
}
cin >> n;
int key;
for (int i = 0; i < n; i++) {
cin >> key;
cout << cards[key] << " ";
}
return 0;
}