백준 문제풀이/실버5
백준 10989번 - 수 정렬하기 3 (using counting sort)
void_melody
2021. 12. 16. 04:29
https://www.acmicpc.net/problem/10989
10989번: 수 정렬하기 3
첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다.
www.acmicpc.net
시간도 시간인데 메모리 제한이 8mb이다. 일반적으로 값을 입력받아서 이걸 배열에 저장해서 다른 정렬방법을 사용하면 배열에 저장하고 새로운 배열 만들고 그러는데 메모리가 너무 초과된다.
그러던 중 알아보다가 counting sort, 이번 알분에서 배운 알고리즘을 사용할 수 있는 문제라 사용해보았다.
우선 counting sort는 말 그대로 해당 숫자가 몇 개인지 세는 것이다.
예를 들어 내가 5개를 입력한다 가정해보자(5 7 2 2 4)
이러면 배열 index에 맞게 arr[2] = 2; arr[5] = 1; arr[7] = 1; 이런 식으로 저장하는 거지.
그리고 나서 그냥 배열 안의 수만큼 index를 출력해주면 되겠지.
#include <iostream>
#define MAX 10000
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N;
cin >> N;
int arr[MAX+1] = { 0 };
for (int i = 0; i < N; i++)
{
int input;
cin >> input;
arr[input]++;
}
for (int i = 1; i <= MAX; i++)
{
for (int count = 0; count < arr[i]; count++)
{
cout << i << '\n';
}
}
return 0;
}
arr[MAX+1] 인 이유는 말 그대로 배열은 0부터 시작이니까. 하지만 내가 원하는건 1부터 10000까지라 +1 해준거지.