백준/재귀
BOJ 24060 - 알고리즘 수업 - 병합 정렬 1
누누01
2022. 11. 1. 17:31
728x90
https://www.acmicpc.net/problem/24060
24060번: 알고리즘 수업 - 병합 정렬 1
첫째 줄에 배열 A의 크기 N(5 ≤ N ≤ 500,000), 저장 횟수 K(1 ≤ K ≤ 108)가 주어진다. 다음 줄에 서로 다른 배열 A의 원소 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 109)
www.acmicpc.net
저번 문제에 이어 이번 문제 또한 의사코드를 실코드로 변경하는 것이 중점이다.
다만 merge 함수에 t 변수를 초기화할 때 0으로 초기화해야 한다는 점을 주의해야 한다.
tmp 배열에 저장할 때 인덱스 0 값부터 저장해야하기 때문이다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int LIMIT = 0;
static int COUNT = 0;
static int RESULT = -1;
static int[] ARR;
static int[] TEMP_ARR;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
int number = Integer.parseInt(st.nextToken());
LIMIT = Integer.parseInt(st.nextToken());
ARR = new int[number];
TEMP_ARR = new int[number];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < number; i++) {
ARR[i] = Integer.parseInt(st.nextToken());
}
mergeSort(0, ARR.length - 1);
System.out.println(RESULT);
br.close();
}
public static void mergeSort(int p, int r) {
if (LIMIT < COUNT) {
return;
}
if (p < r) {
int q = Math.abs((p + r) / 2);
mergeSort(p, q);
mergeSort(q + 1, r);
merge(p, q, r);
}
}
public static void merge(int p, int q, int r) {
int i = p;
int j = q + 1;
int t = 0;
while (i <= q && j <= r) {
if (ARR[i] <= ARR[j]) {
TEMP_ARR[t++] = ARR[i++];
} else {
TEMP_ARR[t++] = ARR[j++];
}
}
while (i <= q) {
TEMP_ARR[t++] = ARR[i++];
}
while (j <= r) {
TEMP_ARR[t++] = ARR[j++];
}
i = p;
t = 0;
while (i <= r) {
COUNT++;
if (COUNT == LIMIT) {
RESULT = TEMP_ARR[t];
break;
}
ARR[i++] = TEMP_ARR[t++];
}
}
}