현대자동차 모빌리티 SW 개발자 데뷔과정 알고리즘 테스트 3번 문제와 유사한 문제다. 그때는 풀이에 실패했는데, compare 함수 방식과 람다 함수 방식으로 구현할 수 있다.
람다 함수 작성법에 대해 정리한다.
//람다 함수 사용 // 매개변수가 필요해서 compare함수를 만들 경우 전역변수 사용이 필요함 sort(answer.begin(), answer.end(), [&sort_by](const vector<int>& A, const vector<int>& B) { if (sort_by == "code") { return A[0] < B[0]; } else if (sort_by == "date") { return A[1] < B[1]; } else if (sort_by == "maximum"){ return A[2] < B[2]; } else {// sort_by == "remain" return A[3] < B[3]; } });
sort(벡터.begin(), 벡터.end(), [&매개변수](const 자료형 &A, const 자료형 &B){ 조건문+수행문+반환문....; });
- &의 역할: 람다 함수에서 참조를 사용하여 매개변수를 복사하지 않고 원본 데이터를 처리.
- const의 이유: 매개변수를 읽기 전용으로 만들어 의도 명확성 및 데이터 불변성을 보장.
- &의 사용 범위: 데이터 크기가 큰 자료형(벡터, 문자열 등)에서는 꼭 사용. 일반 자료형(int, float 등)에서는 선택적으로 사용 가능.
compare를 안쓰고 람다 함수를 사용하는 이유는 매개변수 전달이 쉽기 때문이다. compare함수를 쓰려면 매개변수를 전역변수에 저장해야 한다. 전역변수는 피하고 싶어서 람다함수로 작성한다.
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
vector<vector<int>> solution(vector<vector<int>> data, string ext, int val_ext, string sort_by) {
vector<vector<int>> answer;
int i, j;
//["코드 번호(code)", "제조일(date)", "최대 수량(maximum)", "현재 수량(remain)"]
//ext의 값이 val_ext보다 작은 데이터만 뽑은 후 sort_by값 기준으로 오름차순 정렬
for(i = 0; i < data.size(); i++){
if(ext == "code"){
if(data[i][0] < val_ext){
answer.push_back(data[i]);
}
}
else if(ext == "date"){
if(data[i][1] < val_ext){
answer.push_back(data[i]);
}
}
else if(ext == "maximum"){
if(data[i][2] < val_ext){
answer.push_back(data[i]);
}
}
else{//ext == "remain"
if(data[i][3] < val_ext){
answer.push_back(data[i]);
}
}
}
cout << "입력 결과\n";
for(auto temp : answer){
for(auto v : temp){
cout << v << " ";
}
cout << "\n";
}
//람다 함수 사용 // 매개변수가 필요해서 compare함수를 만들 경우 전역변수 사용이 필요함
sort(answer.begin(), answer.end(), [&sort_by](const vector<int>& A, const vector<int>& B) {
if (sort_by == "code") {
return A[0] < B[0];
}
else if (sort_by == "date") {
return A[1] < B[1];
}
else if (sort_by == "maximum"){
return A[2] < B[2];
}
else {// sort_by == "remain"
return A[3] < B[3];
}
});
cout << "정렬 결과\n";
for(auto temp : answer){
for(auto v : temp){
cout << v << " ";
}
cout << "\n";
}
return answer;
}