보통 0명 해결 정답률 0%

K번째로 작은 원소

전체 정렬 없이 k번째로 작은 값을 찾으세요.

배우게 될 내용

  • 피벗을 기준으로 값 분할하기
  • 한쪽으로만 재귀하기
  • 평균 선형 시간에 k번째로 작은 값 찾기

문제

원문 보기 (영어)

리스트에서 k번째로 작은 값을 반환하세요 (k는 1부터 셉니다). Quickselect 알고리즘을 사용하면 전체를 정렬하지 않고 평균 O(n) 시간에 찾을 수 있습니다.

kth_smallest(numbers, k)를 구현하세요.

입력

numbers: 정수로 이루어진 리스트입니다. k: 반환할 작은 값의 순서(1부터 시작).

출력

k번째로 작은 값을 반환하세요.

제약 조건

1 ≤ k ≤ 길이 ≤ 200,000

예시

예시 1
입력:
k = 3
numbers = [7, 10, 4, 3, 20, 15]

예상 출력:
expected = 7
입력:
long long k = 3;
std::vector<long long> numbers = {7, 10, 4, 3, 20, 15};

예상 출력:
long long expected = 7;
입력:
long k = 3;
long[] numbers = new long[] {7, 10, 4, 3, 20, 15};

예상 출력:
long expected = 7;

설명

정렬 결과: 3, 4, 7, 10, 15, 20; 3번째로 작은 값은 7입니다.

예시 2
입력:
k = 2
numbers = [5, 5, 1]

예상 출력:
expected = 5
입력:
long long k = 2;
std::vector<long long> numbers = {5, 5, 1};

예상 출력:
long long expected = 5;
입력:
long k = 2;
long[] numbers = new long[] {5, 5, 1};

예상 출력:
long expected = 5;

설명

정렬 결과: 1, 5, 5; 2번째로 작은 값은 5입니다 (중복도 개수에 포함).

접근 방법

먼저 스스로 풀어 본 뒤 힌트를 하나씩 열어 보세요.

힌트 1

정렬했을 때 k번째 자리에 들어갈 원소만 필요하고, 전체 정렬 결과는 필요 없습니다.

힌트 2

피벗을 기준으로 분할한 뒤, 목표 순위를 포함할 수 있는 쪽만 재귀 또는 반복으로 들어가세요.

힌트 3

k는 1부터 시작한다는 점과, 중복값도 각각 별도의 위치로 세어야 한다는 점을 기억하세요.

예상 복잡도

O(n) average time, O(1) extra space

참고 자료

이 문제는 CodeUtility에 맞게 수정되었습니다. 위의 설명과 제한 조건을 따르세요.

다른 사람의 풀이 보기

커뮤니티 솔루션

아직 공개된 풀이가 없습니다. 문제를 풀고 첫 풀이를 공유하세요.