< 프로그래머스 C++ > K번째 수
2026. 4. 23. 09:39ㆍProgrammers

문제 해석
자르기 > 정렬 > 특정 위치 원소 추출 세 단계를 반복하면 되기 때문에 간단한 문제이다.
하지만 인덱스의 위치와 문제에서 원하는 순서의 숫자를 헷갈리기 쉽다. 이 부분을 주의하며 풀어야 한다.
문제 풀이
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> solution(vector<int> array, vector<vector<int>> commands) {
vector<int> answer;
for(int i = 0; i < commands.size(); ++i)
{
vector<int> sliced(
array.begin() + commands[i][0] - 1,
array.begin() + commands[i][1]
);
sort(sliced.begin(), sliced.end());
answer.push_back(sliced[commands[i][2] - 1]);
}
return answer;
}
풀이 흐름
더보기
vector 범위 생성자로 구간 복사 -> sort로 정렬 -> k-1번째 원소를 answer에 추가 후 리턴
핵심 포인트
vector 범위 생성자
vector 범위 생성자에서 iterator 두 개를 넘기면 (first, last) 구간을 복사한 새 vector가 만들어지는데, 문제에서 원하는 범위를 추출하기 위해서는 sliced의 첫번째 인자에는 first -1을, 두번째는 그냥 last를 입력하는 것이다.
vector<int> v = {10, 20, 30, 40, 50};
vector<int> sliced(v.begin() + 1, v.begin() + 4);
// sliced = {20, 30, 40} ← 인덱스 4는 포함 안 됨!
sliced의 자르기 방식은 다음과 같다.
따라서 마지막에는 -1을 붙여주지 않아야 문제에서 원하는 범위가 추출된다.
트러블 슈터
1. 결과가 하나씩 모자람
문제 : [5, 2, 6, 3] 이어야 할 sliced가 [5, 2, 6]만 출력됨
원인 : 끝 인덱스에도 -1을 해서 sliced함
그래서 추출된 인덱스가 하나씩 모자람
해결 : iterator의 끝은 포함이 되지 않는 다는 것을 알게 되어 -1을 제거하고 sliced함
array.begin() + commands[i][1] - 1
>> array.begin() + commands[i][1]
2. K번째에서 엉뚱한 값이 나옴
문제 : 정렬된 [2, 3, 5, 6]에서 3번째를 5대신 6으로 반환.
원인 : sliced[commands[i][2]]로 사용해서 k = 3일 때, 5 대신 6으로 출력되는 것이었다.
해결 : k의 숫자도 인덱스의 시작 위치를 감안하여 -1을 추가해주면 해결 된다.
sliced[commands[i][2]]
>> sliced[commands[i][2] - 1]'Programmers' 카테고리의 다른 글
| < 프로그래머스 C++ > 가장 가까운 같은 글자 (0) | 2026.04.27 |
|---|---|
| < 프로그래머스 C++ > 두 개 뽑아서 더하기 (0) | 2026.04.24 |
| < 프로그래머스 C++ > 문자열 내 마음대로 정렬하기 (0) | 2026.04.22 |
| <프로그래머스 C++> 숫자 문자열과 영단어 (1) | 2026.04.21 |
| < 프로그래머스 C++ > 시저 암호 (0) | 2026.04.20 |