배열 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입니다.
배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.
제한사항
- array의 길이는 1 이상 100 이하입니다.
- array의 각 원소는 1 이상 100 이하입니다.
- commands의 길이는 1 이상 50 이하입니다.
- commands의 각 원소는 길이가 3입니다.
입출력 예
array | commands | return |
[1, 5, 2, 6, 3, 7, 4] | [[2, 5, 3], [4, 4, 1], [1, 7, 3]] | [5, 6, 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입니다.
💡 문제 접근 방식
문제 해결을 위해 배열을 반복문으로 순회하며 각각의 작업을 수행해야 합니다.
- 명령어 배열 commands를 순회하며 각 명령어에서 i, j, k 값을 추출합니다.
- `Arrays.copyOfRange` 메서드를 사용해 배열의 특정 부분을 추출합니다.
- 추출된 배열을 `Arrays.sort` 메서드로 정렬합니다.
- 정렬된 배열에서 k번째 값을 반환하고 최종 결과 배열에 저장합니다.
🔍 코드 설명
import java.util.Arrays;
class Solution {
public int[] solution(int[] array, int[][] commands) {
int[] answer = new int[commands.length]; // 결과 배열 생성
for (int index = 0; index < commands.length; index++) {
int i = commands[index][0] - 1; // 시작 인덱스 (1-based → 0-based)
int j = commands[index][1]; // 끝 인덱스 (j번째까지 포함)
int k = commands[index][2] - 1; // k번째 값 (1-based → 0-based)
int[] temp = Arrays.copyOfRange(array, i, j); // i번째부터 j번째까지 자름
Arrays.sort(temp); // 자른 배열 정렬
answer[index] = temp[k]; // k번째 값 저장
}
return answer;
}
}
1️⃣ 반복문을 통한 명령어 순회
commands 배열의 각 요소는 하나의 명령을 나타냅니다.
반복문을 통해 각 명령어를 순회하며 i, j, k 값을 추출합니다.
여기서 주의할 점은 자바 배열이 0-based index라는 점입니다.
따라서 i, k 값에서 1을 빼서 올바른 인덱스를 얻습니다.
int i = commands[index][0] - 1; // 시작 인덱스 (1-based → 0-based)
int j = commands[index][1]; // 끝 인덱스는 그대로 사용
int k = commands[index][2] - 1; // k번째 값 (1-based → 0-based)
2️⃣ 배열의 특정 범위 추출하기 Arrays.copyOfRange
`Arrays.copyOfRange` 메서드는 자바에서 배열의 특정 부분을 손쉽게 추출할 수 있는 메서드입니다.
이 메서드는 시작 인덱스와 끝 인덱스를 입력으로 받아 새로운 배열을 반환합니다.
여기서 끝 인덱스는 포함되지 않음에 유의해야 합니다.
int[] temp = Arrays.copyOfRange(array, i, j);
// array = [1, 5, 2, 6, 3, 7, 4]
// i = 2, j = 5라면,
// 결과는 [5, 2, 6, 3]이 됩니다.
3️⃣ 배열 정렬하기 Arrays.sort
Arrays.sort 메서드는 배열을 오름차순으로 정렬합니다.
Arrays.sort(temp);
// 추출한 배열 temp를 정렬해 [2, 3, 5, 6]으로 만듭니다.
4️⃣ 결과 추출
정렬된 배열에서 k번째 값을 반환해야 합니다.
answer[index] = temp[k];
코드는 자바의 내장 메서드를 활용해 복잡한 배열 조작 문제를 간결하고 효율적으로 해결합니다.
Arrays.copyOfRange
특정 범위의 배열을 쉽게 추출할 수 있어 코드의 가독성을 높입니다.
Arrays.sort
정렬 작업을 최적화된 내부 알고리즘으로 빠르게 수행합니다.
반복문과 배열 조작
반복문을 통해 여러 명령어를 처리하며, 추출 → 정렬 → 값 반환의 과정을 따릅니다.