Study/Algorithm
BOJ (C/C++) 24060번: 알고리즘 수업 - 병합 정렬 1
hwooo
2022. 10. 22. 03:37
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


코드
#include <stdio.h>
#include <vector>
using namespace std;
vector <int> V;
int N, K, cnt = 0;
int *tmp;
void merge(vector <int> &V, int s, int m, int e) {
int i, j, t;
i = s, j = m + 1, t = 1;
while (i <= m && j <= e) {
if (V[i] <= V[j]) tmp[t++] = V[i++];
else tmp[t++] = V[j++];
}
while (i <= m) tmp[t++] = V[i++];
while (j <= e) tmp[t++] = V[j++];
i = s, t = 1;
while (i <= e) {
V[i++] = tmp[t++];
if (++cnt == K) printf("%d", tmp[t - 1]); // 배열 A (여기선 벡터 V)에 K번째 저장되는 수
}
}
void merge_sort(vector <int> &V, int start, int end) {
if (start < end) {
int mid = (start + end) / 2;
merge_sort(V, start, mid); // 앞부분
merge_sort(V, mid + 1, end); // 뒷부분
merge(V, start, mid, end); // 병합
}
}
int main() {
int n;
scanf("%d %d", &N, &K);
for (int i = 0; i < N; i++) {
scanf("%d", &n);
V.push_back(n);
}
tmp = new int[N];
merge_sort(V, 0, N - 1);
if (cnt < K) printf("-1");
// for (int i = 0; i < N; i++) printf("%d ", V[i]); // 정렬 확인
return 0;
}