본문 바로가기
Algorithm/BOJ

[BOJ]10825번: 국영수 (c++)

by HBGB 2020. 7. 6.

https://www.acmicpc.net/problem/10825

 

10825번: 국영수

첫째 줄에 도현이네 반의 학생의 수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 한 줄에 하나씩 각 학생의 이름, 국어, 영어, 수학 점수가 공백으로 구분해 주어진다. 점수는 1보다 크거나 같고, 1

www.acmicpc.net

 

방법 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비교를 참고한 페이지

 

relational operators (tuple) - C++ Reference

function template std::relational operators (tuple) (1)template bool operator== ( const tuple & lhs, const tuple & rhs); (2)template bool operator!= ( const tuple & lhs, const tuple & rhs); (3)template bool operator< ( const tuple & lhs, const tupl

www.cplusplus.com

 

댓글