[Java] K번째수

2025. 2. 12. 10:06·CodingTest/[프로그래머스] 자바

📝 문제 설명

배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.

예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면

  1. array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.
  2. 1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
  3. 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입니다.

 

 


 

 

 

💡 문제 접근 방식

문제 해결을 위해 배열을 반복문으로 순회하며 각각의 작업을 수행해야 합니다.

  1. 명령어 배열 commands를 순회하며 각 명령어에서 i, j, k 값을 추출합니다.
  2. `Arrays.copyOfRange` 메서드를 사용해 배열의 특정 부분을 추출합니다.
  3. 추출된 배열을 `Arrays.sort` 메서드로 정렬합니다.
  4. 정렬된 배열에서 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

정렬 작업을 최적화된 내부 알고리즘으로 빠르게 수행합니다.

 

반복문과 배열 조작

반복문을 통해 여러 명령어를 처리하며, 추출 → 정렬 → 값 반환의 과정을 따릅니다.

 

 

 

728x90
저작자표시 비영리 변경금지 (새창열림)
'CodingTest/[프로그래머스] 자바' 카테고리의 다른 글
  • [Java] 가장 가까운 같은 글자
  • [Java] 두 개 뽑아서 더하기
  • [Java] 문자열 내 마음대로 정렬하기
  • [Java] 숫자 문자열과 영단어
leonie.
leonie.
  • leonie.
    leveloper
    leonie.
  • 글쓰기 관리
    • 분류 전체보기
      • Language
        • Java
      • Git
      • CS
      • CodingTest
        • [프로그래머스] 자바
      • Framework
        • Spring
      • Information
      • DBMS
        • Redis
        • SQL
      • AWS
      • OS
        • Mac
      • 자격증
        • 정보처리기사
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    스프링
    의존성주입
    자바
    코딩테스트
    springboot
    Java
    알고리즘
    JPA
    프로그래머스
    Hibernate
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
leonie.
[Java] K번째수
상단으로

티스토리툴바