[C++] 백준 10989 수 정렬하기 3
2021. 3. 1.
반응형

www.acmicpc.net/problem/10989

 

10989번: 수 정렬하기 3

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

www.acmicpc.net

 

1. 서론

 

coding-log.tistory.com/66?category=954740

 

[C++] 백준 1427 소트인사이드

www.acmicpc.net/problem/1427 1427번: 소트인사이드 첫째 줄에 정렬하고자하는 수 N이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이다. www.acmicpc.net 1. 서론 나에게 엄청 추억인 문제다... 막 3학..

coding-log.tistory.com

이 문제의 두 번째 방법을 이용하면 쉽게 풀 수 있는 문제! 

 

2. 문제 풀이

 

n개의 수가 주어졌을 때, 이 수들을 오름차순으로 정렬해서 출력하는 코드를 짜야한다. 이때 n의 범위는 1~ 100000000이며, 숫자는 10000보다 작거나 같은 자연수이다. 즉, 1~ 10000까지의 수인 것이다. 

 

안될 것 같긴 했지만 일단 벡터로 코드를 짰다가 메모리 초과가 났다. n의 범위가 억 이여서 그런지 당연한 일이긴 했다.

그러다가 갑자기 소트인사이드에서 썼던 방법이 생각났다. 

숫자가 입력되면 해당 Index를 가진 배열의 값을 + 1 해주는 것이다. 그럼 그 숫자가 몇 번 나왔는지가 배열에 저장된다. 이 숫자의 범위는 1~ 10000까지이기 때문에 메모리 초과가 날 일이 없다. 그렇게 n개의 수가 전부 입력되고 나면 오름차순으로 입력된 값을 출력하면 된다.

 

이렇게 푸는 방법을 계수정렬이라 하며 수의 범위가 작을 때만 사용할 수 있다고 한다. (이 문제의 경우 수의 범위가 1~10000)

 

3. 코드 설명

 

#include <cstdio>

using namespace std;

int main()
{
    int n, i, j, t;
    int a[10001];

    for (i = 0; i < 10001; i++)
        a[i] = 0;

    scanf("%d", &n);

    for (i = 0; i < n; i++)
    {
        scanf("%d", &t);
        a[t]++;
    }

    for (i = 0; i < 10001; i++)
        for (j = 0; j < a[i]; j++)
            if(a[i] != 0)
                printf("%d\n", i);
}

 

자연수를 담을 배열을 0으로 초기화 한다.

그리고 n을 입력받은 후, 배열에 숫자의 수만큼 count 한다.

그리고 순서대로 count 한 만큼 반복해서 출력하면 된다.

 

주의할 점은 자연수의 범위이다. 깜빡하고 그냥 10000이라고 적었는데 10000 값도 포함해야 하기 때문에 10001까지로 바꿔서 적었다.

그리고 억 개의 케이스가 있기 때문에 시간 초과를 막기 위해서 scanf, printf를 사용했다.

 

 

 

 

반응형

'Algorithm' 카테고리의 다른 글

[C++] 백준 11004 K번째 수  (0) 2021.03.26
[C++] 백준 2003 수들의 합 2  (0) 2021.03.10
[C++] 백준 11650 좌표 정렬하기  (0) 2021.02.27
[C++] 백준 10814 나이순 정렬  (0) 2021.02.27
[C++] 백준 1427 소트인사이드  (0) 2021.02.27
myoskin