728x90
320x100
24060번: 알고리즘 수업 - 병합 정렬 1
첫째 줄에 배열 A의 크기 N(5 ≤ N ≤ 500,000), 저장 횟수 K(1 ≤ K ≤ 108)가 주어진다. 다음 줄에 서로 다른 배열 A의 원소 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 109)
www.acmicpc.net
반응형
📌 접근 방법
- 합병정렬을 이용하여 풀었다.
✔ 합병정렬(Merge Sort)
- 배열이 2 개의 배열로 분할되고 크기가 1/2로 감소하는 분할 정복 알고리즘
- 크기가 n인 배열을 n/2 크기의 2개의 배열로 분할하는 것을 반복
- 더이상 분할할 수 없을 때 오름차순으로 다시 정렬하며 합병하는 것 !
- 성능 : nlogn
✅ Pass Code
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<iterator>
#include<map>
#include<set>
#include<unordered_set>
#include <stack>
#include<queue>
#include<deque>
using namespace std;
int cnt=0,K,result=-1;
void mergeSort(int p, int r, int *arr){
if(p>=r)return ;
int q=(p+r)/2;
mergeSort(p,q,arr);
mergeSort(q+1,r,arr);
int i=p,j=q+1,k=1;
int tmp[r];
while(i<=q&&j<=r){
if(arr[i]<=arr[j]){
tmp[k++]=arr[i++];
}
else{
tmp[k++]=arr[j++];
}
}
while(i<=q){
tmp[k++]=arr[i++];
}
while(j<=r)tmp[k++]=arr[j++];
i=p,k=1;
while(i<=r){
arr[i]=tmp[k];
cnt++;
if(cnt==K)result=arr[i];
i++,k++;
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N;
cin>>N>>K;
int arr[N];
for(int i=0; i<N; i++){
cin>>arr[i];
}
mergeSort(0,N-1,arr);
cout<<result;
return 0;
}
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/002.gif)
728x90
반응형
'Coding Test > Baekjoon' 카테고리의 다른 글
[BOJ/백준/C++] 17103번 골드바흐 파티션 (2) | 2024.01.28 |
---|---|
[BOJ/백준/C++] 4779번 칸토어 집합 (0) | 2024.01.28 |
[BOJ/백준/C++] 5430번 AC (1) | 2024.01.28 |
[BOJ/백준/C++] 1021번 회전하는 큐 (0) | 2024.01.28 |
[BOJ/백준/C++] 1966번 프린터 큐 (0) | 2024.01.28 |