지난 시간에는 클래스(Class)를 정의해서 여러 개의 변수가 존재하는 상황에서
'특정한 변수'를 기준으로 정렬하는 방법에 대해 알아봤다.
다만 클래스를 정의하는 방식은 프로그래밍 속도 측면에서 별로 유리하지 않다.
실제 프로그래밍 대회에서 문제 하나를 풀기 위해 클래스를 정의하고 있는 것은 적절치 못하다.
따라서, 일반적으로 프로그래밍 대회와 같이 빠른 개발이 필요할 때는 페어(Pair)라이브러리를 사용하는 것이 효율적이다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main (void) {
vector<pair<int, string> >v;
v.push_back(pair<int, string>(90, "민지"));
v.push_back(pair<int, string>(85, "해린"));
v.push_back(pair<int, string>(82, "다니엘"));
v.push_back(pair<int, string>(98, "하니"));
v.push_back(pair<int, string>(79, "혜인"));
sort(v.begin(), v.end()); //처음부터 끝까지 정렬
for(int i = 0; i < v.size(); i++) {
cout << v[i].second << ' ';
}
return 0;
}
위 소스코드는 벡터(Vector) 라이브러리 페어(Pair) 라이브러리를 이용해 지난 시간에 배열과 클래스를 이용했던 방식을 대체한 것이다. 주로 이렇게 소스코드의 길이를 짧게 해주는 기법을 숏코딩(short cording)이라 한다.
벡터(Vector) STL은 마치 배열과 같이 작동하는데 원소를 선택적으로 삽입(Push) 및 삭제(Pop)을 할 수 있다.
페어(Pair) STL은 한 쌍의 데이터를 처리할 수 있도록 해주는 자료구조이다.
지난 시간에는 변수가 2개일 때 '한 개'의 변수를 기준으로 정렬하는 방법에 대해 알아봤다.
이번에는 이어서 변수가 3개일 때 '두 개'의 변수를 기준으로 정렬하는 방법에 대해 알아보자.
학생을 나타낼 수 있는 정보가 이름, 성적, 생년월일일 때 학생을 성적 순서대로 나열하고자 한다.
다만 성적이 동일한 경우 나이가 더 어린 학생이 더 우선순위가 높다.
위 요구 사항을 처리하기 위해 알아야 할 것은 바로 기준이 두개 라는 것이다.
이 경우 벡터(Vector)와 페어(Pair) STL을 이용해서 몹시 짧은 코드로 작성할 수 있다.
<학생명단>
학생1 : 민지/ 90점, 2004-05-07
학생2 : 하니/ 85점, 2004-10-06
학생3 : 다니엘/ 96점, 2005-04-11
학생4 : 해린/ 93점, 2006-05-15
학생5 : 혜인/ 90점, 2008-04-21
위 학생들을 정렬하기 위해서 먼저, 성적에 따라서 정렬을 한 뒤,
성적이 같은 경우 나이가 더 어린 사람이 먼저 출력되면 된다.
예를 들어 민지와 혜인은 모두 90점이지만 더 나이가 어린 혜인이 먼저 출력되어야한다.
소스 코드는 다음과 같다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool compare(pair<string, pair<int, int> >a,
pair<string, pair<int, int> >b) {
if(a.second.first == b.second.first) {
return a.second.second > b.second.second; //더 어린 학생이 우선순위가 높은 것.
} else {
return a.second.first > b.second.first; // 성적이 높은 학생이 우선순위가 높은 것.
}
}
int main (void) {
vector<pair<string, pair<int, int> > > v;
v.push_back(pair<string, pair<int, int> >("민지", pair<int, int>(90, 20040507)));
v.push_back(pair<string, pair<int, int> >("하니", pair<int, int>(85, 20041006)));
v.push_back(pair<string, pair<int, int> >("다니엘", pair<int, int>(96, 20050411)));
v.push_back(pair<string, pair<int, int> >("해린", pair<int, int>(93, 20060515)));
v.push_back(pair<string, pair<int, int> >("혜인", pair<int, int>(90, 20080421)));
sort(v.begin(), v.end(), compare); //처음부터 끝까지 정렬
for(int i = 0; i < v.size(); i++) {
cout << v[i].first << ' ';
}
return 0;
}
실행결과
'공부 기록 일지 > Algorithm' 카테고리의 다른 글
힙 정렬 (Heap Sort) (0) | 2023.09.21 |
---|---|
C++로 STL Sort() 함수 다루기 #1 (0) | 2023.09.18 |
병합 정렬(Merge Sort) (0) | 2023.09.15 |
퀵 정렬(Quick Sort) (0) | 2023.09.11 |
삽입 정렬(Insertion Sort) (2) | 2023.09.11 |