[알고리즘] 백준 10825 - 국영수

do_large·2020년 8월 26일
0

알고리즘

목록 보기
4/50
post-thumbnail

문제 난이도 - 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<자료형>());// 오름차순

0개의 댓글