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

#프로그래머스 #programmers #코딩테스트 #자바 #자바코딩테스트
jeenie's avatar
Oct 11, 2024
프로그래머스 코딩테스트 Java Lv.1 - [PCCE 기출문제] 10번 / 데이터 분석
  1. 문제

    AI 엔지니어인 현식이는 데이터를 분석하는 작업을 진행하고 있습니다. 데이터는 ["코드 번호(code)", "제조일(date)", "최대 수량(maximum)", "현재 수량(remain)"]으로 구성되어 있으며 현식이는 이 데이터들 중 조건을 만족하는 데이터만 뽑아서 정렬하려 합니다.

    예를 들어 다음과 같이 데이터가 주어진다면

    data = [[1, 20300104, 100, 80], [2, 20300804, 847, 37], [3, 20300401, 10, 8]]

    이 데이터는 다음 표처럼 나타낼 수 있습니다.

    code

    date

    maximum

    remain

    1

    20300104

    100

    80

    2

    20300804

    847

    37

    3

    20300401

    10

    8

    주어진 데이터 중 "제조일이 20300501 이전인 물건들을 현재 수량이 적은 순서"로 정렬해야 한다면 조건에 맞게 가공된 데이터는 다음과 같습니다.

    data = [[3,20300401,10,8],[1,20300104,100,80]]

    정렬한 데이터들이 담긴 이차원 정수 리스트 data와 어떤 정보를 기준으로 데이터를 뽑아낼지를 의미하는 문자열 ext, 뽑아낼 정보의 기준값을 나타내는 정수 val_ext, 정보를 정렬할 기준이 되는 문자열 sort_by가 주어집니다.

    data에서 ext 값이 val_ext보다 작은 데이터만 뽑은 후, sort_by에 해당하는 값을 기준으로 오름차순으로 정렬하여 return 하도록 solution 함수를 완성해 주세요. 단, 조건을 만족하는 데이터는 항상 한 개 이상 존재합니다.

  1. 나의 풀이 (chat GPT와 함께한 풀이..)

    import java.util.ArrayList;
    
    class Solution {
        public int[][] solution(int[][] data, String ext, int val_ext, String sort_by) {
            ArrayList<int[]> temp = new ArrayList<>();
    
            int std = getStd(ext);
    
            for (int i = 0; i < data.length; i++) {
                if(data[i][std] <= val_ext){
                    temp.add(data[i]);
                }
            }
    
            std = getStd(sort_by);
    
            final int final_std = std;
            temp.sort((a, b) -> Integer.compare(a[final_std], b[final_std]));
    
            int[][] answer = temp.toArray(new int[temp.size()][]);
    
            return answer;
        }
        
            private static int getStd(String str) {
    
            int std = 0;
            if(str.equals("date")){
                std = 1;
            }else if(str.equals("maximum")){
                std = 2;
            }else if(str.equals("remain")){
                std = 3;
            }
            return std;
        }
    }

  1. 접근 방식✨

    - 문제를 정확하게 파악하는 시간 가지기

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

    → ext값이 val_ext보다 작은 데이터만 1차로 걸러낸 뒤에, sort_by 값을 기준으로 데이터를 오름차순으로 정렬하는 문제라는 것을 알 수 있다.

    즉, 데이터를 걸러내기 위한 기준 데이터, 걸러낸 데이터를 정렬하기 위한 기준 데이터가 필요하다는 것을 파악할 수 있다.

    - 데이터를 걸러내는 것은 어렵지 않았다. for{ if() } 형식으로 데이터를 하나씩 탐색하면서 데이터를 걸러냈다. (비효율적인 접근 방식이라는 생각이 들었지만 이 방법밖에 생각이 안 났음….)

    * if가 비효율적인 이유는? 빅오(O) 표기법을 다시 복습해본당@!!!

    - 데이터를 정렬해야 하는데 람다(lambda) 말고 떠오르지 않았다… 왜냐면 List 안의 요소를 직접 정렬하는 게 아니라 리스트 안의 배열의 i 번째 요소를 기준으로 정렬해야 했기 때문!

    하지만 난 아직 람다를 모르기 때문에… chatGPT의 도움을 빌릴 수 밖에 없었다!

  2. 다른 사람의 풀이와 비교

            String[] arr = {"code","date","maximum","remain"};
            List<String> columnList = Arrays.asList(arr);
            int extIdx = columnList.indexOf(ext);
            int sortIdx = columnList.indexOf(sort_by);

    이 부분 신기했다. 나는 함수로 구현했는데. list.indexOf(str)라는 함수는 사용해 본 적 없다.
    Object를 파라미터로 받기 때문에 어떤 데이터든 비교할 수 있고, 같은 값 중 가장 첫 번째 인덱스 값을 반환한다. 같은 값이 없으면 -1을 반환

  3. 느낀점

    - 무조건!!!!! 람다를 정복해야겠다… 이번 주말까지 람다로 정렬, 프린트, 검색 기능은 무조건 마스터한다!!! 😤😤😤

    - 사실 서탈할거라 예상했던 곳에서 코딩테스트 안내 메일을 받아서 매우 기분이 좋다.. 그래서 열심히 할거다!!!

    - 주말 안으로 자료 구조도 마스터하자!!

뽜이팅~!!! 🔥🔥🔥

Share article

ricota-cheeze