https://www.acmicpc.net/problem/20920
이 문제는 다양한 방식의 정렬을 활용하면 되는 문제이다.
이 문제의 포인트는 정렬 함수였다.
- 빈도수
- 길이
- 알파벳 순
일단 map에서 알파벳 순으로 정렬해주어서 이 부분은 정렬하지 않아도 되고,
차례대로 길이 정렬, 빈도수 정렬을 시행해주면 된다.
일단 빈도수를 체크해야 하기 때문에 탐색이 O(logn)인
map을 사용해주었고, 나중에 vector로 변환해서 정렬해주었다.
코드는 다음과 같다.
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
int n,m;
string s;
map<string, int> mm;
int main(){
ios_base::sync_with_stdio(false); cin.tie(NULL);
cin >> n >> m;
for(int i=0;i<n;i++){
cin >> s;
if(mm.find(s)!=mm.end()) mm[s]++;
else mm.insert({s,1});
}
vector<pair<string, int>> v(mm.begin(), mm.end());
stable_sort(v.begin(),v.end(),[](pair<string, int> lp,pair<string, int> rp)->bool{
return lp.first.length()>rp.first.length();
});
stable_sort(v.begin(),v.end(),[](pair<string, int> lp,pair<string, int> rp)->bool{
return lp.second>rp.second;
});
for(int i=0;i<v.size();i++){
if(v[i].first.length()>=m) cout << v[i].first << '\n';
}
}