PS/정렬 알고리즘[Sort]

백준 10825 국영수(c++)

SeungbeomKim 2022. 8. 26. 19:10
반응형

https://www.acmicpc.net/problem/10825

 

10825번: 국영수

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

www.acmicpc.net

<코드>

#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';
	}

}

<풀이과정>

이 문제는 국어,영어,수학 점수와 학생 이름에 따른 정렬 문제입니다.

  1. 국어 점수가 감소하는 순서로(내림차순)
  2. 국어 점수가 같으면 영어 점수가 증가하는 순서로(오름차순)
  3. 국어 점수와 영어 점수가 같으면 수학 점수가 감소하는 순서로(내림차순)
  4. 모든 점수가 같으면 이름이 사전 순으로 증가하는 순서로 (단, 아스키 코드에서 대문자는 소문자보다 작으므로 사전순으로 앞에 온다.)(오름차순)

접근해야할 요소가 많으면(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