[ 백준 ] 2910 / 빈도 정렬

金弘均·2021년 9월 14일
0

Baekjoon Online Judge

목록 보기
19/228
post-thumbnail

# Appreciation

/*
 * Problem :: 2910 / 빈도 정렬
 *
 * Kind :: Sorting
 *
 * Insight
 * - 주어진 수열에서 각 수의 등장 횟수, 맨 처음 등장한 인덱스를 Map 에 저장
 *   + 위의 정보를 토대로 주어진 수열을 정렬
 *     # 이게 전부인데...?
 *
 * Point
 * - 처음 문제를 풀었을 때 너무 끙끙대서 풀었나?
 *   + 4달 전에 비해 성장했군 (흐뭇)
 */

# Code

//
//  BOJ
//  ver.C++
//
//  Created by GGlifer
//
//  Open Source

#include <iostream>
#include <map>
#include <algorithm>

using namespace std;

#define endl '\n'

// Set up : Global Variables
struct Info { int cnt, ord; };

// Set up : Functions Declaration
/* None */


int main()
{
    // Set up : I/O
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    // Set up : Input
    int N, C;
    cin >> N >> C;
    int A[N];
    for (int i=0; i<N; i++)
        cin >> A[i];

    // Process
    map<int,Info> M; /* 각 수의 등장 횟수, 맨 첫번 인덱스 정보를 저장 */
    for (int i=0; i<N; i++) {
        int n = A[i];
        /* 수 n 이 처음으로 등장했다면 */
        if (M.find(n) == M.end()) {
            M[n].ord = i; /* 맨 첫번 인덱스 저장 */
        } M[n].cnt++; /* 등장 횟수 증가 */
    }

    /* 주어진 수열 정렬 */
    sort(A, A+N, [&M](int u, int v){
        Info ui = M[u], vi = M[v];
        /* 등장 횟수의 내림차순으로, 맨 첫번 인덱스의 오름차순으로 */
        return make_pair(-ui.cnt, ui.ord) < make_pair(-vi.cnt, vi.ord);
    });

    // Control : Output
    for (int e : A) {
        cout << e << ' ';
    }
}

// Helper Functions
/* None */
profile
이런 미친 게임을 봤나! - 옥냥이

0개의 댓글