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;
}