-
반응형
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; }
반응형'문제풀이 > 백준oj' 카테고리의 다른 글
[백준OJ] 1715번 카드 정렬하기 (0) 2021.03.09 [백준oj] 1049번 기타줄 (0) 2021.03.07 [백준oj] 18427번 함께 블록 쌓기 (0) 2021.03.06 [백준oj] 1600번 말이 되고픈 원숭이 (0) 2021.03.03 [백준oj] 4485번 녹색 옷 입은 애가 젤다지? (0) 2021.01.10 댓글