본문 바로가기
IVS/C 프로그래밍

[C++] Vector 정렬하기 - lambda로 비교함수 재정의

by 코곰_ 2025. 1. 7.

참고 문항: [프로그래머스] 데이터분석
https://school.programmers.co.kr/learn/courses/30/lessons/250121

 

#include <bits/stdc++.h>
using namespace std;

vector<vector<int>> solution(vector<vector<int>> data, string ext, int val_ext, string sort_by) {
    map<string, int> ext_idx = {{"code", 0}, {"date", 1}, {"maximum", 2}, {"remain", 3}};
    vector<vector<int>> tmp;

    // data에서 ext 값이 val_ext 보다 작은 데이터만 뽑은 후
    for(auto d: data){
        if(d[ext_idx[ext]] < val_ext){
            tmp.push_back(d);
        }
    }


    // sort_by에 해당하는 값을 기준으로 오름차순으로 정렬
    sort(tmp.begin(), tmp.end(), [&](const auto& a, const auto& b) {
        return a[ext_idx[sort_by]] < b[ext_idx[sort_by]];
    });

    return tmp;
}

 

 

 

sort 함수 동작

  • 정의: std::sort는 C++ 표준 라이브러리에서 제공하는 정렬 함수입니다.
    • 기본적으로, 두 개의 요소를 비교하는 함수(또는 함수 객체)를 사용하여 정렬 순서를 결정합니다.
    • 이 코드는 커스텀 비교 함수로 람다 함수를 사용했습니다.
sort(tmp.begin(), tmp.end(), [&](const auto& a, const auto& b) {
    return a[ext_idx[sort_by]] < b[ext_idx[sort_by]];
});

 

 

 

 

 

 


람다 함수 분석

람다 함수는 익명 함수로, 이 경우 두 개의 데이터 행(ab)를 비교하기 위해 사용되었습니다.

람다 함수의 역할

  1. 입력값: ab는 각각 tmp 벡터의 두 개의 데이터 행입니다.
  2. 예를 들어, a = {1, 20230101, 50, 10}, b = {2, 20230102, 30, 15}일 수 있습니다.
  3. ext_idx[sort_by]를 사용:
    • sort_by 문자열에 따라 어떤 열(column)을 기준으로 비교할지 결정합니다.
    • 예를 들어, sort_by == "date"이면 ext_idx["date"] == 1이므로 각 행의 1번 열 값을 비교합니다.
  4. 비교 조건:
    • a[ext_idx[sort_by]]a 행의 sort_by 열 값입니다.
    • b[ext_idx[sort_by]]b 행의 sort_by 열 값입니다.
    • 두 값을 비교하여 작은 값이 먼저 오도록(오름차순) 합니다.
  5. return a[ext_idx[sort_by]] < b[ext_idx[sort_by]]

[&]는 C++ 람다 함수에서 캡처 리스트(capture list)의 한 종류입니다. 이를 통해 람다 함수가 외부 변수에 접근하는 방식을 지정할 수 있습니다.

 

 

 

 

 


캡처 리스트란?

캡처 리스트는 람다 함수가 함수 외부 스코프에 있는 변수들을 람다 내부에서 사용할 수 있도록 캡처(포획)하는 방법을 지정합니다.

람다 함수의 기본 구조는 아래와 같습니다:

cpp
코드 복사
[캡처 리스트](매개변수 목록) -> 반환형 {
    // 함수 본문
};

 

 

 

 


[&]의 의미

  • [&]모든 외부 변수들을 참조(reference)로 캡처하겠다는 의미입니다.
  • 즉, 람다 함수 내부에서 외부 변수를 직접 참조하여 값을 읽거나 수정할 수 있습니다.

'IVS > C 프로그래밍' 카테고리의 다른 글

[C++] 공백있는 문자열 입력받기 - getline  (2) 2025.01.09
[C++] 중첩 반복문 - continue, break  (0) 2025.01.08
[C++] 포인터  (0) 2025.01.08
[C++] 구조체  (0) 2025.01.08
[C++] scanf로 char형 입력받기  (1) 2025.01.07