공부/C++

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

KindLoad 2020. 8. 19. 13:53

문제

 

온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을 작성하시오.

 

첫째 줄에 온라인 저지 회원의 수 N이 주어진다. (1 ≤ N ≤ 100,000)

둘째 줄부터 N개의 줄에는 각 회원의 나이와 이름이 공백으로 구분되어 주어진다. 나이는 1보다 크거나 같으며, 200보다 작거나 같은 정수이고, 이름은 알파벳 대소문자로 이루어져 있고, 길이가 100보다 작거나 같은 문자열이다. 입력은 가입한 순서로 주어진다.

 

첫째 줄부터 총 N개의 줄에 걸쳐 온라인 저지 회원을 나이 순, 나이가 같으면 가입한 순으로 한 줄에 한 명씩 나이와 이름을 공백으로 구분해 출력한다.

 

입력

 

3
21 Junkyu
21 Dohyun
20 Sunyoung

 

출력

 

20 Sunyoung
21 Junkyu
21 Dohyun

 

풀이

 

드디어 정렬의 마지막 문제이다. 원래 하루에 3문제만 풀기로 했는데 이번에는 공부한셈치고 진행해버렸다. 일단 이번 정렬에서 가장 중요한 건 나이 순으로 정렬을 하는 대신에 나머지 문자열은 유지를 시켜주는 것이 관건이다.

 

그리고 실제로 이런 정렬을 안정정렬(stable sort)라고 한다. 그리고 찾아보니 C++에는 안정정렬을 할 수 있는 메서드가 있었다. 그래서 이걸 그대로 이용해보았다.

 

코드

 

 

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

class Person{
public:
    int age;
    string name;
    Person(int age, string name){
        this->age = age;
        this->name = name;
    }
};

bool compare(Person a, Person b){
    if(a.age < b.age){
        return a.age < b.age; 
    } else {
        return false;
    }
}

int main(void){
   vector<Person> person;

   int n;
   scanf("%d", &n);

   for(int i = 0 ; i < n ; i++){
       int age;
       string name;
       cin >> age >> name;

       person.push_back(Person(age, name));
   }

   stable_sort(person.begin(),person.end(),compare);

   for(auto const& com : person){
       cout << com.age << ' ' << com.name << '\n';
   }
}

 

이번에는 클래스를 이용해서 정렬을 해보기로 했다. 실제로 클래스에 나이와 이름 2가지 자료를 주고 이 이름을 토대로 정렬을 진행할 수 있도록 compare함수를 통해서 sort할 수 있도록 했다.

 

그래서 여기서 기억하고 갈점은 stable_sort()메소드 부분과 알고는 있었지만 이걸 못찾아서 시간초과가 나버린 '\n'부분이다 실제로 cout, cin 이 printf와 scanf보다 느리니 쓰지말라는 글을 본적이 있긴 하지만 string이라서 cout을 써버렸더니 버릇 처럼 사용해버린 것 같다