참고 문항: [프로그래머스] 데이터분석
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]];
});
람다 함수 분석
람다 함수는 익명 함수로, 이 경우 두 개의 데이터 행(a
와 b
)를 비교하기 위해 사용되었습니다.
람다 함수의 역할
- 입력값:
a
와b
는 각각tmp
벡터의 두 개의 데이터 행입니다. - 예를 들어,
a = {1, 20230101, 50, 10}
,b = {2, 20230102, 30, 15}
일 수 있습니다. ext_idx[sort_by]
를 사용:sort_by
문자열에 따라 어떤 열(column)을 기준으로 비교할지 결정합니다.- 예를 들어,
sort_by == "date"
이면ext_idx["date"] == 1
이므로 각 행의 1번 열 값을 비교합니다.
- 비교 조건:
a[ext_idx[sort_by]]
는a
행의sort_by
열 값입니다.b[ext_idx[sort_by]]
는b
행의sort_by
열 값입니다.- 두 값을 비교하여 작은 값이 먼저 오도록(오름차순) 합니다.
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 |