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

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

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

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

지금까지 선택 정렬, 버블 정렬, 삽입 정렬, 퀵 정렬, 병합 정렬의 개념을 이해하고 간단한 예시를 통해 프로그램까지 작성하는 시간을 가졌습니다. 자 이번엔 C++ STL sort 함수에 대해 알아 보도록 하겠습니다. 정렬은 컴퓨터 공학의 오래된 연구 분야이므로 아주 훌륭한 정렬 라이브러리들이 존재하죠. 즉, 앞서 직접 코딩했던것 처럼 할 필요 없이 라이브러리를 가져다 쓰면 되는 것입니다.

그치만 기본적인 정렬 원리에 대해서는 잘 알고있어야 문제해결능력에 도움이 될거라 생각합니다.

이제 sort 함수의 사용법을 소스코드로 보시겠습니다

#include <iostream>
#include <algorithm>

using namespace std;

int main(void) {
	
	// 입력 
	int a[10] = {2, 3, 10, 4, 8, 5, 1, 6, 7, 9};
	
	// 정렬 
	sort(a, a + 10);
	
	// 출력 
	for (int i = 0; i < 10; i++) {
		cout << a[i] << ' ';
	}
}

 

기본적으로 sort 함수는 C++ algorithm 헤더에 포험되어 있고, 기본 사용법은 위와 같습니다.

이제 우리는 C++ 문법으로 코딩해보겠니다 :] C++ 은 C와 굉장히 흡사한 구조를 가지고 있고, C에 객체 지향 프로그래밍 기법을 더한 문법이라고 보시면 됩니다. 

sort 라는 함수는 기본적으로 오름차순 정렬을 수행하는데요 파라미터 값으로는
sort(a, a + 10);
위와 같이 배열 a 과 함께 배열의 시작점 주소마지막 주소 + 1을 더해서 적으면 됩니다. 총 10개의 원소가 있는 배열의 a를 정렬해 주는것이죠

#include <iostream>
#include <algorithm>

using namespace std;

// 오름차순 조건 함 
bool compare(int a, int b) {
	return a < b;
	// 내림차순
	// return a > b; 
}

int main(void) {
	
	// 입력 
	int a[10] = {2, 3, 10, 4, 8, 5, 1, 6, 7, 9};
	
	// 정렬 
	sort(a, a + 10, compare);
	
	// 출력 
	for (int i = 0; i < 10; i++) {
		cout << a[i] << ' ';
	}
}

sort 함수의 장점으로 정렬의 기준을 직접 설정할 수 있다는 점인데요 위와 같이 compare 함수를 만들어 sort 함수의 세 번째 파라미터 값으로 넣으면, 해당 함수의 반환 값에 맞게 정렬을 수행합니다. sort는 기본적으로 오름차순으로 정렬하기 때문에 copare 함수에서 주석처리된 부분으로 반환한다면 내림차순의 결과를 얻을 수 있습니다. 

return a > b 에서 관계연산자 > 의 의미는 왼쪽에 있는 것이 더 클 수 있도록 정렬 하겠다는 기준을 만들어주는 것이죠 :)

위와 같이 단순 데이터 정렬 기법은 실무에서 사용할일이 많지 않을거라고 생각합니다. 실무에서는 프로그래밍을 할 때는 모든 데이터들이 객체러 정리되어 내부적으로 여러 개의 변수를 포함하고 있기 때문인데요. 보통 객체의 정렬 방식은  '특정한 변수를 기준으로' 정렬하기 때문에 꼭 알고가시는게 좋을것 같네요 :]

#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("현빈", 90),
		Student("원빈", 93),
		Student("김우빈", 97),
		Student("권상우", 87),
		Student("나야나", 92)
	};
	sort(students, students + 5);
	
	// 출력
	for (int i = 0; i < 5; i++) {
		cout << students[i].name << ' ';
	} 
}

위 소스코드는 점수 (score)를 기준으로 학생을 정렬해서 학생들의 이름을 출력하는 프로그램입니다. 이를 퀵 정렬, 병합 정렬 등의 함수 안에서 구현하고자 하면 굉장히 복잡할 수 있지만, 클래스sort 함수를 이용하여 구현하면 보다 쉽게 작업하실 수 있습니다.

sort 함수 사용에 있어 일반 데이터의 정렬과 다른점이 있다면 객체를 선언할 때 operator 즉 정렬 기준을 같이 선언하여 sort 함수를 사용할 때 별도 비교함수를 넣을 필요가 없다는 점 입니다.

여기까지 이해되시나요 ?

다음 포스팅에 이어서 진행해볼게요 !

즐거운 코딩하세요 :)

 

문의:  ralla0405@gmail.com

반응형