프로그래머스 K번째수 풀이 과정
1트 정답. 과거 코드와 비교했을 때Arrays.copyOfRange()덕분에 훨씬 간결해졌다.
총 1번의 제출
i번째부터 j번째까지 자르고, 정렬한 뒤 k번째 값을 반환하면 된다.
로직 자체는 단순해서 바로 구현했다.
1트 (정답)
→ commands를 순회하면서 i, j, k를 꺼낸다.
→ Arrays.copyOfRange()로 array의 i-1부터 j까지 잘라 새 배열을 만든다.
→ Arrays.sort()로 정렬한 뒤 k-1 인덱스 값을 answer에 담는다.
import java.util.*;
class Solution {
public int[] solution(int[] array, int[][] commands) {
int[] answer = new int[commands.length];
int idx = 0;
for(int[] command : commands) {
int i = command[0];
int j = command[1];
int k = command[2];
int[] copy = Arrays.copyOfRange(array, i-1, j);
Arrays.sort(copy);
answer[idx++] = copy[k-1];
}
return answer;
}
}
Arrays.copyOfRange() 란
Arrays.copyOfRange(원본 배열, 시작 인덱스, 끝 인덱스)
원본 배열의 특정 범위를 잘라 새로운 배열로 반환하는 메서드다.
시작 인덱스는 포함, 끝 인덱스는 미포함이다.
int[] arr = {1, 2, 3, 4, 5};
int[] copy = Arrays.copyOfRange(arr, 1, 4);
// copy = {2, 3, 4}
원본 배열은 그대로 유지되고, 잘라낸 범위만 담긴 새 배열이 생성된다.
이 문제처럼 배열의 일부를 정렬해야 할 때 원본을 건드리지 않고 쓸 수 있어서 유용하다.
위 풀이의 결과
copyOfRange()한 줄로 범위 추출과 새 배열 생성을 동시에 처리했다.int[]기본 타입 배열이라Arrays.sort()가 바로 적용된다.- 과거 코드와 비교하면 코드가 눈에 띄게 짧아졌다.
과거 코드와 비교
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
class Solution {
public int[] solution(int[] array, int[][] commands) {
int[] answer = new int[commands.length];
for(int i=0; i<commands.length; i++) {
ArrayList<Integer> tmp = new ArrayList<>();
for(int j=commands[i][0]-1; j<commands[i][1]; j++) {
tmp.add(array[j]);
}
Collections.sort(tmp);
answer[i] = tmp.get(commands[i][2]-1);
}
return answer;
}
}
| 현재 코드 | 과거 코드 | |
|---|---|---|
| 범위 추출 | Arrays.copyOfRange() 한 줄 |
for문으로 직접 순회하며 add() |
| 자료구조 | int[] 기본 배열 |
ArrayList<Integer> |
| 정렬 | Arrays.sort() |
Collections.sort() |
| 인덱스 접근 | copy[k-1] |
tmp.get(commands[i][2]-1) |
| 불필요한 import | 없음 | Scanner import가 있는데 사용 안 함 |
과거 코드는 copyOfRange()를 몰랐으니 for문으로 직접 ArrayList에 옮겨 담았다.
로직은 동일하지만 ArrayList를 쓰면 int → Integer 박싱 비용이 발생하고, Collections.sort()까지 써야 해서 현재 코드보다 무겁다.
어떤 코드가 더 나은가 하면 현재 코드다.copyOfRange()로 기본 타입 배열을 그대로 다루니까 박싱 오버헤드가 없고, 코드도 짧고 읽기 편하다.
과거 코드가 틀린 건 아니지만, Arrays.copyOfRange()를 알고 나면 굳이 ArrayList를 쓸 이유가 없다.
로직 자체는 과거에도 맞게 짰다. 달라진 건
copyOfRange()라는 도구를 하나 알게 된 것뿐이다.
아는 메서드가 늘어날수록 코드가 짧아지고, 불필요한 자료구조 변환도 줄어든다.
앞으로 배열 일부를 다뤄야 할 때copyOfRange()를 바로 떠올릴 수 있을 것 같다.
'CS > 코딩테스트' 카테고리의 다른 글
| 프로그래머스 - H Index (Java) (0) | 2026.05.07 |
|---|---|
| 프로그래머스 - 가장 큰 수 (JAVA) (0) | 2026.05.01 |
| 프로그래머스 - 디스크 컨트롤러 (JAVA) (0) | 2026.04.28 |
| 프로그래머스 - 주식 가격 (JAVA) (0) | 2026.04.24 |
| 프로그래머스 - 다리를 지나는 트럭 (JAVA) (0) | 2026.04.24 |
