1 분 소요

1. 문제

문제의 입력은 총 4가지이다.
첫 번째 입력은 카드의 수, 최대 50만이다.
두 번째 입력은 카드에 적힌 숫자. 첫 번째 입력 갯수만큼이며 범위는 -1억에서 1억이다.
세 번째 입력은 구해야 할 카드 갯수이다.
네 번째 입력은 숫자 카드의 종류이다. 세 번째 입력 갯수만큼이며 범위는 두 번째와 같다.

2. 풀이

간단하게 숫자 범위만큼 배열을 만들고 해당 숫자를 인덱스로 갯수를 저장하면
속도가 빠르긴 하겠지만 숫자의 범위가 2억이기 때문에 사실상 어렵다.
두 번째로 생각해 본 방법은 c++ algorithm 헤더에서 제공하는 count 함수였다.
count 함수는 해당 요소가 몇 개 있는지 갯수를 반환해주는 함수이다.
입력받아서 벡터에 저장 후 count 함수를 호출해 처리해봤지만 시간 초과가 났다.
count 함수는 O(N) 시간에 작업을 수행하기 때문에 시간이 부족했던 것 같다.

마지막으로 생각한 방법은 map을 사용하는 것이었다.
map의 검색/삽입/삭제에 걸리는 시간은 O(log N) 이기 때문에
count 함수를 사용하는 것보다 훨씬 빠를 것이라 생각했다.
key와 value를 각각 카드 종류, 카드 갯수로 두고
입력을 받을 때 카드의 종류를 map에서 찾아 없다면 insert하고
이미 존재한다면 value를 증가시키는 방법으로 코드를 작성했다.

3. 코드

#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;
}

4. 결과

10816_result

카테고리:

업데이트: