빈도정렬 문제를 풀다가... unordered_map에 대해서 우유부단하게 알고 있다가 멘탈이 털렸다 진짜 탈탈탈...
unorded_map과 map의 차이점은
❶ map은 자동으로 sorted가 되고 unordered_map은 그렇지 않으며
❷ unorded_map은 해시함수를 사용한다
정도로 알고 있었다. 참고로 둘 다 중복을 허용하지 않는다.
여기서 아주 크게 오해한 부분이 unorded_map이 sorted되지 않으니 입력순으로 저장될 것이라고 생각한 부분이다. 근데 순서대로 출력하면 걍 랜덤하게 출력이 된다. 따라서 unordered_map은 입력순으로 저장되지 않는다.
멘탈이 탈탈탈...
이후 이 문제를 푼 다른 분들의 코드를 참조해 보니, map에 대해서 추가로 알 부분이 있었다. 이해라기보단 그냥 그렇구나하고 머리에 넣기로 했다🫠...
#include <bits/stdc++.h>
using namespace std;
int n, c, num;
map<int, int> m, order;
bool cmp(pair<int, int> &a, pair<int, int> &b)
{
if (a.second == b.second)
return (order[a.first] < order[b.first]);
return (a.second > b.second);
}
int main(void)
{
cin.tie(0);
ios::sync_with_stdio(0);
cin >> n >> c;
for (int i = 0; i < n; i++)
{
cin >> num;
m[num]++; // 0으로 따로 초기화안해도 바로 들어감
if (order[num] == 0)
order[num] = i + 1; // 순서 넣는 부분
}
vector<pair<int, int>> vec(m.begin(), m.end()); // 자동으로 들어감
sort(vec.begin(), vec.end(), cmp);
for (auto a : vec)
for (int i = 0; i < a.second; i++)
cout << a.first << ' ';
return (0);
}