문제풀이/백준oj

[백준oj] 10825번 국영수

Hyeon-Uk 2021. 3. 7. 15:41
반응형

 

www.acmicpc.net/problem/10825

 

10825번: 국영수

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

www.acmicpc.net


 

풀이)

c++에서 제공해주는 STL의 sort()를 이용하여 풀었다.

다만 정렬 기준을 다시 정의해주어서 풀었다. compare 함수를 정의하여 문제에 정의된

1.국어점수가 감소하는 순서로

2.국어 점수가 같으면 영어 점수가 증가하는 순서로

3.국어 점수와 영어 점수가 같으면 수학 점수가 감소하는 순서로

4.모든 점수가 같으면 이름이 사전순으로 증가하는 순서로

 

이 조건들을 추가시켜서 정렬을 시켜줬다.

 

시간복잡도)

c++ algorithm헤더에서 제공하는 sort함수는 퀵소트를 사용하므로, 기대시간으로 O(NlogN)이 걸린다

 

 

코드)

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;

vector<pair<string,pair<int,pair<int,int>>>> st;//이름,국어,영어,수학 벡터

bool compare(pair<string,pair<int,pair<int,int>>> a,pair<string,pair<int,pair<int,int>>> b){
    if(a.second.first==b.second.first){
        if(a.second.second.first==b.second.second.first){
            if(a.second.second.second==b.second.second.second){
            	//다 같으면 이름이 사전순으로 증가하는 순서로
                return a.first<b.first;
            }
            else{
            	//국어,영어가 같으면 수학점수가 감소하는 순서로
                return a.second.second.second>b.second.second.second;
            }
        }
        else{
        	//국어점수가 같으면 영어점수가 증가하는 순서로
            return a.second.second.first<b.second.second.first;
        }
    }
    else{
    	//국어점수가 감소하는 순서
        return a.second.first>b.second.first;
    }
}

int main() {
    ios_base :: sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        string name;
        int kor,eng,math;
        cin>>name>>kor>>eng>>math;
        st.push_back({name,{kor,{eng,math}}});
    }
   
    sort(st.begin(),st.end(),compare);
    for(int i=0;i<n;i++){
        cout<<st[i].first<<"\n";
    }
	return 0;
}
반응형