본문 바로가기
알고리즘/문제집

[알고리즘-8] C++ STL sort 함수 다루기 - ②

by 정긔린 2022. 3. 30.
반응형

안녕하세요 기린입니다 :)

오늘은 지난 시간에 이어서 STL sort 함수 다루기를 진행해보도록 하겠습니다.

2022.03.29 - [알고리즘/문제집] - [알고리즘-7] C++ STL sort() 함수 다루기 - ①

 

[알고리즘-7] C++ STL sort() 함수 다루기 - ①

안녕하세요 기린입니다 :) 지금까지 선택 정렬, 버블 정렬, 삽입 정렬, 퀵 정렬, 병합 정렬의 개념을 이해하고 간단한 예시를 통해 프로그램까지 작성하는 시간을 가졌습니다. 자 이번엔 C++ STL sor

kirinit.tistory.com

지난 시간에 클래스(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, "Tom"));
	v.push_back(pair<int, string>(93, "David"));
	v.push_back(pair<int, string>(97, "Erin"));
	v.push_back(pair<int, string>(87, "Logan"));
	v.push_back(pair<int, string>(92, "Olivia"));
	
	// Sort
	sort(v.begin(), v.end());
	
	// Output
	for (int i = 0; i < v.size(); i++) {
		cout << v[i].second << ' ';
	} 
	return 0;
}

위 소스코드는 벡터(Vector) 라이브러리와 페어(pair) 라이브러리를 이용해 지난 시간에 배열과 클래스를 이용했던 방식을 대체한 것입니다. 주로 이렇게 소스코드의 길이를 짧게 해주는 기법을 숏코딩(Short Coding)이라고 합니다.  :]

벡터 STL은 마치 배열과 같이 작동하는데 원소를 선택적으로 삽입(Push)삭제(Pop)을 할 수 있답니다. 즉 단순한 배열을 보다 사용하기 쉽게 개편한 자료구조라고 할 수 있습니다. 페어 STL은 한 쌍의 데이터를 처리할 수 있도록 해주는 자료구조라고 할 수 있습니다. 이러한 STL을 적절하게 사용하면 소스코드가 짧고 명료하겠죠.

이번 예제는 변수가 3개일 때 '2개의 변수를 기준'으로 정렬하는 방법에 대해서 알아보도록 하곘습니다.

 

학생을 나타낼 수 있는 정보가 이름, 성적, 생년월일일 때 학생을 성적 순서대로 나열하고자 한다. 다만 성적이 동일한 경우 나이가 더 어린 학생이 더 우선순위가 높다.

위 요구사항을 처리하는 프로그램을 한번 작성해보겠습니다.

<학생 명단>

학생 1: Tom/90점/1991-03-04
학생 2: David/92점/1990-04-05
학생 3: Erin/97점/1995-08-24
학생 4: Logan/87점/1992-04-02
학생 5: Olivia/92점/1991-05-08

위 학생들을 먼저 성적에 따라 정렬하고, 성적이 같은 경우 나이가 더 어린 사람이 출력되면 됩니다. 예를들어 David 학생과 Olivia 학생 모두 92점이지만 나이가 더 어린 Olivia 학생이 먼저 출력이 되면 되겠죠 ? 소스코드는 아래와 같습니다.

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

// pair<name, pair<score, age>>
bool compare(pair<string, pair<int, int> > a,
			 pair<string, pair<int, int> > b) {
	// Compare score 
	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) {
	
	// Input
	vector<pair<string, pair<int, int> > > v;
	v.push_back(pair<string, pair<int, int> >("Tom", make_pair(90, 19910304)));
	v.push_back(pair<string, pair<int, int> >("David", make_pair(92, 19900405)));
	v.push_back(pair<string, pair<int, int> >("Erin", make_pair(97, 19950824)));
	v.push_back(pair<string, pair<int, int> >("Logan", make_pair(87, 19920402)));
	v.push_back(pair<string, pair<int, int> >("Olivia", make_pair(92, 19910508)));
	
	// Sort
	sort(v.begin(), v.end(), compare);
	
	// Output
	for (int i = 0; i < v.size(); i++) {
		cout << v[i].first << ' ';
	} 
	return 0;
}

 

실행결과를 보시면 Olivia가 앞자리에 있는걸 확인하실 수 있습니다 !

sort 함수는 위 예제처럼 3개의 변수까지만 자유자재로 다를 수 있는 정도면 실무나 프로그래밍 대회에서도 막힘없이 하실 수 있을겁니다. 자 그럼 즐거운 코딩하세요 :)

 

문의: ralla0405@gmail.com

반응형