개발/알고리즘

10825_국영수

송디 2020. 11. 14. 20:19

www.acmicpc.net/problem/10825

 

10825번: 국영수

첫째 줄에 도현이네 반의 학생의 수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 한 줄에 하나씩 각 학생의 이름, 국어, 영어, 수학 점수가 공백으로 구분해 주어진다. 점수는 1보다 크거나 같고, 1

www.acmicpc.net

정렬하는 문제이다. C++에서 정렬하는 라이브러리는 algorithm을 쓰면된다. C++에서 쓰이는 정렬 알고리즘은 nlogn의 시간복잡도를 가진다고 하였는데, 정확한지는 모르겠다. 여튼 comp함수를 이용해 정렬 함수를 커스텀해 사용하는 연습을 하였다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
bool comp(const P &a,const P &b){
    if(a.kor > b.kor)
        return true;
    else if(a.kor == b.kor){
        if(a.eng < b.eng)
            return true;
        else if(a.eng == b.eng){
            if(a.math > b.math)
                return true;
            else if(a.math == b.math){
                if(a.name < b.name)
                    return true;
            }
        }
    }
    return false;
}
cs

해당 함수에서 true가 반환되면 잘 정렬이 되있는거고 false면 정렬이 안되어 있는 상태이므로 정렬해준다고 생각하면 된다. 첫번째 if문은 내림차순 두번쨰는 오름차순 세번쨰는 내림차순 네번쨰는 오름차순이라고 생각하면 된다. 

 

 전체코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include<iostream>
#include<vector>
#include<algorithm>
 
using namespace std;
 
struct P{
    string name;
    int kor, eng, math;
};
 
bool comp(const P &a,const P &b){
    if(a.kor > b.kor)
        return true;
    else if(a.kor == b.kor){
        if(a.eng < b.eng)
            return true;
        else if(a.eng == b.eng){
            if(a.math > b.math)
                return true;
            else if(a.math == b.math){
                if(a.name < b.name)
                    return true;
            }
        }
    }
    return false;
}
 
int main(void){
    int n;
    vector<P> group;
 
    cin >> n;
    for(int i = 0; i < n;i++){
        string nm;
        int k, e, m;
        cin >> nm >> k >> e >> m;
        group.push_back({nm, k, e, m});
    }
    stable_sort(group.begin(), group.end(), comp);
    for(P a : group){
        cout << a.name << "\n";
    }
}
 
cs
728x90

'개발 > 알고리즘' 카테고리의 다른 글

10820_문자열분석  (0) 2020.11.15
11004_K번째 수  (0) 2020.11.15
20057_마법사 상어와 토네이도  (0) 2020.11.03
2133_Tri Tiling(DP)  (0) 2020.10.31
11726번: 2×n 타일링  (0) 2020.10.25