본문 바로가기
공부/알고리즘

C++ Sort() 사용

by 맑은청이 2020. 5. 30.
728x90
반응형

 클래스 객체를 이용해서 정렬하는 건 실무에서 많이 사용되는 방법이고 프로그래밍 대회에선 실행 시간에 안 좋은 측면 때문에 자주 사용되지 않는다고 합니다. 실제로는 C++에 vector 라이브러리에, pair 를 더 많이 이용합니다. 정렬은 이미 만들어진 훌륭한 라이브러리가 많으니깐 원리를 이해하고 바로 라이브러리를 사용하면 좋겠죠!

 

sort 함수는 <algorithm> 라이브러리에 포함되어있고 pair는 <vector> 라이브러리에 포함되어 있습니다.

#include <iostream>
#include <algorithm>

using namespace std;
//sort 기준을 스스로 정할 수 있음
//단순 데이터 정렬 기법은 현실적이지 않음 
bool compare(int a,int b){
	return a < b; 
} 
int main(void){
	int a[10] = {9, 3, 5, 4, 1 ,10, 8, 6, 7, 2};
	sort(a, a + 10, compare); // 배열과 정렬할 원소 개수 
	for(int i = 0; i < 10; i++){
		cout<<a[i]<<' ';
	} 
	
}

sort()함수에 기본적인 사용방법입니다. 

sort(배열, 어디까지 정렬을 어디까지 진행할것인지, 옵션(비교연산함수))

STL에 좋은 점은 정렬 기준을 스스로 정할 수 있다는 점입니다. 위에 compare 함수 처럼 말입니다. 이 함수에 반환 값에 맞게 정렬이 됩니다.  < 를 > 로 하면 내림차순 정렬이 됩니다. (더 다양한 정렬 방식을 이용할 수 있겠죠?) 지정하지 않음녀 오름차순 기본 정렬이 됩니다. 

 

데이터를 묶어서 클래스화 한 후 정렬하는 방식

 

실제로는 학생의 특성(학번,성별, 생년월일, 성적 등등등) 과 같이 묶어서 활용할 때가 많습니다. 객체지향적인거죠.

 

#include <iostream>
#include <algorithm>

using namespace std;

class Student{
public:
	string name;
	int score;
	Student(string name, int score){
		this->name = name;
		this-> score = score;
	}
	//정렬 기준은 ' 점수가 작은 순서'
	bool operator <(Student &student){
		return this->score < student.score;
		//점수가 작으면 먼저 출력
		//내 점수와 다른 학생을 비교 
	} 
};

int main(void){
	Student students[] {
		Student("박현청",99),
		Student("이다인",93),
		Student("박현강",80),
		Student("박현은",100),
		Student("보 라",85),
	};
	sort(students,students + 5);
	for(int i = 0 ;i < 5; i++)
		cout<<students[i].name<<endl; 
} 

 

< 를 오버라이딩합니다. 

 

하지만 앞에서 미리 언급했듯이 프로그래밍적으로 봤을때 이렇게 묶어서 데이터를 표현하는 건 느립니다. 그래서 vector 를 쓰죠. 

 

//실제 대회에서 문제 하나를 풀기 위해 클래스를 정의하고 있는 것은 적절치 않음
//실무에선 많이 씀
//대회에선 페어(Pair) 라이브러리를 사용함

#include <iostream>
#include <vector> //단순배열, 연결리스트 기반 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>(65,"박현강"));
	v.push_back(pair<int ,string>(87,"박현은"));
	v.push_back(pair<int ,string>(88,"유제광"));
	v.push_back(pair<int ,string>(60,"박영수")); 
	 
	sort(v.begin(),v.end());
	for(int i = 0; i < v.size();i++){
		cout<< v[i].second << ' ';
	}
} 
 

push_back 으로 pair를 넣고 size() 배열의 크기를 확인합니다. pair에서 first 는 앞에 원소 second는 뒤에 원소입니다. 

 

 

기준이 두개여도 정렬이 가능합니다. 이중 pair 를 사용하면 되는데요.

//2개의 기준을 이용해서 정렬 

#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,19990430)));
	v.push_back(pair<string, pair<int, int> >("박현강",pair<int,int>(90,19970217)));
	v.push_back(pair<string, pair<int, int> >("박현은",pair<int,int>(80,19940803)));
	v.push_back(pair<string, pair<int, int> >("유제광",pair<int,int>(100,19620217)));
	v.push_back(pair<string, pair<int, int> >("박영수",pair<int,int>(60,19621020))); 
	 
	sort(v.begin(),v.end(),compare);
	for(int i = 0; i < v.size();i++){
		cout<< v[i].first << ' ';
	}
} 
 

compare는 점수가 같을때는 생년월일이 빠르면 우선순위를 부여한다는 내용의 함수입니다. 

 

이렇게 C++ STL의 sort() 함수를 살펴봤습니다. 이 내용은 유튜브의 나동빈님 강의와 블로그를 보며 복습한 내용입니다. ! 감사합니다. 

 

나동빈님 유튜브입니다! 

https://blog.naver.com/ndb796/221228004692

 

9. C++ STL sort() 함수 다루기 ②

지난 시간에는 클래스(Class)를 정의해서 여러 개의 변수가 존재하는 상황에서 '특정한 변수'를 기준으로 ...

blog.naver.com

 

728x90
반응형

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

계수 정렬(Counting Sort)  (0) 2020.06.01
힙정렬  (0) 2020.06.01
병합정렬 복습  (0) 2020.05.29
퀵정렬 복습  (0) 2020.05.28
삽입정렬 복습(Insertion Sort)  (0) 2020.05.27