Welcome! Everything is fine.

[프로그래머스/Lv.1] PCCE 기출문제 10번 / 데이터 분석 - Java 본문

프로그래머스/Lv.1

[프로그래머스/Lv.1] PCCE 기출문제 10번 / 데이터 분석 - Java

개발곰발 2024. 4. 18.
728x90

📌 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

📌 풀이

데이터를 기준에 맞게 정렬하는 문제였다. 다른 코드들을 보니 람다식과 Comparator가 가장 많이 사용된 것 같다. 내가 작성한 코드의 전체적인 흐름은 다음과 같다.

  • 주어진 ext와 sort_by에 맞는 인덱스 e, s를 구한다.
  • 조건에 맞는 데이터를 넣을 list를 선언한다.
  • data[e]의 값이 val_ext 보다 작을 때만 list에 데이터를 추가한다.
  • sort_by에 해당하는 값을 기준으로 오름차순 정렬한다.
  • list를 int형 배열로 바꾼 후 반환한다.

주어진 ext와 sort_by에 맞는 인덱스 e, s를 구하는 방법은 다양하다. 나는 처음에 switch문 2개를 사용해 구했지만, 불필요하게 코드가 길다. 더 간단한 방법이 많았다.

switch (ext) {
    case "code" :
        e = 0;
        break;
    case "date" :
        e = 1;
        break;
    case "maximum" :
        e = 2;
        break;
    case "remain" :
        e = 3;
        break;
}
        
switch (sort_by) {
    case "code" :
        s = 0;
        break;
    case "date" :
        s = 1;
        break;
    case "maximum" :
        s = 2;
        break;
    case "remain" :
        s = 3;
        break;
}

 

HashMap을 이용하거나 indexOf()를 이용하는 방법도 있었다.

Map<String, Integer> map = new HashMap<>();
map.put("code", 0);
map.put("date", 1);
map.put("maximum", 2);
map.put("remain", 3);
        
int e = map.get(ext);
int s = map.get(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);

 

이렇게 인덱스 값을 구해놓은 뒤, data의 ext값이 val_ex 보다 작으면 list에 해당 데이터를 추가한다.

ArrayList<int[]> list = new ArrayList<>();
for (int[] d : data) {
    if (d[e] < val_ext) list.add(d);
}

 

그리고나서 sort_by를 기준으로 오름차순 정렬한다. ArrayList를 정렬할 때는 Collections.sort()를 사용하고, Comparator를 람다식으로 적어 간단하게 표현했다. 지난 포스팅에서 Comparator를 정리했으니 참고하면 된다.

Collections.sort(list, (o1, o2) -> o1[s] - o2[s]);

 

📌 전체 코드

처음 작성한 코드

import java.util.*;

class Solution {
    int e, s;
    public int[][] solution(int[][] data, String ext, int val_ext, String sort_by) {
        switch (ext) {
            case "code" :
                e = 0;
                break;
            case "date" :
                e = 1;
                break;
            case "maximum" :
                e = 2;
                break;
            case "remain" :
                e = 3;
                break;
        }
        
        switch (sort_by) {
            case "code" :
                s = 0;
                break;
            case "date" :
                s = 1;
                break;
            case "maximum" :
                s = 2;
                break;
            case "remain" :
                s = 3;
                break;
        }
        
        ArrayList<int[]> list = new ArrayList<>();
        for (int[] d : data) {
           if (d[e] < val_ext) {
                list.add(d);
            }
        }
        
        Collections.sort(list, (o1, o2)->{
            return o1[s] - o2[s];
        });
        
        int[][] answer = new int[list.size()][];
        
        for (int i = 0; i < list.size(); i++) {
            answer[i] = list.get(i);
        }
        
        return answer;
    }
}

 

수정한 코드

import java.util.*;

class Solution {
    public int[][] solution(int[][] data, String ext, int val_ext, String sort_by) {
        Map<String, Integer> map = new HashMap<>();
        map.put("code", 0);
        map.put("date", 1);
        map.put("maximum", 2);
        map.put("remain", 3);
        
        int e = map.get(ext);
        int s = map.get(sort_by);
        
        ArrayList<int[]> list = new ArrayList<>();
        for (int[] d : data) {
            if (d[e] < val_ext) list.add(d);
        }
        
        Collections.sort(list, (o1, o2) -> o1[s] - o2[s]);
        
        int[][] answer = new int[list.size()][];
        for (int i = 0; i < answer.length; i++) {
            answer[i] = list.get(i);
        }
        
        return 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;
    }
}