sort함수는 세 개의 인자를 받습니다. sort(배열의 시작, 배열의 끝, 정렬 방법) 이라고 생각하시면 편합니다. 세번째 인자를 생략하면 자동 오름차순으로 정렬됩니다.
좀 더 정확히 설명해봅시다.
int arr[5] = { 4, 3, 2, 1, 0 };
int형 원소들을 갖고 있는 arr배열을 오름차순으로 정렬하고싶다면,
sort(arr, arr + 5);
이 코드 한줄로 끝나게 됩니다.
한가지 의문이 듭니다. 왜 배열의 끝이 arr + 4가 아니라 arr + 5일까 ?
밑에 그림을 보겠습니다.
간단하쥬 ? 이 그림이 이해가 안가신다면 포인터 개념을 공부해주시면 됩니다.
이번엔 vector를 이용해봅시다.
vector<int> vec = { 4, 3, 2, 1, 0};
위에 배열과 같은 원소를 갖는 vector를 만들었습니다.
마찬가지로 오름차순으로 정렬하고 싶습니다.
sort(vec, vec + 5);
하면 에러입니다.
vector는 STL에서 제공하는 자료구조이기 때문에 iterator(반복자)를 인자로 넣어주어야 합니다.
sort(vec.begin(), vec.end());
이 옳은 방법입니다.
혹시 vector에서 모든 원소 정렬이 아닌 원하는 부분만 정렬하고 싶다면,
sort(vec.begin() + a, vec.begin() + b);
와 같은 방식으로 a부터 b - 1번째 원소들만 정렬할 수 있습니다.
이번엔 세번째 인자에 대해 알아봅시다.
sort함수가 수행될 때, 어떤 기준으로 정렬이 될 지 정해주는 부분입니다.정의하는 방법은 세 가지 정도 있지만, 가볍게 함수로 정의하는 방법만 보겠습니다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool compare(int& a, int& b){
// (a보다 b가 더 크면 true, 아니면 false) == 오름차순
return a < b;
}
int arr[5] = {4, 3, 2, 1, 0};
vector<int> vec = {4, 3, 2, 1, 0};
int main(){
sort(arr, arr + 5, compare);
sort(vec.begin(), vec.end(), compare);
return 0;
}
보시는 것처럼 간단합니다. 같은 자료형 두 개를 인자로 받고, bool값을 리턴해주는 함수를 작성해주면 비교함수 완성.
return a > b; 를 하면 당연하게도 내림차순으로 정렬됩니다.
살짝 tip 아닌 tip을 드리자면 STL에서 제공하는 functional 라이브러리 안에 less<자료형>()과 greater<자료형>() 함수가 있습니다. 매번 compare함수를 작성하는게 귀찮으신 분들은 이 두 함수를 이용하셔도 되지만, 단순한 내림차순 오름차순 정렬임을 유의해주셔야합니다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
int arr[5] = {4, 3, 2, 1, 0};
int main(){
sort(arr, arr + 5, less<int>()); // 오름차순
sort(arr, arr + 5, greater<int>()); // 내림차순
return 0;
}
'BOJ_단계별로 풀어보기(9단계~) > [11단계] 정렬' 카테고리의 다른 글
[백준 2108] 통계학 (0) | 2022.03.08 |
---|---|
[백준 10989] 수 정렬하기 3 (0) | 2022.03.08 |
[백준 2751] 수 정렬하기 2 (0) | 2022.03.08 |
[백준 2750] 수 정렬하기 (0) | 2022.03.08 |
12단계에 관해서.. (0) | 2022.03.04 |