반응형
문제
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
문제풀이
병합정렬 코드를 구현하고, 임시배열 리스트를 배열에 복사할 때마다 count 변수를 통해 저장 횟수를 센다.
count와 K가 같을 때 저장되는 수를 출력하고, 마지막에 count 변수가 저장횟수 K 보다 작은지 확인하여 -1을 출력한다.
#include <stdio.h>
#define NUM 500000
int sorted[NUM];
int num, count=0;
void merge(int list[], int left, int mid, int right){
int i,j,k,l;
i=left; //왼쪽 배열의 첫 인덱스
j=mid+1; //오른쪽 배열의 첫 인덱스
k=left; //임시 배열 인덱스
// 합병
while(i<=mid && j<=right){
if (list[i]<=list[j]){
sorted[k++]=list[i++];
}
else {
sorted[k++]=list[j++];
}
}
if (i>mid){ // 오른쪽 배열의 남아있는 값
for (l=j; l<=right; l++){
sorted[k++]=list[l];
}
}
else { // 왼쪽 배열의 남아있는 값
for (l=i; l<=mid; l++){
sorted[k++]=list[l];
}
}
// 임시배열(sorted) 리스트를 배열 list로 복사
for (l=left; l<=right; l++){
list[l]=sorted[l];
count++;
if (count==num){
printf("%d\n",list[l]);
}
}
}
void merge_sort(int list[], int left, int right){
int mid;
if (left<right){
mid=(left+right)/2;
merge_sort(list, left, mid);
merge_sort(list, mid+1, right);
merge(list, left, mid, right);
}
}
int main(){
int i;
int n;
scanf("%d %d", &n, &num);
int list[n];
for (i=0; i<n; i++){
scanf("%d",&list[i]);
}
// left : 배열의 시작, right : 배열의 끝
merge_sort(list, 0, n-1);
if (count<num){
printf("-1\n");
}
return 0;
}
반응형
'programming > c' 카테고리의 다른 글
qsort() (1) | 2023.10.01 |
---|---|
[CodeUp] 1079-1092 (ing) (0) | 2023.09.28 |
배열 길이 (0) | 2023.04.17 |
합병정렬(merge sort) (0) | 2023.01.14 |
error: variable-sized object may not be initialized (0) | 2023.01.14 |