[프로그래머스] K번째 수

이찬혁·2024년 4월 17일

알고리즘

목록 보기
46/72

프로그래머스 Lv1 - K번째 수 문제

프로그래머스 알고리즘 고득점 Kit 카테고리의 정렬 문제 중 레벨 1 K번째 수 문제를 풀이했다.

1단계 문제라 어려운 부분은 없었다. 로직 흐름은 아래와 같다.

  1. 상위 반복문을 순회하며 배열을 자르는 단위(i, j) 및 정렬된 배열내에서 골라야하는 요소(k)를 변수에 할당
  2. i, j 범위만큼의 요소로 구성될 배열 splited 선언
  3. 내부 반복문을 순회하며 i, j 범위의 요소를 splited 배열에 할당
  4. splited 배열을 오름차순 정렬 후 k번째 요소를 정답 리스트에 추가
  5. 정답 리스트를 배열로 변환하여 리턴

문제 풀이 후 다른 사람의 풀이를 보니 나처럼 내부 반복문을 통해 해당 범위의 요소를 구하지 않고 Arrays.copyOfRange() 메소드를 통해 구하는 풀이를 많이 보았다.
이번 기회에 Arrays.copyOfRange() 메소드를 통해서 배열의 범위 요소들을 한번에 가져올 수 있다는 것을 알게 되었다!!

KthNumber.java

package com.example.Programmers.Lv1;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 프로그래머스 Lv1 - K번째 수
 * 정렬 문제
 */
public class KthNumber {
    public int[] solution(int[] array, int[][] commands) {
        List<Integer> answer = new ArrayList<>();

        for (int a = 0; a < commands.length; a++) {
            int i = commands[a][0];
            int j = commands[a][1];
            int k = commands[a][2];
            int[] splited = new int[j - i + 1];
            int cnt = 0;
            for (int b = i - 1; b < j; b++) {
                splited[cnt] = array[b];
                cnt++;
            }
            Arrays.sort(splited);
            answer.add(splited[k - 1]);
        }
        return answer.stream().mapToInt(Integer::intValue).toArray();
    }
}

KthNumberTest.java

package com.example.Programmers.Lv1;

import static org.junit.Assert.assertArrayEquals;

import org.junit.Test;

public class KthNumberTest {
    @Test
    public void testKthNumber() {
        KthNumber k = new KthNumber();

        int[] result = k.solution(new int[] { 1, 5, 2, 6, 3, 7, 4 },
                new int[][] { { 2, 5, 3 }, { 4, 4, 1 }, { 1, 7, 3 } });

        int[] expected = new int[] { 5, 6, 3 };

        assertArrayEquals(expected, result);

    }
}
profile
나의 개발로그

0개의 댓글