프로그래머스 코딩테스트 Java Lv.1 - [PCCE 기출문제] 10번 / 데이터 분석
문제
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 함수를 완성해 주세요. 단, 조건을 만족하는 데이터는 항상 한 개 이상 존재합니다.
나의 풀이 (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; } }
접근 방식✨
- 문제를 정확하게 파악하는 시간 가지기
data
에서ext
값이val_ext
보다 작은 데이터만 뽑은 후,sort_by
에 해당하는 값을 기준으로 오름차순으로 정렬하여 return 하도록 solution 함수를 완성해 주세요.→ ext값이 val_ext보다 작은 데이터만 1차로 걸러낸 뒤에, sort_by 값을 기준으로 데이터를 오름차순으로 정렬하는 문제라는 것을 알 수 있다.
즉, 데이터를 걸러내기 위한 기준 데이터, 걸러낸 데이터를 정렬하기 위한 기준 데이터가 필요하다는 것을 파악할 수 있다.
- 데이터를 걸러내는 것은 어렵지 않았다. for{ if() } 형식으로 데이터를 하나씩 탐색하면서 데이터를 걸러냈다. (비효율적인 접근 방식이라는 생각이 들었지만 이 방법밖에 생각이 안 났음….)
* if가 비효율적인 이유는? 빅오(O) 표기법을 다시 복습해본당@!!!
- 데이터를 정렬해야 하는데 람다(lambda) 말고 떠오르지 않았다… 왜냐면 List 안의 요소를 직접 정렬하는 게 아니라 리스트 안의 배열의 i 번째 요소를 기준으로 정렬해야 했기 때문!
하지만 난 아직 람다를 모르기 때문에… chatGPT의 도움을 빌릴 수 밖에 없었다!
다른 사람의 풀이와 비교
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을 반환느낀점
- 무조건!!!!! 람다를 정복해야겠다… 이번 주말까지 람다로 정렬, 프린트, 검색 기능은 무조건 마스터한다!!! 😤😤😤
- 사실 서탈할거라 예상했던 곳에서 코딩테스트 안내 메일을 받아서 매우 기분이 좋다.. 그래서 열심히 할거다!!!
- 주말 안으로 자료 구조도 마스터하자!!
뽜이팅~!!! 🔥🔥🔥