1. 배경지식
배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.
예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면
- array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.
- 1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
- 2에서 나온 배열의 3번째 숫자는 5입니다.
2. 문제
배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.
<제한사항>
- array의 길이는 1 이상 100 이하입니다.
- array의 각 원소는 1 이상 100 이하입니다.
- commands의 길이는 1 이상 50 이하입니다.
- commands의 각 원소는 길이가 3입니다.
3. 예시
[1, 5, 2, 6, 3, 7, 4]를 2번째부터 5번째까지 자른 후 정렬합니다. [2, 3, 5, 6]의 세 번째 숫자는 5입니다.
[1, 5, 2, 6, 3, 7, 4]를 4번째부터 4번째까지 자른 후 정렬합니다. [6]의 첫 번째 숫자는 6입니다.
[1, 5, 2, 6, 3, 7, 4]를 1번째부터 7번째까지 자릅니다. [1, 2, 3, 4, 5, 6, 7]의 세 번째 숫자는 3입니다.
4. 나의 답안
import java.util.*;
class Solution {
public int[] solution(int[] array, int[][] commands) {
int[] answer = {};
List<Integer> selectedArr = new ArrayList<Integer>();
answer = new int[commands.length];
for(int i = 0; i < commands.length; i++) {
for(int j = commands[i][0]-1 ; j < commands[i][1]; j++) {
selectedArr.add(array[j]); // array의 i번째부터 j번째까지의 ArrayList생성
Collections.sort(selectedArr); // ArrayList 정렬
}
answer[i] = selectedArr.get(commands[i][2] - 1); // k번째를 answer로 대입
selectedArr.clear(); // ArrayList에 들어있는 값들 초기화
}
return answer;
}
}
5. 메모
- Collections.sort() vs Arrays.sort()
- Arrays.sort() : java.util.Arrays에 속함. 배열[]을 배열해줌. 숫자>알파벳>한글(오름차순)
- Collections.sort() : java.util.Collections에 속함. ArrayList 등을 배열해줌. 숫자>알파벳>한글(오름차순)
- Arrays.copyOfRange(Objcect, 시작 index, 끝 index); vs Arrays.copyOf(Object, 복사할 크기); (아래 다른 사람 풀이 분석)
import java.util.Arrays;
class Solution {
public int[] solution(int[] array, int[][] commands) {
int[] answer = new int[commands.length];
for(int i=0; i<commands.length; i++){
// array의 i번째부터 j번째까지 temp로 배열 생성
int[] temp = Arrays.copyOfRange(array, commands[i][0]-1, commands[i][1]);
Arrays.sort(temp); // Arrays.sort로 정렬
answer[i] = temp[commands[i][2]-1]; // k번째 answer로 대입
}
return answer;
}
}
- 라이브러리를 사용하지 않고 풀기(아래 다른 사람 풀이 분석)
class Solution {
public int[] solution(int[] array, int[][] commands) {
int n = 0;
int[] ret = new int[commands.length];
while(n < commands.length){
int m = commands[n][1] - commands[n][0] + 1; // 복사할 배열 크기 구하기
if(m == 1){ // 크기가 1일 경우, 복사한 1번째 수 리턴
ret[n] = array[commands[n++][0]-1];
continue;
}
int[] a = new int[m]; // 구한 크기로 배열 생성
int j = 0;
// 생성한 배열에 i번부터 j번까지 값 넣기
for(int i = commands[n][0]-1; i < commands[n][1]; i++)
a[j++] = array[i];
sort(a, 0, m-1); // sort 함수 호출
ret[n] = a[commands[n++][2]-1];
}
return ret;
}
void sort(int[] a, int left, int right){
int pl = left;
int pr = right;
int x = a[(pl+pr)/2]; // 배열의 중간 번째 값 대입
do{
while(a[pl] < x) pl++; // 배열의 0번째 값이 중간 번째 값보다 작으면, 다음 번째랑 비교
while(a[pr] > x) pr--; // 배열의 마지막번째 값이 중간 번째 값보다 크면, 다음 번째랑 비교
if(pl <= pr){ // pl번째 값이 pr번째 값보다 크다면, 값 바꾸기
int temp = a[pl];
a[pl] = a[pr];
a[pr] = temp;
pl++;
pr--;
}
}while(pl <= pr);
if(left < pr) sort(a, left, pr);
if(right > pl) sort(a, pl, right);
}
}
'공부 > CodingTest' 카테고리의 다른 글
[백준/1000] A+B (Java 11) (0) | 2021.05.28 |
---|---|
[프로그래머스/Lv.1] 로또의 최고 순위와 최저 순위 (Java) (0) | 2021.05.27 |
[프로그래머스/Lv.1] 완주하지 못한 선수 (Java) (0) | 2021.05.25 |
[프로그래머스/Lv.1] 모의고사 (Java) (0) | 2021.05.20 |
[프로그래머스/Lv.1] 크레인 인형뽑기 (Java) (0) | 2021.05.19 |