[프로그래머스] PCCE 기출문제: 10번 / 데이터 분석 - c++

삼식이·2025년 4월 1일
0

알고리즘

목록 보기
40/81

[PCCE 기출문제] 10번 / 데이터 분석

이 문제를 풀면서 람다함수에 대해 알게되었다.

기존에는 간단한 비교만 해봐서 그냥 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;
}

0개의 댓글