🚨문제 설명

💡푼 방법
import java.util.*;
class Solution {
public int[] solution(int[] array, int[][] commands) {
ArrayList<Integer> list = new ArrayList<>();
for(int i = 0; i < commands.length; i++){
ArrayList<Integer> set = new ArrayList<>();
for(int k = (commands[i][0])-1; k < commands[i][1]; k++){
set.add(array[k]);
}
set.sort(Comparator.naturalOrder());
list.add(set.get((commands[i][2])-1));
}
int[] answer = new int[list.size()];
for(int n = 0; n < list.size(); n++){
answer[n] = list.get(n);
}
return answer;
}
}
command 배열을 돌면서 배열 안에 들어있는 조건에 맞춰 수를 set에 더해주고 set을 기본 오름차순으로 정렬(Comparator.naturalOrder())한 후 command에 들어있는 마지막 조건에 해당하는 수를 list에 더해준다.
*일반배열에서는 Arrays.sort(배열이름)을 사용하지만 Collections에서는 리스트.sort(정렬규칙(Comparator.naturalOrder()))로 작성한다.
command에 들어있는 조건들이 0부터시작하는 것이 아닌 1부터 시작하는 조건이어서 for문을 돌 때 -1을 해주었다.
answer의 길이를 list 사이즈로 정해주고 answer에 하나씩 넣어주었다.
내가 생각하기에는 나름에 괜찮다는 생각이 들면서 뭔가 더 깔끔하게 할 수 있을 것 같다는 느낌이 들었다.
문제는 풀렸지만 어떤 것을 이용하면 더 깔끔하게 만들 수 있을지 고민해봐야겠다고 생각했다.
*ArrayList에 넣을 때는 .add()를 쓰지만 리스트에 들어있는 것을 가져올 때는 .get()을 사용하는 걸 잊지말자!
🚧오답 노트
이 문제는 굳이 ArrayList를 사용할 필요없이 배열을 이용해도 괜찮은 문제였다.
이전 문제에서 ArrayList를 사용했기때문에 응용해보고 싶어 사용해보았다.
import java.util.*;
class Solution {
public int[] solution(int[] array, int[][] commands) {
//answer의 길이를 미리 알 수 있기 때문에 먼저 선언하기
int[] answer = new int[commands.length];
for (int i = 0; i < commands.length; i++) {
// 1. 범위만큼 배열을 잘라냅니다.
int start = commands[i][0] - 1;
int end = commands[i][1];
int[] temp = Arrays.copyOfRange(array, start, end);
// 2. 잘라낸 배열을 정렬합니다.
Arrays.sort(temp);
// 3. K번째(인덱스는 -1) 값을 결과 배열에 담습니다.
answer[i] = temp[commands[i][2] - 1];
}
return answer;
}
}
하지만 조금 더 간결하게하기 위해서는 배열을 사용하는 편이 좋다.
추가적으로 배열을 사용할 때와 ArrayList를 사용할 때에 대해서 공부하면 좋을 것 같다.
Arrays.copyOfRange(원본배열, 시작인덱스, 마지막인덱스)
내가 풀 때 ArrayList를 새로 만들고 거기에 넣어서 정렬을 했다면
이 코드는 원본배열과 시작인덱스, 마지막인덱스를 넣으면 그 구간을 새로운 배열로 만든다.
*주의할 점은 마지막인덱스는 포함되지 않으므로 그 인덱스를 포함시키고싶다면 +1을 해주어야한다.
그 이후 Arrays.sort(temp)로 정렬해준다.
나 같은 경우는 for문이 여러번 돌아가 클린하지 않은 코드였지만 이렇게 for문 한번으로 돌아가면 보기 쉽고 깨끗한 코드를 만들 수 있기 때문에 알아두면 좋다.