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

soft-rain·2022년 3월 6일
0

Algorithm

목록 보기
3/3

🚩 정렬 알고리즘

📌 STD::sort


📖 문제

BOJ 10825 : 국영수


🖥 코드

학생에 대한 국어, 영어, 수학 정보를 모두 받아야 하므로, 구조체를 정의해야 한다.


#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

struct student {  //학생들의 정보를 나타내는 구조체
    string name;
    int kor, eng, math;
};

//비교함수
bool cmp(const student &a, const student &b) {
    if (a.kor == b.kor) {
        if (a.eng == b.eng) {
            if (a.math == b.math) {
                return a.name < b.name;
            }
            return a.math > b.math;
        }
        return a.eng < b.eng;
    }
    return a.kor > b.kor;
}

int main() {
    int n;
    //입력
    cin >> n;
    vector<student> arr(n, {""});
    for (int i = 0; i < n; i++) {
        cin >> arr[i].name >> arr[i].kor >> arr[i].eng >> arr[i].math;
    }
    //연산
    sort(arr.begin(), arr.end(), cmp);
    for (int i = 0; i < n; i++) {
        cout << arr[i].name << '\n';
    }
    return 0;
}

💿 결과

12
Junkyu 50 60 100
Sangkeun 80 60 50
Sunyoung 80 70 100
Soong 50 60 90
Haebin 50 60 100
Kangsoo 60 80 100
Donghyuk 80 60 100
Sei 70 70 70
Wonseob 70 70 90
Sanghyun 70 70 80
nsj 80 80 80
Taewhan 50 60 90
Donghyuk
Sangkeun
Sunyoung
nsj
Wonseob
Sanghyun
Sei
Kangsoo
Haebin
Junkyu
Soong
Taewhan

현재 비교 함수가 중첩 if문이므로, 효율이지 않다.
조건을 바꾸면서 코드를 단순화할 수 있다.


🖥 더 효율적인 코드

 bool cmpAdv(const student &a, const student &b) {
    if (a.kor != b.kor) {
        return a.kor > b.kor;
    }
    if (a.eng != b.eng) {
        return a.eng < b.eng;
    }
    if (a.math != b.math) {
        return a.math > b.math;
    }
    return a.name < b.name;
}

©️ 출처

profile
Yurim Lee

0개의 댓글