[코딩테스트]

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

everydeveloper 2025. 5. 5. 18:24

K번째수

훌륭해요! 이 문제는 흔히 “부분 배열 자르고 정렬해서 K번째 요소 찾기”라는 구조인데,
이건 자르기(Slicing) + 정렬(Sorting) + 인덱싱(Access) 3단계로 분해됩니다.
옵시디언에 정리한다면 다음과 같은 구조로 정리하는 걸 추천해요:


🟩 K번째 수 (프로그래머스 Lv1)


🧩 문제 요약

  • array에서 i번째부터 j번째까지 자르고 정렬한 뒤,
    k번째 수를 구하라는 문제
  • 여러 개의 commands가 주어짐
    → 각각 독립적으로 수행

🧠 핵심 개념

단계 설명
1. 배열 자르기 Arrays.copyOfRange(array, i-1, j)
2. 정렬 Arrays.sort()
3. k번째 수 반환 sliced[k-1] (0-index 보정 필요)
  • 문제 포인트: 0-index 기반과 1-index 기반 혼용 주의
  • 각 command는 서로 독립적이므로 반복적으로 수행 가능

✅ 예시 코드 스니펫

for (int i = 0; i < commands.length; i++) {
    int start = commands[i][0] - 1;
    int end = commands[i][1];
    int k = commands[i][2] - 1;

    int[] sliced = Arrays.copyOfRange(array, start, end);
    Arrays.sort(sliced);
    answer[i] = sliced[k];
}

📌 복기 포인트

  1. Arrays.copyOfRange는 [start, end)`범위 주의end는 포함되지 않음 → 그래서commands[i][1]은 그대로 써도 됨
  2. 0-based index 보정 필요
    → 문제는 1-based로 주어짐 → 내부에서는 -1 처리
  3. 입력 수가 많다면 시간복잡도 고려 필요
    → 자르기: O(n) / 정렬: O(n log n) / 전체: O(n m log m)

🔄 확장 가능성

  • 비슷한 문제: “N번째 큰 수”, “구간별 최솟값”, “슬라이딩 윈도우”
  • 정렬 이후 인덱싱 문제는 보통 priority queue나 quickselect로 최적화 가능

🔍 내가 놓치기 쉬운 부분

  • copyOfRange범위
  • k가 정렬 이후 인덱스라는 점에서의 1보정
  • 너무 간단하게 풀려서 디버깅 포인트 없이 넘어가는 위험
    → 실제로는 정렬이 예상과 다르게 되는 경우 주의

이런 식으로 옵시디언에 정리하면 나중에 유사 문제 나왔을 때 즉시 패턴 기억 + 적용이 가능해요.
또, 이건 그리디, 슬라이싱, 정렬 문제들을 묶는 인덱스 역할도 할 수 있고요.


필요하다면 옵시디언용 템플릿 마크다운 파일 형태로도 만들어줄 수 있어.
더 정리해두고 싶은 문제 있으면 말해줘!


public int[] solution(int[] array, int[][] commands) {
    int[] answer = new int[commands.length];

    for (int i = 0; i < commands.length; i++) {
        int start = commands[i][0] - 1;
        int end = commands[i][1];
        int k = commands[i][2] - 1;

        // 배열 자르기
        int[] sliced = Arrays.copyOfRange(array, start, end);

        // 정렬
        Arrays.sort(sliced);

        // k번째 수 저장
        answer[i] = sliced[k];
    }

    return answer;
}

25분걸림