문제
온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을 작성하시오.
첫째 줄에 온라인 저지 회원의 수 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을 써버렸더니 버릇 처럼 사용해버린 것 같다
'공부 > C++' 카테고리의 다른 글
[C/C++] 랜선 자르기 (백준 1654) (0) | 2020.08.21 |
---|---|
[C/C++] 수 찾기 (백준 1920) (0) | 2020.08.21 |
[C/C++] 단어 정렬 (백준 1181) (0) | 2020.08.19 |
[C/C++] 좌표 정렬하기 2 (11651) (0) | 2020.08.19 |
[C/C++] 좌표 정렬하기 (백준 11650) (0) | 2020.08.19 |