[Silver / 10825] 국영수
🔷 분류
정렬
✒️ 문제 설명
도현이네 반 학생 N명의 이름과 국어, 영어, 수학 점수가 주어진다. 이때, 다음과 같은 조건으로 학생의 성적을 정렬하는 프로그램을 작성하시오.
- 국어 점수가 감소하는 순서로
- 국어 점수가 같으면 영어 점수가 증가하는 순서로
- 국어 점수와 영어 점수가 같으면 수학 점수가 감소하는 순서로
- 모든 점수가 같으면 이름이 사전 순으로 증가하는 순서로 (단, 아스키 코드에서 대문자는 소문자보다 작으므로 사전순으로 앞에 온다.)
⬅️ 입력
첫째 줄에 도현이네 반의 학생의 수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 한 줄에 하나씩 각 학생의 이름, 국어, 영어, 수학 점수가 공백으로 구분해 주어진다. 점수는 1보다 크거나 같고, 100보다 작거나 같은 자연수이다. 이름은 알파벳 대소문자로 이루어진 문자열이고, 길이는 10자리를 넘지 않는다.
➡️ 출력
문제에 나와있는 정렬 기준으로 정렬한 후 첫째 줄부터 N개의 줄에 걸쳐 각 학생의 이름을 출력한다.
💻 코드 (C++)
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
struct Student {
string name;
int kor;
int eng;
int mat;
};
Student make_stu(string name, int kor, int eng, int mat) {
Student stu;
stu.name = name;
stu.kor = kor;
stu.eng = eng;
stu.mat = mat;
return stu;
}
bool compare(Student a, Student b) {
if(a.kor == b.kor) {
if(a.eng == b.eng) {
if(a.mat == b.mat) return a.name < b.name;
else return a.mat > b.mat;
} else return a.eng < b.eng;
} else return a.kor > b.kor;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int n, k, e, m;
string name;
vector<Student> v;
cin >> n;
for(int i = 0; i < n; i++) {
cin >> name >> k >> e >> m;
v.push_back(make_stu(name, k, e, m));
}
sort(v.begin(), v.end(), compare);
for(int i = 0; i < n; i++) {
cout << v[i].name << "\n";
}
return 0;
}
공유하기
Twitter Facebook LinkedIn글 이동
Comments