호우동의 개발일지

Today :

article thumbnail

썸네일


정렬(sort) - compare

C++에서 자주 쓰이는 기능 중, <algorithm> 헤더 안에 있는 sort 기능이 많이 쓰인다.
해당 함수는 벡터(vector)나 배열과 함께 사용한다.

아래는 사용법 예시이다.

#include <iostream>
#include <algorithm> // sort 헤더파일
#include <vector> // 벡터 헤더파일
using namespace std;

int array_size = 8;

int main(){
    int array[] = {4,5,2,1,5,1,74,5};
    vector<int> arr = {4,5,2,1,5,1,74,5};

    sort(arr.begin(),arr.end());
    sort(array,array+array_size,greater<int>());

    for(int i = 0; i < arr.size(); i++) {
        cout << arr[i] << " ";
    }
    cout << endl;
    for(int i = 0; i < array_size; i++) {
        cout << array[i] << " ";
    }
    /*  출력
        1 1 2 4 5 5 5 74 
        74 5 5 5 4 2 1 1
    */
}

greater이나 less 이런 걸 사용해서 오름차순과 내림차순을 나타내기도 한다.

핵심적으로 다룰 것은 오름차순 내림차순 같은 정렬 규칙을 직접 정의하는 방법에 관한 것이다.

방법 자체는 간단하다.
위에 greater <int> 자리 부분에 사용자 정의 함수를 만들어주면 된다.

사용자 정의 함수는 bool 형으로 만들어주고, 매개변수로는 원하는 자료형을 넣어주면 된다.

아래에 예시를 보자.

bool compare(int a, int b){
    if(a.count == b.count) return (a.num < b.num);
    return a.count < b.count;
}

int main(){
	vector<int> tmp;
	sort(tmp.begin(),tmp.end(),compare);
}

위 같은 방식으로 해주면 된다.
매개변수는 같은 자료형의 변수 두 가지가 들어간다.

compare이라는 bool형인 이유는 true 또는 false를 반환하여
우선순위 관계를 정의하기 위해서이다.

return값에 대해서 말하면 간단하게

a < b : a보다 b가 더 크다.
→ a보다 b가 더 뒤에 나온다.( 오름차순 )

a > b : b보다 a가 더 크다.
→ b보다 a가 더 뒤에 나온다.( 내림차순 )

쉽게 말해서 큰 쪽이 우선순위가 뒤로 밀린다.(뒤에 나온다).

이런 사용자정의가 왜 필요할까?
구조체나, 내부가 복잡한 자료형을 사용할 경우에 필요하기 때문이다.

struct Number{
    int num;
    int count;
};

당장 구조체 Number가 존재하고 안에 2가지 변수가 있다.

나는 여기서 count를 기준으로 오름차순 정렬하고 싶은데,
그냥 오름차순 정렬했다간 num을 기준으로 오름차순 할 수도 있다.

다른 경우로 count를 기준으론 내림차순 정렬하고 싶을 수도 있다.
그렇기 때문에 해당 기능이 필요한 것이다.

이런 경우 아래와 같이 사용하면 된다.

bool compare(Number a, Number b){
    if(a.count == b.count) return (a.num < b.num);
    return a.count < b.count;
}

이는 예외적인 처리까지 해준 것인데, 내부에서도 우선순위가 존재한다.

count가 num보다 우선순위이다.
count에 대해서는 오름차순이고,count가 서로 같을 때 num에 대해 비교한다.

이런 식으로 사용하면 된다.