https://www.acmicpc.net/problem/10814
방법 1: 입력된 순서 변수 하나 더 만들기
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct member {
int order, age;
string name;
};
// age순, 입력된 순서대로 정렬
bool compare(const member &A, const member &B)
{
if (A.age != B.age)
{
return A.age < B.age;
}
return A.order < B.order;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
// 입력
int N;
cin >> N;
vector<member> v(N);
for (int i = 0; i < N; ++i)
{
v[i].order = i;
cin >> v[i].age >> v[i].name;
}
// compare 조건대로 정렬
sort(v.begin(), v.end(), compare);
// 출력
for (int i = 0; i < N; ++i)
{
cout << v[i].age << ' ' << v[i].name << '\n';
}
return 0;
}
방법 2: stable_sort로 입력받은 순서 유지하기
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct member {
int age;
string name;
};
// age순 정렬
bool compare(const member& A, const member& B)
{
return A.age < B.age;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
// 입력
int N;
cin >> N;
vector<member> v(N);
for (int i = 0; i < N; ++i)
{
cin >> v[i].age >> v[i].name;
}
// compare 조건대로 정렬 (조건이 같으면 입력된 순서 유지)
stable_sort(v.begin(), v.end(), compare);
// 출력
for (int i = 0; i < N; ++i)
{
cout << v[i].age << ' ' << v[i].name << '\n';
}
return 0;
}
안정성을 유지하는 정렬 알고리즘에는 병합정렬, 버블정렬 등이 있다.
그중에 O(n * log n)을 보장하는 알고리즘은 병합정렬이다.
C++은 stable_sort()라는 함수를 쓰면 안정성을 유지하며 정렬할 수 있다.
정렬 알고리즘의 시간복잡도와 안정성을 참고한 블로그
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ]10989번: 수 정렬하기 3 (c++) (0) | 2020.07.06 |
---|---|
[BOJ]10825번: 국영수 (c++) (0) | 2020.07.06 |
[BOJ]11650번: 좌표 정렬하기 (c++) (0) | 2020.07.06 |
[BOJ]11651번: 좌표 정렬하기 2 (c++) (0) | 2020.07.06 |
[BOJ]2873번: 롤러코스터 (c++) (0) | 2020.06.27 |
댓글