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

AlgorithmSort

문제

배열 array와 명령 [i, j, k]가 여러 개 주어진다. 각 명령마다 array의 i번째부터 j번째까지 잘라 정렬한 뒤 k번째 수를 반환한다. 인덱스는 1-based다.

핵심

명령마다 부분 배열 복사 → 정렬 → k번째 접근. 그대로 구현하면 된다.

풀이

#include <vector>
#include <algorithm>
using namespace std;

vector<int> solution(vector<int> array, vector<vector<int>> commands) {
    vector<int> answer;
    for (const auto& cmd : commands) {
        vector<int> sub(array.begin() + cmd[0] - 1, array.begin() + cmd[1]);
        sort(sub.begin(), sub.end());
        answer.push_back(sub[cmd[2] - 1]);
    }
    return answer;
}

메모

  • vector<int> sub(begin, end) 범위 생성자로 부분 배열을 복사한다. cmd[0] - 1은 1-based → 0-based 변환, cmd[1]은 변환하지 않는다 (범위 끝은 exclusive이므로 j번째까지 포함)
  • nth_element(sub.begin(), sub.begin() + cmd[2] - 1, sub.end())를 쓰면 전체 정렬 없이 k번째 원소만 O(N)에 구할 수 있다. 이 문제는 배열이 작아서 차이가 없다

복잡도

풀이시간공간
부분 정렬O(M · N log N)O(N)
nth_elementO(M · N)O(N)

M = commands 수, N = 부분 배열 최대 길이