inblog logo
|
ricota-cheeze
    coding-test

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

    #프로그래머스 #programmers #코딩테스트 #자바 #자바코딩테스트
    jeenie's avatar
    jeenie
    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

    RSS·Powered by Inblog