https://www.acmicpc.net/problem/10825
<코드>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <tuple>
using namespace std;
vector<tuple<string,int,int,int>>v;
bool cmp(tuple<string,int,int,int>&v1,tuple<string,int,int,int>&v2)
{
if(get<3>(v1) == get<3>(v2) && get<2>(v1) == get<2>(v2) && get<1>(v1) == get<1>(v2)){
return get<0>(v1)<get<0>(v2);
}
//국 == 영 == 수
else if(get<2>(v1) == get<2>(v2) && get<1>(v1) == get<1>(v2))
{
return get<3>(v1)>get<3>(v2);
}
//국 == 영
else if(get<1>(v1) == get<1>(v2))
{
return get<2>(v1) < get<2>(v2);
}
//국어만 같은 경우
else return get<1>(v1)>get<1>(v2);
//위에 모든 조건에 해당하지 않는 경우
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
string a;
int n1,n2,n3;
cin>>a>>n1>>n2>>n3;
v.push_back(make_tuple(a,n1,n2,n3));
}
sort(v.begin(),v.end(),cmp);
for(int i=0;i<n;i++)
{
cout<<get<0>(v[i])<<'\n';
}
}
<풀이과정>
이 문제는 국어,영어,수학 점수와 학생 이름에 따른 정렬 문제입니다.
- 국어 점수가 감소하는 순서로(내림차순)
- 국어 점수가 같으면 영어 점수가 증가하는 순서로(오름차순)
- 국어 점수와 영어 점수가 같으면 수학 점수가 감소하는 순서로(내림차순)
- 모든 점수가 같으면 이름이 사전 순으로 증가하는 순서로 (단, 아스키 코드에서 대문자는 소문자보다 작으므로 사전순으로 앞에 온다.)(오름차순)
접근해야할 요소가 많으면(3개 이상) pair를 사용하는 것보다 tuple 헤더를 이용하면 더욱 쉽게 접근할 수 있다.
cmp함수부분이 위에 정렬 조건 부분이다.
'PS > 정렬 알고리즘[Sort]' 카테고리의 다른 글
백준 2204 도비의 난독증 테스트(c++) (1) | 2022.10.09 |
---|---|
백준 1764 듣보잡(c++) (1) | 2022.08.29 |
백준 1377 버블소트(c++) (0) | 2022.08.26 |
백준 2628 종이자르기(c++) (1) | 2022.08.23 |
백준 11652 카드(c++) (0) | 2022.08.19 |