본문 바로가기

IT공부/알고리즘

C++ STL sort() 함수다루기02

C++ STL sort() 함수다루기02

"C++ STL sort() 함수다루기01" 객체로 정렬하는 방법에 대해 알아보았다. 하지만 객체로 정렬하는 경우 프로그램 속도상 별로 좋지 않다. 클래스를 정의하고 정렬방법에 대해 정의해야 하기 때문이다. 실제 프로그래밍 대회에서는 클래스를 사용하는 방법은 적절하지 않다. 객체를 사용하는 방법은 실무에서 사용하며 프로그래밍 대회에서는 페어(Pair) 라이브러리를 사용한다.

 

아래 예제를 보자.

데이터가 2개이고 한 개의 데이터(점수)로 정렬하는 방법

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

}

 

벡터는 배열과 같이 작동하는데 요소를 삭제하거나 삽입할 수 있다. 배열을 사용하기 쉽게 만든 자료구조라고 보면된다. 페어는 한 쌍의 데이터를 처리하게 해주는 자료구조이다. 이러한 STL을 잘 사용하면 코드를 획기적으로 줄일 수 있다. 

 

알고리즘 대회에서는 STL을 얼마나 알고 있느냐에 코드를 간단하고 쉽게 짤 수 있기 때문에 중요하다고 볼 수 있다.

 

이번에는 데이터가 3개일 때 2개의 데이터로 정렬하는 방법을 알아보자.

"학생 데이터가 이름, 성적, 생년월일 3개가 있을 때 성적 순서대로 나열하되 성적이 동일한 경우 나이가 어린 학생이 앞쪽으로 정렬되게 하고 싶다."

 

#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){

           //2중 페어. 데이터가 3개 이상이면 상황에 따라서 클래스를 사용하는 것이 더 나을 수 있다.

           //2개이하인 경우 vector pair를 사용하면 좋다.

           vector<pair<string, pair<int, int> > >  v;

           v.push_back(pair<string, pair<int, int> >("나동빈", pair<int, int>(90, 19961222)));

           v.push_back(pair<string, pair<int, int> >("이태일", pair<int, int>(97, 19930518)));

           v.push_back(pair<string, pair<int, int> >("박한울", pair<int, int>(95, 19930203)));

           v.push_back(pair<string, pair<int, int> >("이상욱", pair<int, int>(90, 19921207)));

           v.push_back(pair<string, pair<int, int> >("강종구", pair<int, int>(88, 19900302)));

          

           sort(v.begin(), v.end(), compare);

           for(int i = 0; i < v.size(); i++){

                      cout << v[i].first << ' ';

           }

          

           return 0;

}

'IT공부 > 알고리즘' 카테고리의 다른 글

C++ STL sort() 함수다루기01  (0) 2020.07.29
병합정렬(Merge Sort)  (0) 2020.07.29
기초 정렬 알고리즘 문제 풀이  (0) 2020.07.28
퀵 정렬의 시간복잡도와 작동원리  (0) 2020.07.25
삽입정렬  (0) 2020.07.25