[백준/C++]#10825 - 국영수

2021. 1. 29. 17:20필요/코딩테스트(백준)

풀이

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;

struct student {	// 구조체 정의
	string name;
	int korean;
	int english;
	int math;
};

bool cmp (const student a, const student b) {	// 비교함수 정의
	if (a.korean == b.korean) {
		if (a.english == b.english) {
			if (a.math == b.math) {
				return a.name < b.name;
			}
			else 
				return a.math > b.math;
		}
		else 
			return a.english < b.english;
	}
	else 
		return a.korean > b.korean;
}

int main() {
	int n;
	cin >> n;
	vector<student> x(n);
	for (int i=0; i<n; i++) {	// 입력
		cin >> x[i].name >> x[i].korean >> x[i].english >> x[i].math;
	}
	sort(x.begin(), x.end(), cmp);
	for (int i=0; i<n; i++) {	// 출력
		cout << x[i].name << '\n';
	}
	return 0;
}

개념

국어는 내림차, 영어는 오름차, 수학은 내림차, 이름은 사전순에 따라 정렬돼야한다.

이러한 복잡한 요구를 맞추기 위해 cmp 함수를 사용한다.

 


풀이 

 

국어, 영어, 수학, 이름은 한 세트로 움직이므로 구조체로 정의했다.

입력받고 출력하는 것은 저번 문제와 같다.

 

관건은 cmp 함수이다.

우선 순위에 따라 정렬이 되는 방식이 true 값을 return하게 짜야한다.

return 값이 bool 값인 것에 착안해 비교하는 과정 자체를 return에 넣었다.

예를 들어 오름차순, 사전순으로 배열하기 위해서는 'a.name < b.name' 여야한다.

 


+a

다른방법

튜플을 사용해서 비교를 한줄로 할 수 있다.

#include <tuple>

bool cmp(const student &a, const student &b) {
    return make_tuple(-a.korean, a.english, -a.math, a.name) < make_tuple(-b.korean, b.english, -b.math, b.name);
}

이 방식은 각 성분을 비교한다.

내림차순으로 정렬하고 싶은 값에 -를 붙여서 표현한다.