문제/프로그래머스

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

icodesiuuuu 2024. 11. 22. 01:57

문제

https://school.programmers.co.kr/learn/courses/30/lessons/250121

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 


 

문제 개요

현식이는 주어진 데이터를 분석하고, 특정 조건을 만족하는 데이터를 필터링하고 정렬하는 작업을 진행하고 있습니다. 주어진 데이터는 각 행이 네 개의 값으로 이루어져 있으며, 각 값은 "코드 번호(code)", "제조일(date)", "최대 수량(maximum)", "현재 수량(remain)" 을 의미합니다. 현식이는 이 데이터를 기반으로 다음과 같은 작업을 해야 합니다:

  1. 특정 열(ext 기준)의 값이 주어진 기준값(val_ext)보다 작은 데이터만 추출해야 합니다.
  2. 조건에 맞는 데이터를 주어진 기준(sort_by)에 맞춰 오름차순으로 정렬해야 합니다.

 

접근 방법

이 문제는 주어진 데이터에서 특정 조건을 만족하는 데이터를 필터링하고, 그 후 주어진 기준에 따라 데이터를 정렬하여 결과를 반환하는 문제입니다. 이를 해결하기 위한 접근 방법은 다음과 같습니다:

1. 데이터 필터링

  • 문제에서 주어진 ext와 val_ext를 이용해 데이터를 필터링합니다. ext는 필터링할 데이터의 열을 나타내며, val_ext는 필터링 기준 값입니다.
  • 예를 들어, ext가 "date"이고 val_ext가 20300501이라면, date 열의 값이 20300501보다 작은 데이터들만 남깁니다.

2. 필터링 기준 찾기

  • ext 값에 따라 target 변수를 설정하여, 해당 열의 인덱스를 알 수 있습니다. target은 ext가 "code"이면 0, "date"이면 1, "maximum"이면 2, "remain"이면 3에 대응됩니다.
  • 이를 위해 if-else 조건문을 사용하여 target 값을 설정합니다.

3. 데이터 필터링 및 추가

  • 데이터 배열을 순회하면서 각 행의 target 열 값이 val_ext보다 작은지 확인합니다. 조건을 만족하는 데이터는 list에 추가합니다.

4. 데이터 정렬

  • 조건을 만족하는 데이터를 필터링한 후, 이제 sort_by 기준으로 정렬을 해야 합니다. sort_by에 해당하는 열을 기준으로 오름차순 정렬을 수행합니다.
import java.util.*;
class Solution {
    public int[][] solution(int[][] data, String ext, int val_ext, String sort_by) {        
        List<int[]> list = new ArrayList<>();
        
        int target = -1;
        if(ext.equals("code")) target = 0;
        if(ext.equals("date")) target = 1;
        if(ext.equals("maximum")) target = 2;
        if(ext.equals("remain")) target = 3;
        
        for(int i=0; i<data.length; i++) {
            if(data[i][target] < val_ext) list.add(data[i]);
        }
        
        Collections.sort(list, (o1, o2) -> {
            if(sort_by.equals("code")) return o1[0] - o2[0];
            if(sort_by.equals("date")) return o1[1] - o2[1];
            if(sort_by.equals("maximum")) return o1[2] - o2[2];
            if(sort_by.equals("remain")) return o1[3] - o2[3];
            return o1[0] - o2[0];
        });
        
        int[][] answer = new int[list.size()][4];
        for(int i=0; i<answer.length; i++) {
            answer[i] = list.get(i);
        }
        
        return answer;
    }
}