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];
}
📌 복기 포인트
Arrays.copyOfRange는 [start, end)`범위 주의 →end는 포함되지 않음 → 그래서commands[i][1]은 그대로 써도 됨- 0-based index 보정 필요
→ 문제는 1-based로 주어짐 → 내부에서는 -1 처리 - 입력 수가 많다면 시간복잡도 고려 필요
→ 자르기: 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분걸림
'[코딩테스트]' 카테고리의 다른 글
| 가장 큰 수 -프로그래머스 - java (0) | 2025.05.05 |
|---|---|
| 과일 장수 - 프로그래머스 - java (0) | 2025.05.05 |
| 두 개 뽑아서 더하기 (프로그래머스 Lv1) - java (0) | 2025.05.05 |
| [프로그래머스] 이중우선순위 (0) | 2024.06.07 |
| [프로그래머스] 정수 삼각형 - Java (0) | 2024.06.06 |