K번째수 문서의 문제 1 풀이 코드다. if __name__ == "__main__": 아래가 자체 테스트다.

"""K번째수 (프로그래머스 42748) 풀이와 검증."""
import random


def solution(array, commands):
    answer = []
    for i, j, k in commands:
        part = sorted(array[i - 1:j])
        answer.append(part[k - 1])
    return answer


def brute(array, commands):
    """정렬 없이: 구간 안에서 '자기보다 작은 수 < k <= 자기 이하 수'인 값을 찾는다."""
    out = []
    for i, j, k in commands:
        part = array[i - 1:j]
        for v in part:
            less = sum(1 for x in part if x < v)
            leq = sum(1 for x in part if x <= v)
            if less < k <= leq:
                out.append(v)
                break
    return out


if __name__ == "__main__":
    assert solution([1, 5, 2, 6, 3, 7, 4], [[2, 5, 3], [4, 4, 1], [1, 7, 3]]) == [5, 6, 3]
    assert solution([9, 4, 7, 1], [[1, 3, 2]]) == [7]
    rng = random.Random(42748)
    for _ in range(1000):
        n = rng.randint(1, 100)
        array = [rng.randint(1, 100) for _ in range(n)]
        commands = []
        for _ in range(rng.randint(1, 50)):
            i = rng.randint(1, n)
            j = rng.randint(i, n)
            commands.append([i, j, rng.randint(1, j - i + 1)])
        before = array[:]
        assert solution(array, commands) == brute(array, commands)
        assert array == before
    print("ALL CHECKS PASSED")