본문 바로가기

C++

구조체(Struct)혹은 클래스(Class)를 정렬해보자.

백준(BAEKJOON) 2535번 문제를 풀다가 공부하게 된 내용입니다.

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

 

2535번: 아시아 정보올림피아드

첫 번째 줄에는 대회참가 학생 수를 나타내는 N이 주어진다. 단, 3<=N<=100이다. 두 번째 줄부터 N개의 줄에는 각 줄마다 한 학생의 소속 국가 번호, 학생 번호, 그리고 성적이 하나의 빈칸을 사이에 두고 주어진다. 단, 국가 번호는 1부터 순서대로 하나의 정수로 주어지며, 각 학생번호는 각 나라별로 1부터 순서대로 하나의 정수로 주어진다, 점수는 0 이상 1000 이하의 정수이고, 동점자는 없다고 가정한다. 입력으로 제공되는 국가는 적어도 두 나

www.acmicpc.net

접근제어 지시자의 선언이 없는 경우 구조체(Struct)는 pulbic으로, 클래스(Class)의 경우는 private으로 선언된다는 것 외에는 차이가 없으므로 구조체(Struct)로 정리를 합니다.

 

입력받을 내용을 구조체(Struct)배열에 저장하고, 구조체(Struct)배열을 정렬해보려 합니다.

 

먼저 구조체를 선언하고, 필요한 만큼 구조체배열을 선언, 구조체 배열에 데이터를 저장, 출력해봅니다.

#include <iostream>
using namespace std;

struct Olympic
{
	int country;
	int num;
	int score;
};

int main(void)
{
	
	int N;
	cin >> N;
	
	struct Olympic olympic[N];
	
	int tc,tn,ts;
	for(int i=0;i<N;i++)
	{
		cin >> tc >> tn >> ts;
		olympic[i].country=tc;
		olympic[i].num=tn;
		olympic[i].score=ts;
	}
	
	for(int i=0;i<N;i++)
	{
		cout << olympic[i].country;
		cout << ' ';
		cout << olympic[i].num;
		cout << ' ';
		cout << olympic[i].score;
		cout << endl;
	}
	
	return 0;
}
(입력)
9
1 1 230
1 2 210
1 3 205
2 1 100
2 2 150
3 1 175
3 2 190
3 3 180
3 4 195
(출력)
1 1 230 
1 2 210 
1 3 205 
2 1 100 
2 2 150 
3 1 175 
3 2 190 
3 3 180 
3 4 195

 

잘 입력되고 출력되었습니다. 이제 Olympic.score로 정렬을 한후 출력을 해봅니다.

 

먼저 sort() 함수를 이용하려면 algorithm 헤더의 추가가 필요합니다.

sort(A, B) 인경우 A와 B의 범위내에서 "<" 연산결과가 true인 경우 그대로 , false인 경우 해당 요소의 자리를 바꾸며 정렬을 합니다. 기본적으로 오름차순 정렬이 됩니다.

 

구조체(Struct)를 정렬하는 방법은 크게 두 가지 입니다.

 

연산자 오버로딩

sort()의 비교기준인 "<" 연산자를 오버로딩합니다. 오버로딩은 구조체(Struct)안에서 처리합니다.

 "<"는 오름차순 정렬이므로 문제풀이를 위해 내림차순 정렬이 되도록 실체 처리는 ">" 연산으로 변경했습니다.

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

struct Olympic
{
	int country;
	int num;
	int score;
	
	bool operator<(const Olympic &another) const
	{
		return score > another.score;
	};
};

int main(void)
{
	
	int N;
	cin >> N;
	
	struct Olympic olympic[N];
	
	int tc,tn,ts;
	for(int i=0;i<N;i++)
	{
		cin >> tc >> tn >> ts;
		olympic[i].country=tc;
		olympic[i].num=tn;
		olympic[i].score=ts;
	}
	
	sort(olympic,olympic+N);
	
	for(int i=0;i<N;i++)
	{
		cout << olympic[i].country;
		cout << ' ';
		cout << olympic[i].num;
		cout << ' ';
		cout << olympic[i].score;
		cout << endl;
	}
	
	return 0;
}
(입력)
9 
1 1 230 
1 2 210 
1 3 205 
2 1 100 
2 2 150 
3 1 175 
3 2 190 
3 3 180 
3 4 195
(출력)
1 1 230 
1 2 210 
1 3 205 
3 4 195
3 2 190 
3 3 180
3 1 175
2 2 150 
2 1 100 

잘 정렬되었습니다.

 

compare()함수를 작성

sort()의 비교기준을 "<" 연산자에서 특정함수로 변경가능합니다. 

구조체(Struct)의 "<" 연산자 오버로딩을 삭제하고 compare()함수로 mySort()를 작성, sort()에 지정을 했습니다.

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

struct Olympic
{
	int country;
	int num;
	int score;
};

bool mySort(Olympic &a, Olympic &b)
{
	return a.score > b.score;
}

int main(void)
{
	
	int N;
	cin >> N;
	
	struct Olympic olympic[N];
	
	int tc,tn,ts;
	for(int i=0;i<N;i++)
	{
		cin >> tc >> tn >> ts;
		olympic[i].country=tc;
		olympic[i].num=tn;
		olympic[i].score=ts;
	}
	
	sort(olympic,olympic+N,mySort);
	
	for(int i=0;i<N;i++)
	{
		cout << olympic[i].country;
		cout << ' ';
		cout << olympic[i].num;
		cout << ' ';
		cout << olympic[i].score;
		cout << endl;
	}
	
	return 0;
}

 

(입력)
9 
1 1 230 
1 2 210 
1 3 205 
2 1 100 
2 2 150 
3 1 175 
3 2 190 
3 3 180 
3 4 195
(출력)
1 1 230 
1 2 210 
1 3 205 
3 4 195
3 2 190 
3 3 180
3 1 175
2 2 150 
2 1 100 

잘 작동합니다.

 

정렬이 완료되었으니 백준(BAEKJOON) 2535번 문제는 국가에서 최대 2개의 메달만 획득할 수 있다는 룰만 적용해주면 되겠습니다.

반응형