반응형
https://www.acmicpc.net/problem/11004
O(NlogN) 정렬로 정렬한 후, A[K]를 출력하면 된다. 여기서는 merge sort를 사용하였다.
이때, K는 입력을 받은 후, 1을 빼야한다.
#include <stdio.h>
int N, K;
int A[5050000];
int B[5050000];
void merge(int* A, int start, int end)
{
int mid, i, j, k;
mid = (start + end) >> 1;
i = start;
j = mid + 1;
k = 0;
while (i <= mid && j <= end)
{
if (A[i] <= A[j]) B[k++] = A[i++];
else B[k++] = A[j++];
}
while (i <= mid) B[k++] = A[i++];
while (j <= end) B[k++] = A[j++];
for (i = start; i <= end;i++)
A[i] = B[i - start];
}
void sort(int* A, int start, int end)
{
int mid;
if (start >= end) return;
mid = (start + end) >> 1;
sort(A, start, mid);
sort(A, mid + 1, end);
merge(A, start, end);
}
int main(void)
{
scanf("%d %d", &N, &K);
K -= 1;
for (int i = 0; i < N; i++) scanf("%d", &A[i]);
sort(A, 0, N - 1);
printf("%d\n", A[K]);
return 0;
}
이 문제는 c++의 algorithm에서 nth_element를 이용할 수도 있다.
nth_element는 부분적으로 정렬을 시킨다.
배열 A[0]에서 A[N]까지 K번째 수를 찾고 싶다면, nth_element(A, A + K, A + N); 를 호출하면 된다.
그러면 A[K]에 K번째 수가 담겨있게 된다.
#include <stdio.h>
#include <algorithm>
using namespace std;
int N, K;
int A[5050000];
int main(void)
{
scanf("%d %d", &N, &K);
K -= 1;
for (int i = 0; i < N; i++) scanf("%d", &A[i]);
nth_element(A, A + K, A + N);
printf("%d\n", A[K]);
return 0;
}
반응형
'알고리즘 > BAEKJOON' 카테고리의 다른 글
BOJ 1261 : 알고스팟 (0) | 2022.07.17 |
---|---|
BOJ 11779 : 최소비용 구하기 2 (0) | 2022.07.16 |
BOJ 2252 : 줄 세우기 (0) | 2021.07.17 |
BOJ 1005 : ACM Craft (0) | 2021.07.14 |
BOJ 2531, 15961 : 회전 초밥 (0) | 2021.07.04 |
댓글