if문을 여러개 쓸 필요 없이 sort함수를 이용하면 된다.
비교함수를 구현할때 return 값이 true이면 비교연산자의 왼쪽이 오른쪽보다 먼저 나오게 해준다.
make_tuple은 tuple을 만들어주는데 튜플 간의 비교를 할때 각 x번째끼리 < 비교를 수행한다.
또 tuple간 크기 비교는 첫번째 속성을 먼저 비교 후, 동일하다면 두 번째 속성을 비교 ... 하는 방식이다.
국어점수는 내림차순이라고 했는데 만약
국어점수가 각각
p1 = 50
p2 = 60이라고 하고
return make_tuple(p1.kor) < make_tuple(p2.kor); 이라고 되어 있었다면
true이기 때문에 p1 p2 순서로 정렬이 될 것이다.
그러나 만약 (-p1.kor) < (-p2.kor); 이렇게 되어 있었다면
-50 < -60
이 경우 false이므로
p2 p1 순서로 정렬이 될 것이다.
#include <iostream>
#include <algorithm>
#include <vector>
#include <tuple>
using namespace std;
struct Person {
string name;
int kor, eng, math;
};
bool Comp(const Person& p1, const Person& p2)
{
return make_tuple(-p1.kor, p1.eng, -p1.math, p1.name) < make_tuple(-p2.kor, p2.eng, -p2.math, p2.name);
}
int main(int argc, char* argv[])
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int n;
cin >> n;
vector<Person> 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(), Comp);
for (int i = 0; i < n; i++)
cout << v[i].name << '\n';
return 0;
}