https://www.acmicpc.net/problem/10825
방법 1: if/else를 활용한 사용자 정의 비교함수
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct student {
string name;
int kor, eng, math;
};
// kor내림차순, eng 오름차순, math 내림차순, name 사전순 정렬
bool compare(const student &A, const student &B)
{
if (A.kor != B.kor)
{
return A.kor > B.kor;
}
if (A.eng != B.eng)
{
return A.eng < B.eng;
}
if (A.math != B.math)
{
return A.math > B.math;
}
return A.name < B.name;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
// 입력
int N;
cin >> N;
vector<student> v(N);
for (int i = 0; i < N; ++i)
{
cin >> v[i].name >> v[i].kor >> v[i].eng >> v[i].math;
}
// 정렬
sort(v.begin(), v.end(), compare);
// 출력
for (int i = 0; i < N; ++i)
{
cout << v[i].name << '\n';
}
return 0;
}
방법 2: tuple 비교를 활용한 사용자 정의 비교함수
#include <iostream>
#include <vector>
#include <algorithm>
#include <tuple>
using namespace std;
struct student {
string name;
int kor, eng, math;
};
// kor내림차순, eng 오름차순, math 내림차순, name 사전순 정렬
bool compare(const student& A, const student& B)
{
return make_tuple(-A.kor, A.eng, -A.math, A.name) < make_tuple(-B.kor, B.eng, -B.math, B.name);
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
// 입력
int N;
cin >> N;
vector<student> v(N);
for (int i = 0; i < N; ++i)
{
cin >> v[i].name >> v[i].kor >> v[i].eng >> v[i].math;
}
// 정렬
sort(v.begin(), v.end(), compare);
// 출력
for (int i = 0; i < N; ++i)
{
cout << v[i].name << '\n';
}
return 0;
}
방법 2에서 튜플끼리 비교연산자로 비교가 가능하다는 것을 처음 알았다.
내림차순의 경우 요소를 음수처리 해주면 된다.
tuple비교를 참고한 페이지
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ]2751번: 수 정렬하기 2 (c++) (0) | 2020.07.06 |
---|---|
[BOJ]10989번: 수 정렬하기 3 (c++) (0) | 2020.07.06 |
[BOJ]10814번: 나이순 정렬 (c++) (0) | 2020.07.06 |
[BOJ]11650번: 좌표 정렬하기 (c++) (0) | 2020.07.06 |
[BOJ]11651번: 좌표 정렬하기 2 (c++) (0) | 2020.07.06 |
댓글