반응형
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_sort와 merge가 주어졌으므로 이를 활용하여 저장 횟수에 맞는 결과를 출력하면 된다.
출력 횟수를 count하는 전역변수를 하나 만들고, 함수 안에 k를 하나 더 추가해서 비교를 하도록 한다.
- 풀이
#include <iostream>
using namespace std;
int inputcnt = 0;
void merge(int *s, int p, int q, int r, int k)
{
int i = p, j = q + 1, t = 1;
int tmp[r + 2];
while (i <= q && j <= r)
{
if (s[i] <= s[j])
{
tmp[t++] = s[i++];
}
else
{
tmp[t++] = s[j++];
}
}
while (i <= q)
{
tmp[t++] = s[i++];
}
while (j <= r)
{
tmp[t++] = s[j++];
}
i = p;
t = 1;
while (i <= r)
{
s[i++] = tmp[t++];
if (++inputcnt == k)
cout << tmp[t - 1];
}
}
void merge_sort(int *s, int p, int r, int k)
{
int q;
if (p < r)
{
q = (p + r) / 2;
merge_sort(s, p, q, k);
merge_sort(s, q + 1, r, k);
merge(s, p, q, r, k);
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int p[500002];
int N, K;
cin >> N >> K;
for (int i = 0; i < N; i++)
{
cin >> p[i];
}
merge_sort(p, 0, N - 1, K);
if (inputcnt < K)
{
cout << -1;
}
return 0;
}
- 새롭게 알게 된 점
X
반응형
'Algorithm > Baekjoon BOJ' 카테고리의 다른 글
[백준][C++] 10815 : 숫자 카드 (0) | 2022.10.13 |
---|---|
[백준][C++] 14425 : 문자열 집합 (0) | 2022.10.13 |
[백준][C++] 25501번 : 재귀의 귀재 (1) | 2022.10.11 |
[백준][파이썬] 3053번 : 택시 기하학(코드, 해설, 풀이) (0) | 2022.05.06 |
[백준][파이썬] 14890번 : 경사로(코드, 해설, 풀이) (0) | 2022.05.06 |