공부/BAEKJOON
[C++] 백준 2750번: 수 정렬하기
knhoo
2025. 1. 11. 11:39
728x90
https://www.acmicpc.net/problem/2750
문제
N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오
제출 코드
#include<iostream>
using namespace std;
int N;
int arr[1000];
void merge(int arr[], int left,int mid, int right) {
int n1 = mid - left + 1; //왼쪽 배열의 크기
int n2 = right - mid; //오른쪽 배열의 크기
//임시 배열 생성
int* leftArr = new int[n1];
int* rightArr = new int[n2];
for (int i = 0; i < n1; i++)
leftArr[i] = arr[left + i];
for (int i = 0; i < n2; i++)
rightArr[i] = arr[mid + 1 + i];
int i = 0, j = 0, k = left;
while (i < n1 && j < n2) {
if (leftArr[i] <= rightArr[j]) {
arr[k] = leftArr[i];
i++;
}
else {
arr[k] = rightArr[j];
j++;
}
k++;
}
while (i < n1) {
arr[k] = leftArr[i];
i++;
k++;
}
while (j < n2) {
arr[k] = rightArr[j];
j++;
k++;
}
delete[] leftArr;
delete[] rightArr;
}
void mergesort(int arr[],int left,int right) {
if (left < right) {
int mid = left + (right - left) / 2;
mergesort(arr, left, mid);
mergesort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
}
int main() {
cin >> N;
for (int i = 0; i < N; i++) {
cin >> arr[i];
}
mergesort(arr, 0, N - 1);
for (int i = 0; i < N; i++) {
cout << arr[i] << endl;
}
return 0;
}
설명
시간제한이 2초이므로 2억 번 이하의 연산 횟수로 문제를 해결해야 한다.
버블 정렬 = (1,000,000)^2 > 200,0000,000 -> 부적합
병합 정렬 = 1,000,000log2(1,000,000) = 약 20,000,000 < 200,000,000-> 적합
728x90