Programing/백준, 프로그래머스(C++)

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

hye3193 2025. 1. 7. 17:54

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

 

제출 코드

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

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

    int n, m;
    cin >> n;
    map<int, int> cards;
    for (int i = 0; i < n; i++)
    {
        int input;
        cin >> input;
        cards[input]++;
    }
    cin >> m;
    for (int i = 0; i < m; i++)
    {
        int input;
        cin >> input;
        cards[input]++;
        cout << --cards[input] << " ";
    }
}

map을 이용해서 중복되는 숫자들을 카운트해놓고,

map에 입력받은 숫자를 key로 value를 찾아 1을 더한 뒤, 출력할 때에는 1을 다시 빼 주고 출력했다(0을 출력하기 위해)

 

map에 해당 key가 있는지 확인하고, 있는 경우 다시 값을 가져오려면 2번씩 연산을 해서 더 오래걸리지 않을까 싶었는데, 한 번 그 방법으로도 코드를 작성해 보았다

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

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

    int n, m;
    cin >> n;
    map<int, int> cards;
    for (int i = 0; i < n; i++)
    {
        int input;
        cin >> input;
        cards[input]++;
    }
    cin >> m;
    for (int i = 0; i < m; i++)
    {
        int input;
        cin >> input;
        if (cards.count(input))
            cout << cards[input] << " ";
        else
            cout << "0 ";
    }
}

map.count(key)를 넣어주면 key의 개수를 반환하는데, key는 고유값이기 때문에 존재하면 1, 존재하지 않으면 0을 반환한다

이 방법이 메모리도 덜 잡아먹고 더 빠른 것을 확인할 수 있었다

혹은

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

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

    int n, m;
    cin >> n;
    map<int, int> cards;
    for (int i = 0; i < n; i++)
    {
        int input;
        cin >> input;
        cards[input]++;
    }
    cin >> m;
    for (int i = 0; i < m; i++)
    {
        int input;
        cin >> input;
        if (cards.find(input) != cards.end())
            cout << cards[input] << " ";
        else
            cout << "0 ";
    }
}

map.find(key) 함수는 해당 key의 접근자를 반환하고, 존재하지 않을 경우 map.end()를 반환하기 때문에 이를 이용해서 체크해볼 수도 있다