본문 바로가기
백준/정렬

백준 10825 c++ "국영수" -PlusUltraCode-

by PlusUltraCode 2025. 9. 17.

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

[필자 사고]

문제에서 주어진 조건에 맞게 정렬 함수를 만들면 된다. 

필자는 cmp형태로 Node자료형들을 if문을 이용하여 정렬에 사용했따.

 

아래는 자세한 코드 해설이다.

[코드 해설]

struct Node

  • 학생 한 명의 정보를 담는 구조체입니다.
  • 필드:
    • int korea; → 국어 점수
    • int english; → 영어 점수
    • int math; → 수학 점수
    • string name; → 학생 이름

cmp 함수 (정렬 기준 함수)

  • 두 학생 a, b를 비교하여 정렬 순서를 결정합니다.

조건은 다음과 같습니다:

  1. 모든 점수가 같으면 → 이름 사전순 오름차순.
  2. 국어와 영어 점수가 같으면 → 수학 점수 내림차순.
  3. 국어 점수가 같으면 → 영어 점수 오름차순.
  4. 그 외 → 국어 점수 내림차순.

즉, 정렬 우선순위는

  • 국어 점수 내림차순
  • 국어가 같으면 영어 점수 오름차순
  • 국어·영어 같으면 수학 점수 내림차순
  • 세 점수 모두 같으면 이름 사전순 오름차순

main 함수

  1. 입력 처리
    • cin >> N; → 학생 수 입력.
    • for문으로 학생 수만큼 반복하면서 이름, 국어, 영어, 수학을 입력받아 arr 벡터에 저장.
  2. 정렬
    • sort(arr.begin(), arr.end(), cmp);
    • 학생들을 cmp 함수 기준에 맞게 정렬.
  3. 출력
    • 정렬된 벡터를 순회하면서 arr[i].name만 출력.

[소스 코드]

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

struct Node {
	int korea;
	int english;
	int math;
	string name;
};

bool cmp(Node a, Node b) {

	if (a.korea == b.korea && a.english == b.english &&
		a.math == b.math) {
		return a.name < b.name;
	}

	if (a.korea == b.korea && a.english == b.english) {
		return a.math > b.math;
	}
	if (a.korea == b.korea) {
		return a.english < b.english;
	}
	return a.korea > b.korea;
}

int main(void) {
	int N;
	cin >> N;
	vector<Node> arr;
	for (int i = 0; i < N; i++) {
		string name;
		int a, b, c;
		cin >> name >> a >> b >> c;
		arr.push_back({ a,b,c,name });
	}
	sort(arr.begin(), arr.end(), cmp);

	for (int i = 0; i < arr.size(); i++) {
		cout << arr[i].name << "\n";
	}

}