본문 바로가기
백준 문제 풀이 & C++ 공부

백준 2751번 C/C++

by daisy0461 2021. 2. 15.

www.acmicpc.net/problem/2751

 

2751번: 수 정렬하기 2

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

www.acmicpc.net

이 문제는 제가 알고리즘 공부에 올렸었던 merge sort를 활용하면 쉽게 풀 수 있습니다.

하지만 제가 올렸던 그대로 merge sort를 사용하면 아마 풀리지 않으실 것입니다.

그 이유는 배열의 크기 때문인데요. 배열의 크기가 충분하지 않아서 그렇습니다.

제가 풀었던 코드는 다음과 같습니다.

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
int b[10000000];
void merge(int a[], int low, int mid, int high) {		//머지소트
	
	int i = low, j = mid + 1, k = 0;

	while (i <= mid && j <= high) {
		if (a[i] <= a[j]) {
			b[k] = a[i];
			i++;
			k++;
		}
		else {
			b[k] = a[j];
			j++;
			k++;
		}
	}

	while (i <= mid) {
		b[k] = a[i];
		i++;
		k++;
	}

	while (j <= high) {
		b[k] = a[j];
		j++;
		k++;
	}
	k--;
	while (k >= 0) {
		a[low + k] = b[k];
		k--;
	}

}
void mergesort(int a[], int low, int high) {
	if (low < high) {
		int m = (low + high) / 2;

		mergesort(a, low, m);

		mergesort(a, m + 1, high);

		merge(a, low, m, high);
	}
	else {
		return;
	}
}

int su[10000000];
int main()
{
	int n;
	
	scanf("%d", &n);	//수의 개수
	for (int i = 0; i < n; i++) {
		scanf("%d", &su[i]);
	}

	mergesort(su, 0, n-1);

	for (int i = 0; i < n; i++) {
		printf("%d\n", su[i]);
	}

}

 merge sort를 잘 사용할 수 있다면 바로 풀 수 있는 문제였습니다. 

'백준 문제 풀이 & C++ 공부' 카테고리의 다른 글

백준 10250번 C/C++  (0) 2021.02.16
백준 10989 C/C++  (0) 2021.02.16
백준 2292번 C/C++  (0) 2021.02.12
백준 2231번 C/C++  (0) 2021.02.08
백준 2614번 C/C++  (0) 2021.02.08