1 minute read

일반적인 정렬

vector<int> v = {1,3,2};
sort(v.begin(), v.end());

위와 같은 방식으로 정렬하면 1 2 3으로 오름차순 정렬한다.

만약 내림차순으로 정렬하고 싶다면 어떻게 해야할까?

sort 함수를 확인해보면 인자가 세 개인 경우가 하나 더 오버로딩 되어있다. 세 번째 인자에는 Compare comp와 같은 콜백 함수를 넣어줄 수 있다. 오름차순으로 정렬하기 위해서는

sort(v.begin(), v.end(), greater<>()를 넣어주면 된다.

lambda를 이용한 정렬

int arr[3][3] = {
    {0, 0, 3},
    {1, 0, 0},
    {0, 2, 0}
};

vector<pair<int,int>> v;

int main()
{
    v.push_back({0, 2});
    v.push_back({1, 0});
    v.push_back({2, 1});
}

3x3 배열이 있을 때, arr[i][j] 가 0이 아닌 원소를 가지고 있을 때의 i, j를 담은 vector v가 있다고 하자. 만약 v를 arr[i][j] 의 값을 기준으로 내림차순 정렬하고 싶다면 어떻게 할까?

이럴 때는 아래와 같이 C++의 lambda를 사용할 수 있다.

sort(v.begin(), v.end(), [](pair<int,int> a, pair<int, int> b)->bool {return arr[a.first][a.second] > arr[b.first][b.second];});

전체 코드

int arr[3][3] = {
    {0, 0, 3},
    {1, 0, 0},
    {0, 2, 0}
};

vector<pair<int,int>> v;

int main()
{
    v.push_back({0, 2});
    v.push_back({1, 0});
    v.push_back({2, 1});
    cout << "정렬하기 전" << endl;

    for (auto c : v)
    {
        cout << c.first << ' ' << c.second << ' ' <<arr[c.first][c.second] << endl;
    }
    cout << endl;

    sort(v.begin(), v.end(), [](pair<int,int> a, pair<int, int> b)->bool {return arr[a.first][a.second] > arr[b.first][b.second];});
    
    cout << "정렬한 후 " << endl;

    for (auto c : v)
    {
         cout << c.first << ' ' << c.second << ' ' <<arr[c.first][c.second] << endl;
    }

    return 0;
}

Tags:

Categories:

Updated: