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

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

int n, c, temp;
map<int, int> m, m2;
vector<pair<int, int>> v;

bool com(pair<int, int> a, pair<int, int> b)
{
    if (a.first == b.first)
        return m2[a.second] < m2[b.second];
    return a.first > b.first;
}

int main()
{
    cin >> n >> c;

    for (int i = 0; i < n; i++)
    {
        cin >> temp;
        m[temp]++;
        if (m2[temp] == 0)
            m2[temp] = i + 1;
    }
    for (pair<int, int> iter : m)
        v.push_back({ iter.second,iter.first });

    sort(v.begin(), v.end(), com);

    for (pair<int, int> iter : v)
        for (int i = 0; i < iter.first; i++)
            cout << iter.second << " ";
}
  • 정렬을 하는 문제였지만 map과 sort에 대해 아직 이해도가 부족해 문제를 풀지 못했다
  • 일단 map은 sort로 정렬을 하기 위해 map안에있는 값을 vector에 저장해준 뒤 vector로 sort를 해주면 정렬이 된다
  • 또한 sort에서 compare함수를 만들어 오름차순이나 내림차순으로 바꿀 수 있어 이를 이용해 풀면 되는 문제였다
  • 문제를 풀때 temp에 값을 입력해 map에 저장하는데 temp를 키 값으로 같은 키값이 들어왔다면 몇번 들어왔는지 새주기 위해 +1을 누적할 것이다
  • 하지만 문제에서 입력된 횟수가 많은 숫자를 먼저 출력하고 횟수가 같을 경우 먼저 입력받은 순으로 출력을 해야하기 때문에 map 변수를 하나 더 만들어 두번째 map 변수에서도 tmep를 key 값으로 value가 0일때 i+1을 해서 몇번째 입력했을 때 key 값이 들어왔는지 저장해준다
  • 처음 map 변수를 정렬하기 위해 vector로 옮겨줄 것인데 우리는 map의 value를 첫번째로 저장하고 두번째로는 key를 저장할 것이다(value값이 큰 순서대로 정렬을 하기 위해)
  • 이제 sort로 정렬을 하기 전 내림차순으로 정렬을 하기 위해 compare라는 함수를 만들어 함수에 넘겨줄 값은 pair로 vectir안에 저장된 값들을 비교하게 만들것이다
  • 이 함수에선 첫번째 인자의 first와 두번째 인자의 first가 같다면, 즉 두 변수의 입력 횟수가 같다면 들어온 순서를 판단하여 먼저 들어온 것이 더 앞으로 갈 수 있게 하고 두 값이 같지 않다면 first값이 더 큰 값이 true로 리턴하여 가장 많이 입력된 값부터 입력된 횟수가 같다면 먼저 들어온 값으로 정렬을 해주면 되는 문제이다

'코딩 태스트 > 문제풀이' 카테고리의 다른 글

쿼드트리(x)  (0) 2025.01.10
비밀번호 발음하기(X)  (0) 2025.01.10
사과 담기 게임(x)  (0) 2025.01.10
영역 구하기  (0) 2025.01.10
안전 영역(x)  (0) 2025.01.10