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

[필자 사고]
문제에서 주어진 조건에 맞게 정렬 함수를 만들면 된다.
필자는 cmp형태로 Node자료형들을 if문을 이용하여 정렬에 사용했따.
아래는 자세한 코드 해설이다.
[코드 해설]
struct Node
- 학생 한 명의 정보를 담는 구조체입니다.
- 필드:
- int korea; → 국어 점수
- int english; → 영어 점수
- int math; → 수학 점수
- string name; → 학생 이름
cmp 함수 (정렬 기준 함수)
- 두 학생 a, b를 비교하여 정렬 순서를 결정합니다.
조건은 다음과 같습니다:
- 모든 점수가 같으면 → 이름 사전순 오름차순.
- 국어와 영어 점수가 같으면 → 수학 점수 내림차순.
- 국어 점수가 같으면 → 영어 점수 오름차순.
- 그 외 → 국어 점수 내림차순.
즉, 정렬 우선순위는
- 국어 점수 내림차순
- 국어가 같으면 영어 점수 오름차순
- 국어·영어 같으면 수학 점수 내림차순
- 세 점수 모두 같으면 이름 사전순 오름차순
main 함수
- 입력 처리
- cin >> N; → 학생 수 입력.
- for문으로 학생 수만큼 반복하면서 이름, 국어, 영어, 수학을 입력받아 arr 벡터에 저장.
- 정렬
- sort(arr.begin(), arr.end(), cmp);
- 학생들을 cmp 함수 기준에 맞게 정렬.
- 출력
- 정렬된 벡터를 순회하면서 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";
}
}'백준 > 정렬' 카테고리의 다른 글
| 백준 1377 c++ "버블 소트" -PlusUltraCode- (0) | 2025.10.21 |
|---|---|
| 백준 1302 c++ "베스트셀러" -PlusUltraCode- (1) | 2025.09.17 |
| 백준 2217 c++ "로프" -PlusUltraCode- (0) | 2025.09.17 |
| 백준 1026 c++ "보물" -PlusUltraCode- (0) | 2025.09.17 |
| 백준 11728 c++ "배열 합치기" -PlusUltraCode- (0) | 2025.09.16 |