개발자 과정 기록 및 일기

중앙정보기술인재개발원 개발자 과정 36일차 기록입니다.

킹갓왕동현 2024. 3. 25. 21:13

오늘은 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

이 네가지는 열심히 해서 잘 다루는 것이

앞으로 해야할 일인것 같습니다