백준(BAEKJOON) 2535번 문제를 풀다가 공부하게 된 내용입니다.
https://www.acmicpc.net/problem/2535
접근제어 지시자의 선언이 없는 경우 구조체(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개의 메달만 획득할 수 있다는 룰만 적용해주면 되겠습니다.
'C++' 카테고리의 다른 글
백준 3053번 택시기하학 문제에서 배운것들-택시기하학, 원주율값(π: 파이) M_PI, double과 float의 차이 (0) | 2019.10.16 |
---|---|
데이터형의 최대값과 최소값 정리입니다. (0) | 2019.08.21 |
cin과 getline을 같이 사용할때 cin.ignore()이 필요한 이유 기록 (4) | 2019.07.09 |
기약분수, 서로소, 최대공약수(GCD), 유클리드 호제법, 추가) 최소공배수(LCM) (0) | 2019.06.13 |
C++ 함수에 값전달, 포인터전달, 참조전달 (0) | 2019.02.07 |