본문 바로가기
알고리즘/BOJ

[BOJ] 10989. 수 정렬하기 3 (Counting Sort)

by hyerann 2019. 4. 28.

https://www.acmicpc.net/problem/10989

 

10989번: 수 정렬하기 3

첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다.

www.acmicpc.net

처음에 Counting Sort로 풀라길래 정석적인 Counting Sort로 풀었는데 메모리 초과가 나서 게시판을 참고해서 줄이고 줄여서 풀었다.

원래 정렬 전 배열과 정렬 후 배열도 가지고 있었는데 N이 10,000,000 이하이기 때문에 10,000,000짜리 배열을 두 개나 가지고 있으니 메모리 차지를 많이 할 수 밖에 없었다.

그래서 입력 받은 수를 배열에 저장하지 않고 바로 numbersCnt 배열로 계수만 관리해주었다.

또, 이를 배열에 저장하면서 정렬할 필요없이 numbersCnt 배열의 index와 값을 이용해서 정렬된 결과를 쭉 출력해주었다.

#include <iostream>
#include <ios>
using namespace std;

int N, maxN;
int numbersCnt[10001];
void countingSort();
void print();

int main() {
	cin.tie(0); ios::sync_with_stdio(0);
	cin >> N;
	maxN = -2e9;
	for (int i = 0; i < N; i++) {
		int temp;
		cin >> temp;
		numbersCnt[temp]++;
		maxN = maxN < temp ? temp : maxN;
	}
	countingSort();
	return 0;
}

void countingSort() {
	for (int i = 1; i <= maxN; i++) {
		for (int j = 0; j < numbersCnt[i]; j++) {
			cout << i << "\n";
		}
	}
}

'알고리즘 > BOJ' 카테고리의 다른 글

[BOJ] 11866. 요세푸스 문제 0  (0) 2020.03.25
[BOJ] 3052. 나머지 (vector 중복 제거)  (0) 2019.07.03
[BOJ] 2750. 수 정렬하기 (Bubble Sort)  (0) 2019.04.27
[BOJ] 1934. 최소공배수  (0) 2019.04.23
[BOJ] 15666. N과 M (12)  (0) 2019.04.21

댓글