오늘은 Exception 에 대해서 배웠고,
워낙 쉬운 개념이어서 하루만에 끝났습니다.
그래서 이것에 대한 언급은 딱히 할 게 없고,
그 외에,
오늘은 어떤 문제를 어렵게 어렵게 풀었는데,
훨씬 가독성 좋은 풀이를 보고,
이것에 대해 기록을 남기면서
머릿속에 기억으로 좀 남기고자 합니다.
일단 문제는 아래의 링크를 보시면 됩니다.
프로그래머스 : [PCCE 기출문제] 10번 / 데이터 분석
그리고 아래는 제가 작성한 코드입니다.
아무래도 이해 안될 것 같아서 주석을 좀 달았습니다.
중요한 건 이 코드가 아니니,
이해가 안된다면 넘어가셔도 됩니다.
↓↓↓정답 스포일러 주의!!!
import java.util.*;
class Solution {
public int[][] solution(int[][] data, String ext, int val_ext, String sort_by) {
DataAnalyze analyze = new DataAnalyze(data, ext, sort_by);
// main 이 지저분해지는 걸 방지하기 위해 별도의 클래스를 만든 뒤 객체 생성.
Map<Integer, int[]> map = new HashMap<>();
// sort_by 에서 얻어온 key 값으로 value 를 정렬하기 위해 map 생성.
for (int i = 0; i < data.length; i++) {
if (analyze.standardize(i) < val_ext) {
map.put(data[i][analyze.sortBy()], data[i]);
}
}
// 반복문을 이용해 analyze.standardize(i) 와 val_ext 를 비교한 뒤 true 만 map 에 추가.
int[][] answer = new int[map.size()][4];
// 정답 제출을 위한 변수 생성 및 범위 할당.
List<Integer> keySet = new ArrayList<>(map.keySet());
Collections.sort(keySet);
// Collection.sort 메소드를 이용해 map 을 오름차순 정렬.
int idx = 0;
for (Integer key : keySet) {
answer[idx] = map.get(key);
idx++;
}
// 향상된 for 문을 이용해 key 값을 map.get() 에 인자로 넣어줘서 value 값 받아오고,
// 그것을 answer[] 에 할당.
return answer;
}
}
class DataAnalyze {
// standardize() 는 ext 의 값을 비교하기 위한 스위치 문,
// sortBy() 는 return 값을 int 로 받아오기 위한 스위치 문.
private String ext;
private int[][] data;
private String sort_by;
public DataAnalyze (int[][] data, String ext, String sort_by){
this.data = data;
this.ext = ext;
this.sort_by = sort_by;
}
public int standardize(int i) {
switch (this.ext) {
case "code" -> {
return data[i][0];
}
case "date" -> {
return data[i][1];
}
case "maximum" -> {
return data[i][2];
}
case "remain" -> {
return data[i][3];
}
}
return 0;
}
public int sortBy() {
switch (this.sort_by) {
case "code" -> {
return 0;
}
case "date" -> {
return 1;
}
case "maximum" -> {
return 2;
}
case "remain" -> {
return 3;
}
}
return 0;
}
}
아래는 좋아요 1위의 답안입니다.
↓↓↓정답 스포일러 주의!!!
import java.util.*;
class Solution {
public int[][] solution(int[][] data, String ext, int val_ext, String sort_by) {
String[] arr = {"code","date","maximum","remain"};
// ext 와 sort_by 를 int 로써 비교에 쓰기 위해서 배열 생성 및 할당.
List<String> columnList = Arrays.asList(arr);
// 이건 위 코드에서 한 줄로 작성해도 되지만 가독성을 위해서 끊어서 생성한 것으로 보임.
int extIdx = columnList.indexOf(ext);
int sortIdx = columnList.indexOf(sort_by);
// 생성했던 List 를 이용해 ext 와 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 변수에 담아준 것으로 보이고,
// answer 배열을 stream 으로 바꿔준 뒤, filter 를 이용해 ext 보다 작은 값만 걸러내고,
// sorted 를 이용해 sort 의 인덱스를 저장했던 sortIdx 끼리 비교해서 오름차순 정렬하고,
// 그것을 변수 타입에 맞게 int[][] 배열로 변경.
return answer;
}
}
역시 이해를 돕기 위해 주석을 달아봤는데,
솔직히 주석 없어도 될 것 같습니다.
성능은 많이 느리지만,
그럼에도 가독성이 너무 사기적으로 좋아서
그것만으로 가치가 충분한 것 같고,
stream, map, list, set
이 네가지는 열심히 해서 잘 다루는 것이
앞으로 해야할 일인것 같습니다
'개발자 과정 기록 및 일기' 카테고리의 다른 글
중앙정보기술인재개발원 개발자 과정 38일차 기록입니다. (1) | 2024.03.28 |
---|---|
중앙정보기술인재개발원 개발자 과정 37일차 기록입니다. (0) | 2024.03.27 |
오늘의 기록입니다. (0) | 2024.03.25 |
중앙정보기술인재개발원 개발자 과정 35일차 기록입니다. (0) | 2024.03.24 |
중앙정보기술인재개발원 개발자 과정 34일차 기록입니다. (0) | 2024.03.22 |