Programing/백준, 프로그래머스(C++)

[C++][백준 20920] 영단어 암기는 괴로워

hye3193 2025. 1. 1. 20:53

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

제출코드

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

bool comp(pair<string, int> &a, pair<string, int> &b)
{
    if (a.second == b.second)
    {
        if (a.first.length() == b.first.length())
            return a.first < b.first;
        
        return a.first.length() > b.first.length();
    }
    return a.second > b.second;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    map<string, int> words;
    int n, m;
    string str;

    cin >> n >> m;
    for (int i = 0; i < n; i++)
    {
        cin >> str;
        if (str.length() >= m)
            words[str]++;
    }

    vector<pair<string, int>> v(words.begin(), words.end());
    sort(v.begin(), v.end(), comp);

    for (auto w : v)
    {
        cout << w.first << '\n';
    }
}

처음에는 sort 함수에 대해 잘 몰라서 sort를 반복해서 사용해줘야 한다고 생각해 삽질을 좀 했는데, 그냥 애초에  조건에 다 맞게 정렬시키도록 함수를 구현하면 되는 거였다

 

map에서 key값이 아니라(map에서는 기본적으로 key값을 기준으로 정렬시켜주기 때문에) value를 기준으로 정렬시키고 싶었는데, 그러기 위해서는 map 자체에서는 정렬시킬 수가 없고 새롭게 vector를 하나 만들어줘서 pair 형태로 넣고 vector를 정렬시키는 방식으로 구현해야 한다

 

추가적으로, comp 함수의 코드에서 참조형태가 아니라 그냥 인자를 전달하게 되면 해당 부분을 복사해서 사용하는 것이기 때문에(메모리 낭비가 발생) 참조 형태로 전달하고 있다