우당탕탕 개발일지

[프로그래머스] 데이터 분석(Java, Level.1) 본문

코테/프로그래머스

[프로그래머스] 데이터 분석(Java, Level.1)

ujin302 2024. 7. 9. 11:52
반응형

문제

data : 정렬한 데이터들이 담긴 이차원 정수 리스트

data[i] : 코드 번호(code), 제조일(date), 최대 수량(maximum), 현재 수량(remain)
data[i][1] : 제조일은 yyyyMMdd로 표현함.
ext : 어떤 정보를 기준으로 데이터를 뽑아낼지를 의미하는 문자열
val_ext : 뽑아낼 정보의 기준값을 나타내는 정수
ort_by : 정보를 정렬할 기준이 되는 문자열

 

data에서 ext 값이 val_ext보다 작은 데이터만 뽑은 후,
sort_by에 해당하는 값을 기준으로 오름차순으로 정렬하여
return 하도록 solution 함수를 완성해 주세요.

 

입출력 예

 

 

처음 내 코드...! 

풀긴했으나.... 사실 넘 허접함 ㅎ ㅋㅋㅋ

 

그래도 혼자 힘으로 풀어보고 싶어서 일단 해봄! 

고민 1. HashMap 사용해서 Key값을 가지고 인덱스 번호를 가지고 올까? 

고민 2. Arrays.sort(array, (o1, o2) -> o1[변수] - o2[변수]) 이 부분에서 변수 대입하면 오류발생... 왜.... ㅠㅠㅠ 

>> 이래서 고민 1를 그냥 swith case로 변경... ㅎ 

 

고민 3. 배열 크기 변경은 어캄...... 

>> 배열 다시 잡는걸로 해결함 

 

이러한 고민들로 탄생한 코드!

int[][] answer = new int[data.length][data[0].length];
        int indexExt = 0;
        int count = 0;

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

        for (int i = 0; i < data.length; i++) {
            if (data[i][indexExt] < val_ext) {
                answer[count] = data[i];
                count++;
            }
        }
        answer = Arrays.copyOf(answer, count);

        // 정렬
        switch (sort_by) {
            case "code":
                Arrays.sort(answer, (o1, o2) -> o1[0] - o2[0]);
                break;
            case "date":
                Arrays.sort(answer, (o1, o2) -> o1[1] - o2[1]);
                break;
            case "maximum":
                Arrays.sort(answer, (o1, o2) -> o1[2] - o2[2]);
                break;
            case "remain":
                Arrays.sort(answer, (o1, o2) -> o1[3] - o2[3]);
                break;
        }

        return answer;

 

하지만 위의 코드가 넘 허접한게 넘 느껴짐... (통과는 했지만...ㅋㅋㅋ)

 

그래서 다른 사람 풀이 참고했더니 sort부분에 변수 값을 final로 지정하면 된다...! 

(이거때매 쓸데없이 switch case로 했는데..ㅋㅋㅋ )

 

상수가 들어가야 해서 final로 지정하면 되는거였다..... 

사실 너무 당연한 생각인데 왜 이걸 생각을 못했는지... ㅠㅠ 

 

 

최종 코드의 풀이

1. 변수 설명

answer : 반환값 

valueList : 주어진 문구 4개를 List 형태로 저장

ArrayList : 조건에 알맞는 원소 저장

sortIndex : 정렬해야 하는 Index 번호을 상수로 저 

 

2. val_ext

주어진 상수 val_ext 보다 작은 원소만 resultList에 저장 

 

3. 정렬

resultList을 배열 answer에 저장 

answer 오름차순 정렬  

>> 이때 sortIndex을 final 변수로 설정하여 상수로 사용할 수 있도록 해야 오류 발생하지 않음..!!! 

 

 

코드 

public static int[][] solution6_1(int[][] data, String ext, int val_ext, String sort_by) {
        int[][] answer = {};
        List<String> valeList = Arrays.asList(new String[] { "code", "date", "maximum", "remain" });
        ArrayList<int[]> resultList = new ArrayList<>();
        final int sortIndex = valeList.indexOf(sort_by);

        for (int[] d : data) {
            if (d[valeList.indexOf(ext)] < val_ext) {
                resultList.add(d);
            }
        }

        answer = resultList.toArray(new int[resultList.size()][data[0].length]);
        Arrays.sort(answer, (o1, o2) -> o1[sortIndex] - o2[sortIndex]);

        return answer;
    }

 

프로그래머스 문제

https://school.programmers.co.kr/learn/courses/30/lessons/250121

 

프로그래머스

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

programmers.co.kr

 

반응형