백준/실버

[백준 2910번] 빈도 정렬 (C++)

게임개발기원 2023. 4. 2. 17:26

문제링크 : https://www.acmicpc.net/problem/2910

 

2910번: 빈도 정렬

첫째 줄에 메시지의 길이 N과 C가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ C ≤ 1,000,000,000) 둘째 줄에 메시지 수열이 주어진다.

www.acmicpc.net

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define MAX 987654321
#define pii pair <int, int>

int N, C;

map<int, int> m;
map<int, int> idx;

bool comp(const pii& a, const pii& b)
{
    if(a.second == b.second) return idx[a.first] < idx[b.first]; //크기가 같은 경우, 인덱스로 구분
    return a.second > b.second;
}

int main(void)
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    cin >> N >> C;
    for(int i=1; i<=N; i++)
    {
        int num;
        cin >> num;
        m[num]++;
        
        if(!idx[num])
        { 
            idx[num] = i;
        }
    }

    vector <pii> v(m.begin(), m.end()); //key, value(값, 갯수)
    sort(v.begin(), v.end(), comp);

    for(int i=0; i<v.size(); i++)
    {
        for(int j=0; j<v[i].second; j++)
        {
            cout <<v[i].first << " ";
        }
    }
    
}

맵을 활용하여 푼 문제다.

먼저 숫자를 입력받고 해당 숫자를 key로 입력받을 때마다 해당 key의 value 값을 증가시켜준다.

그리고 index도 따른 맵에 같이 저장해준다.

이때 해당 key값이 없을 때만 index 값 i를 저장해주도록 하여 중복을 방지한다.

 

이후 정렬을 해주는데 따로 정렬 조건을 만들어준다.

각 key에 대한 사이즈 즉 value 값을 기준으로 클 수록 앞에 온다.

하지만 value 값이 같을 때도 있는데 이때는 따로 저장해줬던 index를 기준으로 index값이 작으면 앞에 오도록 한다.