https://www.acmicpc.net/problem/24060
import java.util.*;
import java.io.*;
class Main {
static int N;
static int K;
static int count = 0;
static int result = -1;
static int[] A;
static int[] temp;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
K = Integer.parseInt(st.nextToken());
A = new int[N];
temp = new int[N];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
A[i] = Integer.parseInt(st.nextToken());
}
mergeSort(0, N - 1);
System.out.println(result);
}
static void mergeSort(int start, int end) {
if (count > K) {
return;
}
if (start < end) {
int mid = (start + end) / 2;
mergeSort(start, mid);
mergeSort(mid + 1, end);
merge(start, mid, end);
}
}
static void merge(int start, int mid, int end) {
int i = start;
int j = mid + 1;
int t = 0;
while (i <= mid && j <= end) {
if (A[i] <= A[j]) {
temp[t++] = A[i++];
} else {
temp[t++] = A[j++];
}
}
while (i <= mid) {
temp[t++] = A[i++];
}
while (j <= end) {
temp[t++] = A[j++];
}
i = start;
t = 0;
while (i <= end) {
++count;
if (count == K) {
result = temp[t];
return;
}
A[i++] = temp[t++];
}
}
}
배열 A
에 K
번째로 저장되는 수를 구하는 문제이다.temp
배열의 값이 A
배열로 복사되는 부분은 merge
메서드 마지막 부분 while
루프에 존재한다.count
로 갱신하면서 이 count
가 K
인 시점에 temp[t]
를 구하면 된다.temp
배열을 static
으로 미리 생성한 후 관리해야 시간초과가 발생하지 않는다.merge
의 수행횟수가 많은 경우, 매번 매 순간 temp배열을 초기화 하는 비용이 큰것 같다.merge
메서드는 직접 실행을 따라가봐야 이해할 수 있었다.핵심 포인트
에서 언급한 것과 같이 시간 초과가 발생했다.