PS_Baekjoon

[백준 C++] 11652번 : 카드

SMILELY 2023. 3. 2. 23:56

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

 

11652번: 카드

준규는 숫자 카드 N장을 가지고 있다. 숫자 카드에는 정수가 하나 적혀있는데, 적혀있는 수는 -262보다 크거나 같고, 262보다 작거나 같다. 준규가 가지고 있는 카드가 주어졌을 때, 가장 많이 가지

www.acmicpc.net

풀이 :

- map을 이용해서 같은 값이 있을 경우 카운트를 해준다

- 저장된 값을 vector에 옮긴 후 답을 찾아준다

- 주의할 점 : int 범위 밖이라는 것

 

코드 :

#include <iostream>
#include <string>
#include <map>
#include <vector>
using namespace std;
typedef long long ll; // long long 쓰는게 귀찮아서 ll로 정의

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

    int n;
    ll num, ans; 
    map<ll, ll> m;
    vector<pair<ll, ll>> v; 

    cin >> n;
    while(n--){
        cin >> num;
        m[num]++; // 들어온 값을 map에 넣으면서 카운트한다
    }
    for(auto iter=m.begin(); iter!=m.end(); iter++){
        v.push_back({iter->first, iter->second}); // vector에 넣어준다
    }
    num = v[0].second;
    ans = v[0].first;
    for(int i=1; i<v.size(); i++){
        if((num < v[i].second) || (num == v[i].second && ans > v[i].first)){
            num = v[i].second; // 가장 많이 카운트 됐거나, 같은 값일 경우 더 작은 수를 찾아서 ans에 넣어준다
            ans = v[i].first;
        }
    }
    cout << ans << '\n';
}

후기 :

num을 int로 선언했다가 틀렸습니다를 여러번 맛봤다.

저렇게 구하는 식이 틀렸나 싶어서 정렬도 시켰다가 시간초과도 떴다.

다시 찬찬히 본 결과 num선언을 잘못 해준걸 알아차렸고 맞출 수 있었다.

long long 나오면 주의하기!!