프로그래머스 - K번째 수 (JAVA)

2026. 5. 1. 17:48·CS/코딩테스트

프로그래머스 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
'CS/코딩테스트' 카테고리의 다른 글
  • 프로그래머스 - H Index (Java)
  • 프로그래머스 - 가장 큰 수 (JAVA)
  • 프로그래머스 - 디스크 컨트롤러 (JAVA)
  • 프로그래머스 - 주식 가격 (JAVA)
jupeternotebook
jupeternotebook
JUPETER의 취준, 개발, 일상
  • jupeternotebook
    JUPETER의 Notebook
    jupeternotebook
  • 전체
    오늘
    어제
    • 분류 전체보기 (18)
      • CS (18)
        • 자료구조 (2)
        • 알고리즘 (0)
        • 네트워크 (0)
        • 운영체제 (0)
        • 데이터베이스 (0)
        • 코딩테스트 (12)
        • GitHub (1)
        • Java (3)
      • 개발일지 (0)
      • 이모저모 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    우선순위큐
    jdk
    프로그래밍언어
    stack
    git
    프로그래머스
    해시
    자료구조
    큐
    덱
    jvm
    코딩테스트
    힙
    github
    정렬
    java
    메모리
    해시맵
    heap
    스택
    GC
    해시셋
    jre
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
jupeternotebook
프로그래머스 - K번째 수 (JAVA)
상단으로

티스토리툴바