이 문제를 풀면서 람다함수에 대해 알게되었다.
기존에는 간단한 비교만 해봐서 그냥 sort()함수 안에 커스텀 정렬함수를 넣었었는데, 이 문제를 풀며 다른 풀이 방식을 알게되었다.
[풀이 1]
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
bool cmp(vector<int> x, vector<int> y, int stmp) {
return x[stmp] < y[stmp];
}
vector<vector<int>> solution(vector<vector<int>> data, string ext, int val_ext, string sort_by) {
vector<vector<int>> answer;
int tmp = 0;
if (ext == "date") tmp = 1;
else if (ext == "maximum") tmp = 2;
else if (ext == "remain") tmp = 3;
int stmp = 0;
if (sort_by == "date") stmp = 1;
else if (sort_by == "maximum") stmp = 2;
else if (sort_by == "remain") stmp = 3;
for(int i=0; i<data.size(); i++) {
if (data[i][tmp] < val_ext) answer.push_back(data[i]);
}
sort(answer.begin(), answer.end(), [stmp](vector<int> x, vector<int> y) {
return cmp(x, y, stmp);
});
return answer;
}
c++은 함수안에 함수를 선언할 수 없다.
따라서 전역에 함수를 선언한다.
람다 함수 내에서 외부 변수를 사용하려면 캡처 리스트에 해당 변수를 포함시켜야만 한다.
sort(answer.begin(), answer.end(), [stmp](vector<int> x, vector<int> y) {
return cmp(x, y, stmp);
});
[stmp] → stmp 변수를 람다 함수 안에서 사용할 수 있도록 캡처
(vector x, vector y) → 정렬할 두 원소를 받음
{ return cmp(x, y, stmp); } → cmp 함수 호출
이 방법이 낯설다면 stmp를 전역 변수로 선언하면 된다.
[풀이 2]
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int stmp; // 전역 변수로 선언
bool cmp(vector<int> x, vector<int> y) {
return x[stmp] < y[stmp];
}
vector<vector<int>> solution(vector<vector<int>> data, string ext, int val_ext, string sort_by) {
vector<vector<int>> answer;
int tmp = 0;
if (ext == "date") tmp = 1;
else if (ext == "maximum") tmp = 2;
else if (ext == "remain") tmp = 3;
if (sort_by == "date") stmp = 1;
else if (sort_by == "maximum") stmp = 2;
else if (sort_by == "remain") stmp = 3;
for (int i = 0; i < data.size(); i++) {
if (data[i][tmp] < val_ext) {
answer.push_back(data[i]);
}
}
sort(answer.begin(), answer.end(), cmp);
return answer;
}