[ 문제 ]
[ 접근방법 ]
각 수의 등장 횟수를 num에 저장하고,
각 수가 처음 등장한 순서를 fidx에 저장한다.
map 자료구조에 저장하여 삽입 및 조회를 O(log n) 만에 할 수 있다.
map 내부에서의 정렬은 필요가 없기 때문에 unordered_map을 사용하면 O(1) 도 가능하다.
map에 저장한 정보를 토대로 빈도 정렬을 하도록 cmp 함수를 정의하면 끝이다.
[ 소스코드 ]
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
int n, c;
map<int, int> num, fidx;
vector<int> vec;
bool cmp(int x, int y)
{
if (num[x] != num[y])
return num[x] > num[y];
return fidx[x] < fidx[y];
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> c;
for (int i = 0; i < n; i++)
{
int cnt;
cin >> cnt;
num[cnt]++;
if (!fidx.count(cnt))
{
fidx[cnt] = i;
}
vec.push_back(cnt);
}
sort(vec.begin(), vec.end(), cmp);
for (auto i : vec)
cout << i << " ";
return 0;
}
'PS' 카테고리의 다른 글
[ 백준 / C++ ] 2665 : 미로만들기 (0) | 2025.03.18 |
---|---|
[ 백준 / C++ ] 20055 : 컨베이어 벨트 위의 로봇 (0) | 2025.03.17 |
[ 백준 / C++ ] 2660 : 회장뽑기 (0) | 2025.02.06 |
[ 백준 / C++ ] 1446 : 지름길 (0) | 2025.02.05 |
[ 백준 / C++ ] 19941 : 햄버거 분배 (0) | 2025.02.04 |