초보 개발자의 이야기, 릿허브

[C++] 백준 10825번 국영수 본문

코딩테스트/📗 백준 (BOJ)

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

릿99 2022. 8. 9. 15:31
728x90
반응형
1. 문제이해

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

 

10825번: 국영수

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

www.acmicpc.net

 

1. 국어 점수가 감소하는 순서로

2. 국어 점수가 같으면 영어 점수가 증가하는 순서로

3. 국어 점수와 영어 점수가 같으면 수학 점수가 감소하는 순서로

4. 모든 점수가 같으면 이름이 사전 순으로 증가하는 순서로

 

다음과 같은 순서로 학생의 이름을 출력하는 프로그램을 작성하는 것이 목표이다.

 

 

 

2. 문제풀이

 

어렵지 않은 단순 정렬문제이다.

C++에 내장된 sort 함수를 이용하되, sort(시작 인덱스, 마지막 인덱스, 조건)에서

조건에 해당하는 부분에 함수를 구현해 인자로 넘겨주기만 하면 된다.

 

자세한 내용은 아래 코드와 함께 보자.

 

 

 

3. 소스코드
#include <iostream>
#include <algorithm>
using namespace std;

// 학생 클래스
class student {
public:
	// 이름, 국어, 영어, 수학 성적
	string name;
	int kor;
	int eng;
	int math;
};

// 정렬을 위한 비교 함수
bool cmp(student a, student b) {
	if (a.kor == b.kor) {
		if (a.eng == b.eng) {
			if (a.math == b.math) {
				return a.name < b.name;
			}
			else {
				return a.math > b.math;
			}
		}
		else {
			return a.eng < b.eng;
		}
	}
	return a.kor > b.kor;
}

student* s = new student[100000];
int main() {
	cin.tie(0);
	ios::sync_with_stdio(0);

	int N;	// 학생 수
	cin >> N;

	for (int i = 0; i < N; i++) {
		cin >> s[i].name >> s[i].kor >> s[i].eng >> s[i].math;
	}

	// 정렬
	sort(s, s + N, cmp);

	for (int i = 0; i < N; i++) {
		// endl 사용시 시간초과 발생
		cout << s[i].name << "\n";
	}

	return 0;
}

 

먼저, 학생의 이름, 국어, 영어, 수학 성적을 입력받고 저장하기 위해 class를 사용했다.

student라는 class를 정의하고, 해당 class를 이용해 성적을 입력받았다.

 

입력받은 이름과 성적, sort 함수를 이용해 정렬을 수행한다.

단, 여기서 cmp 함수가 중요한데, 해당 함수를 이용해 문제에서 주어진 4가지 조건을 구현했다.

 

bool cmp 함수는 문제에서 주어진 4가지 조건을 담은 함수이다.

국어, 영어, 수학 성적, 마지막으로 이름에 따라 정렬하는 순서를 넘겨준다.

해당 함수를 이용해 정렬을 한 뒤, main 함수에서는 정렬된 순서의 이름만 출력해주었다.

 

 


 

 

 

 

 

728x90
반응형