[PCCE 기출문제] 10번 / 데이터 분석
https://school.programmers.co.kr/learn/courses/30/lessons/250121
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제설명
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 ≤ data의 길이 ≤ 500
- data[i]의 원소는 [코드 번호(code), 제조일(date), 최대 수량(maximum), 현재 수량(remain)] 형태입니다.
- 1 ≤ 코드 번호≤ 100,000
- 20000101 ≤ 제조일≤ 29991231
- data[i][1]은 yyyymmdd 형태의 값을 가지며, 올바른 날짜만 주어집니다. (yyyy : 연도, mm : 월, dd : 일)
- 1 ≤ 최대 수량≤ 10,000
- 1 ≤ 현재 수량≤ 최대 수량
- ext와 sort_by의 값은 다음 중 한 가지를 가집니다.
- "code", "date", "maximum", "remain"
- 순서대로 코드 번호, 제조일, 최대 수량, 현재 수량을 의미합니다.
- val_ext는 ext에 따라 올바른 범위의 숫자로 주어집니다.
- 정렬 기준에 해당하는 값이 서로 같은 경우는 없습니다.
입출력 예
data | ext | val_ext | sort_by | result |
[[1, 20300104, 100, 80], [2, 20300804, 847, 37], [3, 20300401, 10, 8]] | "date" | 20300501 | "remain" | [[3,20300401,10,8],[1,20300104,100,80]] |
입출력 예 설명
입출력 예 #1
- 본문의 내용과 동일합니다.
- cpp를 응시하는 경우 리스트는 배열과 동일한 의미이니 풀이에 참고해주세요.
- ex) 번호가 담긴 정수 numbers가 주어집니다. => 번호가 담긴 정수 numbers가 주어집니다.배열
- 리스트
- java를 응시하는 경우 리스트는 배열, 함수는 메소드와 동일한 의미이니 풀이에 참고해주세요.
- ex) solution 가 올바르게 작동하도록 한 줄을 수정해 주세요. => solution 가 올바르게 작동하도록 한 줄을 수정해 주세요.
- 메소드
- 함수
풀이
import java.util.*;
class Solution {
static int search;
static int sort;
public int[][] solution(int[][] data, String ext, int val_ext, String sort_by) {
ArrayList<int[]> list = new ArrayList<>();
// 검색 값 설정
if (ext.equals("code")) {
search = 0;
} else if (ext.equals("date")) {
search = 1;
} else if (ext.equals("maximum")) {
search = 2;
} else if (ext.equals("remain")) {
search = 3;
}
// 검색 (val_ext 보다 작은 값 Search 후 list 에 넣기)
for (int i = 0; i < data.length; i++) {
if (data[i][search] < val_ext) {
list.add(new int[] {data[i][0], data[i][1], data[i][2], data[i][3]});
}
}
// answer 에 넣기
int[][] answer = new int[list.size()][4];
for (int i = 0; i < list.size(); i++) {
answer[i] = list.get(i);
}
// 정렬 값 설정
if (sort_by.equals("code")) {
sort = 0;
} else if (sort_by.equals("date")) {
sort = 1;
} else if (sort_by.equals("maximum")) {
sort = 2;
} else if (sort_by.equals("remain")) {
sort = 3;
}
// 오름차순 정렬
Arrays.sort(answer, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[sort] - o2[sort];
}
});
return answer;
}
}
1. 익명 클래스에 검색 값을 넣어주기 위해서 int 타입 search 와 sort 를 static 으로 선언
2. 검색 기준에 따라서 배열의 크기가 달라질 수 있으니 ArrayList<int[]> 타입 list 변수 선언
3. 검색 기준 매개변수에 따라 인덱스 번호 부여
4. 이후 for 문으로 data 돌면서 search 기준으로 값이 작은 것들 list에 추가
5. 정렬 기준 매개변수에 따라 인덱스 번호 부여
6. Comparator<int[]> 로 이차원 배열 정렬
o1[index] 하면 이 인덱스의 값을 기준으로 정렬 할 수 있다.
문제에서 오름차순으로 정렬해달라고 했으니 o1[] - o2[] 만약 내림차순이면 반대로 구현
처음에 검색 기준이랑 정렬 기준을 통일하여 구현했어서 계속 틀렸었다.
문제 파악 이후 정렬 기준에 따라서 인덱스 번호 부여 하는 코드 추가했더니 통과 😆
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 석유 시추 (Java) (0) | 2024.12.11 |
---|---|
[프로그래머스] 문자열 겹쳐쓰기 (JAVA) (0) | 2023.11.06 |
[프로그래머스] 홀짝 구분하기 (JAVA) (0) | 2023.11.06 |
[프로그래머스] 문자열 돌리기 (JAVA) (0) | 2023.11.06 |
[프로그래머스] 문자열 붙여서 출력하기 (JAVA) (0) | 2023.11.06 |