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

magicdrill·2025년 1월 15일
1

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

현대자동차 모빌리티 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){ 조건문+수행문+반환문....; });

  1. &의 역할: 람다 함수에서 참조를 사용하여 매개변수를 복사하지 않고 원본 데이터를 처리.
  2. const의 이유: 매개변수를 읽기 전용으로 만들어 의도 명확성 및 데이터 불변성을 보장.
  3. &의 사용 범위: 데이터 크기가 큰 자료형(벡터, 문자열 등)에서는 꼭 사용. 일반 자료형(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;
}

0개의 댓글