본문 바로가기
Algorithm(코딩테스트)/정렬

[백준] 10825 : 국영수 (C++)

by 디지털 전산일지 2024. 2. 9.

문제

 

문제 분석

#정렬 #구조체/클래스

- 이전에는 넣어야 하는 자료가 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;
}



교훈점

- 넣어야 하는 자료형이 많을 때는 구조체나 클래스를 적극 활용하자.