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

[C++][백준 10814] 나이순 정렬

hye3193 2025. 1. 6. 13:49

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

 

제출 코드

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

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

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

    int n;
    cin >> n;
    vector<pair<string, pair<int, int>>> v;

    for (int i = 0; i < n; i++)
    {
        string name;
        int age;
        cin >> age >> name;
        v.push_back(make_pair(name, make_pair(age, i)));
    }

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

    for (auto res : v)
        cout << res.second.first << " " << res.first << '\n';
}

이중으로 pair를 사용하여 이름, 나이, 가입한 순서 순으로 저장하여 정렬시켜주었다

vector에 pair를 삽입할 때에는 make_pair 함수를 사용해서 pair을 만든 후 push 해 주면 된다

pair을 두 번 사용했던 것은 입력받은 순서를 추가로 저장하기 위해서였는데, 더 찾아보니 굳이 그렇게 구현하지 않고도 안정 정렬(정렬을 했을 때 중복된 값들의 순서가 변하지 않는 경우)을 할 수가 있었다

 

stable_sort를 사용하여 정렬시키면 기존의 순서를 유지하면서 정렬을 시켜줄 수 있다

그럼 굳이 pair을 두 번 사용하지 않고도 문제를 해결 가능하다

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

bool comp(const pair<int, string> a, const pair<int, string> b)
{
    return a.first < b.first;
}

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

    int n;
    cin >> n;
    pair<int, string> input;
    vector<pair<int, string>> v;

    for (int i = 0; i < n; i++)
    {
        cin >> input.first >> input.second;
        v.push_back(input);
    }

    stable_sort(v.begin(), v.end(), comp);

    for (auto res : v)
        cout << res.first << " " << res.second << '\n';
}

그 외에도 cin 입력 받는 방식에도 변화를 주었다