문제
문제 분석
#정렬 #구조체/클래스
- 이전에는 넣어야 하는 자료가 2개, 3개여서 pair, tuple에 담으면 됐으나 이제는 담아야 하는 자료가 4개이다.
- 담아야 하는 자료가 많은 경우 구조체나 클래스를 사용하면 된다.
- 클래스를 사용할 경우 접근 제한 지정자를 지정하지 않으면 자동으로 private으로 되므로 public으로 바꿔주어야 한다.
- 오름차순일 경우 return을 '>' 으로, 내림차순일 경우 return을 '<' 으로 한다.
- 처음에는 담아야 하는 자료가 4개여서 pair와 tuple만 생각하다가 헤맸었다.
정답 코드
// 담아야 하는 데이터가 여러 개 일때는 구조체를 사용하여 담아놓는다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Student {
public:
string name;
int korean_score;
int english_score;
int math_score;
// 생성자
Student(string name_, int korean_score_, int english_score_, int math_score_) {
name = name_;
korean_score = korean_score_;
english_score = english_score_;
math_score = math_score_;
}
};
vector<Student> v;
bool cmp(const Student& s1, const Student& s2) {
if (s1.korean_score != s2.korean_score) return s1.korean_score > s2.korean_score; // 1순위 : 국어 성적순으로 내림차순
else if (s1.english_score != s2.english_score) return s1.english_score < s2.english_score; // 2순위 : 영어 성적순으로 오름차순
else if (s1.math_score != s2.math_score) return s1.math_score > s2.math_score; // 3순위 : 수학 성적순으로 내림차순
else return s1.name < s2.name; // 4순위 )이름 순으로 오름차순
}
int main(void) {
ios_base::sync_with_stdio(false); cin.tie(nullptr);
// 정보 입력받고 vector에 저장
int N;
cin >> N;
for (int i = 0; i < N; i++) {
string name;
int korean_score, english_score, math_score;
cin >> name >> korean_score >> english_score >> math_score;
Student s = Student(name, korean_score, english_score, math_score); // 학생 객체 생성
v.push_back(s);
}
// 정렬
sort(v.begin(), v.end(), cmp);
// 출력
for (int i = 0; i < v.size(); i++) {
cout << v[i].name << "\n";
}
return 0;
}
교훈점
- 넣어야 하는 자료형이 많을 때는 구조체나 클래스를 적극 활용하자.