[백준/C++] 10825번 : 국영수

Eunho Bae·2022년 3월 4일
0

백준

목록 보기
7/40

국영수


아이디어

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;
}
profile
개인 공부 정리

0개의 댓글