문제 난이도 - silver 4
어려운 문제는 아니지만 cpp로 도전해봄
해결방법 >> 하나의 학생 객체에 학생의 이름, 국영수 성적을 저장해 sort알고리즘을 이용해 답을 찾음
#include <iostream>
#include <stdio.h>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
// 학생정보를 담을 변수
int stdNum, kor, eng, mat;
string stdName;
class Student {
public:
string name;
int kor;
int eng;
int mat;
Student(string name, int kor, int eng, int mat) :name(name), kor(kor), eng(eng), mat(mat) {}
};
bool korCompare(Student a, Student b);
bool engCompare(Student a, Student b);
bool matCompare(Student a, Student b);
bool nameCompare(Student a, Student b);
int main(void) {
vector<Student> stdVec; // 학생객체들을 하나의 벡터에서 관리해야하기 때문에 student타입의 벡터를 선언
cin >> stdNum;
for (int i = 0; i < stdNum; i++) {
cin >> stdName;
cin >> kor;
cin >> eng;
cin >> mat;
stdVec.push_back(Student(stdName, kor, eng, mat));
}
// 학생들을 성적별로 sort하기위해 sort함수를 4번 호출해준다
sort(stdVec.begin(), stdVec.end(), korCompare);
sort(stdVec.begin(), stdVec.end(), engCompare);
sort(stdVec.begin(), stdVec.end(), matCompare);
sort(stdVec.begin(), stdVec.end(), nameCompare);
for (int i = 0; i < stdNum; i++) {
cout << stdVec.at(i).name << "\n";
}
return 0;
}
//국어 점수가 감소하는 순서로
bool korCompare(Student a, Student b) {
return a.kor > b.kor;
}
//국어 점수가 같으면 영어 점수가 증가하는 순서로
bool engCompare(Student a, Student b) {
return (a.kor != b.kor) ? a.kor>b.kor :a.eng < b.eng;
}
//국어 점수와 영어 점수가 같으면 수학 점수가 감소하는 순서로
bool matCompare(Student a, Student b) {
return (a.kor == b.kor)?(a.eng == b.eng ? a.mat > b.mat:a.eng<b.eng ): (a.kor > b.kor);
}
//모든 점수가 같으면 이름이 사전 순으로 증가하는 순서로 (단, 아스키 코드에서 대문자는 소문자보다 작으므로 사전순으로 앞에 온다.)
bool nameCompare(Student a, Student b) {
return (a.kor == b.kor) ? (a.eng == b.eng ? (a.mat == b.mat? a.name < b.name: a.mat > b.mat) :a.eng < b.eng) : (a.kor > b.kor);
}
참고
SORT
- sort알고리즘은 algorithm헤더파일에 속해있음
- 퀵정렬을 기반으로 함수가 구현되어있음
- sort(v.begin(), v.end()); // 3번째 인자를 넣지않으면 오름차순으로 정렬된다
- sort(v.begin(), v.end(), compare); // 사용자 정의함수를 기준으로 정렬된다
- sort(v.begin(), v.end(), greater<자료형>()); // 내림차순
- sort(v.begin(), v.end(), less<자료형>());// 오름차순