[PCCE 기출문제] 10번 / 데이터 분석 도움말
AI 엔지니어인 현식이는 데이터를 분석하는 작업을 진행하고 있습니다. 데이터는 ["코드 번호(code)", "제조일(date)", "최대 수량(maximum)", "현재 수량(remain)"]으로 구성되어 있으며 현식이는 이 데이터들 중 조건을 만족하는 데이터만 뽑아서 정렬하려 합니다.
예를 들어 다음과 같이 데이터가 주어진다면
data = [[1, 20300104, 100, 80], [2, 20300804, 847, 37], [3, 20300401, 10, 8]]
이 데이터는 다음 표처럼 나타낼 수 있습니다.
code | date | maximum | remain |
---|---|---|---|
1 | 20300104 | 100 | 80 |
2 | 20300804 | 847 | 37 |
3 | 20300401 | 10 | 8 |
주어진 데이터 중 "제조일이 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
}