[백준] 24060번 알고리즘 수업 - 병합 정렬 1 C++

semi·2022년 10월 4일
0

coding test

목록 보기
41/57

https://www.acmicpc.net/problem/24060

#include <iostream>
#include <cmath>
using namespace std;

int A[500001] = { 0 };
int tmp[500001] = { 0, };
int cnt = 0;
int N, K;
bool flag = false;
void merge(int A[], int p, int q, int r)
{
	int i = p;
	int j = q + 1;
	int t = 1;
	while (i <= q && j <= r)
	{
		if (A[i] <= A[j])
		{
			tmp[t++] = A[i++];
		}
		else
		{
			tmp[t++] = A[j++];
		}
	}
	while (i <= q)
	{
		tmp[t++] = A[i++];
	}
	while (j <= r)
	{
		tmp[t++] = A[j++];
	}
	i = p;
	t = 1;
	while (i <= r)
	{
		A[i++] = tmp[t++];
		cnt++;
		if (cnt == K)
		{
			cout << A[i - 1];
			flag = true;
			return;
		}
	}
}

void merge_sort(int A[], int p, int r)
{
	if (p < r)
	{
		int q = floor((p + r) / 2);
		merge_sort(A, p, q);
		merge_sort(A, q + 1, r);
		merge(A, p, q, r);
	}
}

int main(void)
{
	cin >> N >> K;
	for (int i = 0; i < N; i++)
	{
		cin >> A[i];
	}
	merge_sort(A, 0, N-1);
	if (!flag)
		cout << -1;

	return 0;
}

0개의 댓글