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

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

AI 엔지니어인 현식이는 데이터를 분석하는 작업을 진행하고 있습니다. 데이터는 ["코드 번호(code)", "제조일(date)", "최대 수량(maximum)", "현재 수량(remain)"]으로 구성되어 있으며 현식이는 이 데이터들 중 조건을 만족하는 데이터만 뽑아서 정렬하려 합니다.

예를 들어 다음과 같이 데이터가 주어진다면

data = [[1, 20300104, 100, 80], [2, 20300804, 847, 37], [3, 20300401, 10, 8]]

이 데이터는 다음 표처럼 나타낼 수 있습니다.

codedatemaximumremain
12030010410080
22030080484737
320300401108

주어진 데이터 중 "제조일이 20300501 이전인 물건들을 현재 수량이 적은 순서"로 정렬해야 한다면 조건에 맞게 가공된 데이터는 다음과 같습니다.

data = [[3,20300401,10,8],[1,20300104,100,80]]

정렬한 데이터들이 담긴 이차원 정수 리스트 data와 어떤 정보를 기준으로 데이터를 뽑아낼지를 의미하는 문자열 ext, 뽑아낼 정보의 기준값을 나타내는 정수 val_ext, 정보를 정렬할 기준이 되는 문자열 sort_by가 주어집니다.

data에서 ext 값이 val_ext보다 작은 데이터만 뽑은 후, sort_by에 해당하는 값을 기준으로 오름차순으로 정렬하여 return 하도록 solution 함수를 완성해 주세요. 단, 조건을 만족하는 데이터는 항상 한 개 이상 존재합니다.

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


import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

public class Main19 {
    public static void main(String[] args) {
        int[][] data = {{1, 20300104, 100, 80}, {2, 20300804, 847, 37}, {3, 20300401, 10, 8}};
        String ext = "date";
        int val_ext = 20300501;
        String sort_by = "remain";

        var reuslt = solution(data, ext, val_ext, sort_by);

        System.out.println(Arrays.deepToString(reuslt));
    }

    public static int[][] solution(int[][] data, String ext, int val_ext, String sort_by) {

        return new Table(data)
                .filter(Ext.valueOf(ext), val_ext)
                .sort(Ext.valueOf(sort_by))
                .result();
    }

}

class Table {
    List<Data> data = new ArrayList<>();

    Table(int[][] data) {
        for (int[] row : data) {
            this.data.add(new Data(row[0], row[1], row[2], row[3]));
        }
    }

    public Table filter(Ext ext, int val_ext) {
        switch (ext) {
            case code:
                data = data.stream().filter(data1 -> data1.code == val_ext).collect(Collectors.toCollection(ArrayList::new));
                break;

            case maximum:
                data = data.stream().filter(data1 -> data1.maximum < val_ext).collect(Collectors.toCollection(ArrayList::new));
                break;

            case remain:
                data = data.stream().filter(data1 -> data1.remain < val_ext).collect(Collectors.toCollection(ArrayList::new));
                break;

            case date:
                data = data.stream().filter(data1 -> data1.date < val_ext).collect(Collectors.toCollection(ArrayList::new));
                break;

        }
        return this;
    }

    public Table sort(Ext ext) {
        switch (ext) {
            case code:
                this.data.sort(Comparator.comparingInt(o -> o.code));
                break;
            case date:
                this.data.sort(Comparator.comparingInt(o -> o.date));
                break;
            case remain:
                this.data.sort(Comparator.comparingInt(o -> o.remain));
                break;
            case maximum:
                this.data.sort(Comparator.comparingInt(o -> o.maximum));
                break;
        }

        return this;
    }

    public int[][] result() {

        int length = data.size();
        int[][] temp = new int[length][4];

        for (int i = 0; i < length; i++) {
            temp[i][0] = data.get(i).code;
            temp[i][1] = data.get(i).date;
            temp[i][2] = data.get(i).maximum;
            temp[i][3] = data.get(i).remain;

        }

        return temp;
    }
}

class Data {
    int code;
    int date;
    int maximum;
    int remain;


    public Data(int code, int date, int maximum, int remain) {
        this.code = code;
        this.date = date;
        this.maximum = maximum;
        this.remain = remain;
    }
}

enum Ext {
    code, date, maximum, remain
}