Menu
Coddy logo textTech

람다 정렬

Coddy C++ 여정의 로직과 흐름 섹션에 포함된 레슨 — 56개 중 47번째.

C++ 표준 라이브러리는 벡터와 같은 컨테이너를 정렬할 수 있는 <algorithm> 헤더의 std::sort라는 강력한 함수를 제공합니다.

기본적으로, std::sort는 요소를 오름차순(가장 작은 것부터 가장 큰 것 순)으로 정렬합니다. 하지만, 요소가 비교되는 방식을 정의하는 람다 식을 제공하여 이 동작을 사용자 정의할 수 있습니다:

#include <vector>
#include <algorithm>

std::vector<int> numbers = {5, 2, 8, 1, 9};

// 람다를 사용하여 내림차순으로 정렬
std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
    return a > b;  // a가 b보다 앞에 와야 하면 true를 반환
});

람다는 비교되는 요소를 나타내는 두 개의 매개변수를 받으며, 정렬된 결과에서 첫 번째 요소가 두 번째 요소보다 앞에 와야 하는 경우 true를 반환합니다. 내림차순 정렬의 경우, a > b일 때 true를 반환하며, 이는 큰 숫자를 앞에 배치합니다.

이것은 별도의 비교 함수를 작성하지 않고도 람다를 통해 표준 라이브러리 함수를 쉽게 사용자 정의하여, 정렬 로직을 필요한 곳에 바로 유지할 수 있음을 보여줍니다.

challenge icon

챌린지

쉬움

std::sort와 함께 람다 표현식을 사용하여 사용자 정의 정렬을 구현하는 프로그램을 작성하세요. 이 챌린지는 정렬 컨테이너를 위한 사용자 정의 비교 로직을 정의하기 위해 람다 함수를 사용하는 방법을 이해하고 있는지 테스트합니다.

다음과 같은 입력이 제공됩니다:

  • 벡터의 요소 개수를 나타내는 정수 n
  • 정렬할 요소를 나타내는 n개의 정수
  • 정렬 순서를 나타내는 문자 order (오름차순은 A, 내림차순은 D)

프로그램은 다음을 수행해야 합니다:

  1. std::vector<int>를 생성하고 입력받은 숫자들로 채웁니다.
  2. <algorithm> 헤더의 std::sort를 람다 표현식과 함께 사용하여 벡터를 정렬합니다.
  3. 람다는 두 개의 정수 매개변수를 받고 불리언(boolean) 값을 반환해야 합니다.
  4. order 문자에 따라 람다 내에 적절한 비교 로직을 구현합니다.
  5. 정렬된 벡터의 각 요소를 별도의 줄에 출력합니다.

정렬 동작은 다음과 같아야 합니다:

  • orderA인 경우: 오름차순 정렬 (가장 작은 것부터 가장 큰 것 순으로)
  • orderD인 경우: 내림차순 정렬 (가장 큰 것부터 가장 작은 것 순으로)

다음과 같은 정확한 출력 형식을 사용하세요:

[first_sorted_element]
[second_sorted_element]
...
[last_sorted_element]

std::sort는 시작 반복자(iterator), 끝 반복자, 그리고 비교 함수의 세 가지 매개변수를 받는다는 점을 기억하세요. 반복자로는 vector.begin()vector.end()를 사용하세요. 람다 비교 함수는 정렬된 결과에서 첫 번째 매개변수가 두 번째 매개변수보다 앞에 와야 하는 경우 true를 반환해야 합니다. 오름차순의 경우 a < b를 반환하고, 내림차순의 경우 a > b를 반환하세요.

치트 시트

<algorithm> 헤더의 std::sort 함수는 벡터와 같은 컨테이너를 정렬합니다. 기본적으로 오름차순으로 정렬하지만, 람다 표현식을 사용하여 정렬 동작을 사용자 정의할 수 있습니다.

기본 구문:

std::sort(container.begin(), container.end(), comparison_lambda);

람다는 비교되는 요소를 나타내는 두 개의 매개변수를 받으며, 정렬된 결과에서 첫 번째 요소가 두 번째 요소보다 앞에 와야 하는 경우 true를 반환합니다.

예제 - 내림차순:

#include <algorithm>
#include <vector>

std::vector<int> numbers = {5, 2, 8, 1, 9};

std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
    return a > b;  // 큰 숫자가 먼저 옵니다
});

예제 - 오름차순:

std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
    return a < b;  // 작은 숫자가 먼저 옵니다
});

직접 해보기

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    // 입력 읽기
    int n;
    cin >> n;
    
    vector<int> numbers(n);
    for (int i = 0; i < n; i++) {
        cin >> numbers[i];
    }
    
    char order;
    cin >> order;
    
    // TODO: 아래에 코드를 작성하세요
    // 람다 식과 std::sort를 사용하여 벡터를 정렬하세요
    // 정렬 문자(A는 오름차순, D는 내림차순)를 기준으로 합니다
    
    // 정렬된 요소 출력
    for (int num : numbers) {
        cout << num << endl;
    }
    
    return 0;
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

로직과 흐름의 모든 레슨