class Product {
int code;
int date;
int maximum;
int remain;
public Product(int code, int date, int maximum, int remain) {
this.code = code;
this.date = date;
this.maximum = maximum;
this.remain = remain;
}
// Getter 메서드들...
}
Product 객체를 생성한 후에 조건에 맞는 product만을 선별을 해야한다.
그리고 sort_by에 맞는 정렬 기준을 생성해준다.
for(int i = 0; i < data.length; i++) {
Product product = new Product(data[i][0],data[i][1],data[i][2],data[i][3]);
productCheck(product, ext, val_ext, sort_by);
}
public void productCheck(Product product, String ext, int val_ext, String sort_by) {
switch(ext) {
case "code" :
if(product.code < val_ext) {
products.add(product);
}
break;
case "date" :
if(product.date < val_ext) {
products.add(product);
}
break;
case "maximum" :
if(product.maximum < val_ext) {
products.add(product);
}
break;
case "remain" :
if(product.remain < val_ext) {
products.add(product);
}
break;
}
switch(sort_by) {
case "code" : comparator = Comparator.comparingInt(Product::getCode); break;
case "date" : comparator = Comparator.comparingInt(Product::getDate); break;
case "maximum" : comparator = Comparator.comparingInt(Product::getMaximum); break;
case "remain" : comparator = Comparator.comparingInt(Product::getRemain); break;
}
}
그 후 Collections.sort(products, comparator)로 정렬을 해준 뒤 answer 배열에 데이터를 넣어준 뒤 반환하면 된다.
전체 코드
import java.util.*;
class Solution {
static List<Product> products;
static Comparator<Product> comparator;
public int[][] solution(int[][] data, String ext, int val_ext, String sort_by) {
int[][] answer = {};
products = new ArrayList<>();
for(int i = 0; i < data.length; i++) {
Product product = new Product(data[i][0],data[i][1],data[i][2],data[i][3]);
productCheck(product, ext, val_ext, sort_by);
}
Collections.sort(products, comparator);
answer = new int[products.size()][4];
for(int i = 0; i < products.size(); i++) {
answer[i][0] = products.get(i).getCode();
answer[i][1] = products.get(i).getDate();
answer[i][2] = products.get(i).getMaximum();
answer[i][3] = products.get(i).getRemain();
}
return answer;
}
public void productCheck(Product product, String ext, int val_ext, String sort_by) {
switch(ext) {
case "code" :
if(product.code < val_ext) {
products.add(product);
}
break;
case "date" :
if(product.date < val_ext) {
products.add(product);
}
break;
case "maximum" :
if(product.maximum < val_ext) {
products.add(product);
}
break;
case "remain" :
if(product.remain < val_ext) {
products.add(product);
}
break;
}
switch(sort_by) {
case "code" : comparator = Comparator.comparingInt(Product::getCode); break;
case "date" : comparator = Comparator.comparingInt(Product::getDate); break;
case "maximum" : comparator = Comparator.comparingInt(Product::getMaximum); break;
case "remain" : comparator = Comparator.comparingInt(Product::getRemain); break;
}
}
class Product {
int code;
int date;
int maximum;
int remain;
public Product(int code, int date, int maximum, int remain) {
this.code = code;
this.date = date;
this.maximum = maximum;
this.remain = remain;
}
public int getCode() {
return code;
}
public int getDate() {
return date;
}
public int getMaximum() {
return maximum;
}
public int getRemain() {
return remain;
}
}
}
객체를 만들어서 풀어보려고 했다. 하지만 정렬 기준 세우는 로직과 answer에 값을 담는 로직이 맘에 들지 않아
다른 사람의 풀이법을 찾아봤다.
내가 저렇게 길게 풀이한 코드가 이렇게 짧게 나올 수 있다니 좀 놀랐다.
import java.util.*;
class Solution {
public int[][] solution(int[][] data, String ext, int val_ext, String sort_by) {
String[] arr = {"code","date","maximum","remain"};
List<String> columnList = Arrays.asList(arr);
int extIdx = columnList.indexOf(ext);
int sortIdx = columnList.indexOf(sort_by);
int[][] answer = Arrays.stream(data).filter(o1 -> o1[extIdx] < val_ext)
.sorted((o1 ,o2) -> o1[sortIdx]-o2[sortIdx]).toArray(int[][]::new);
return answer;
}
}