728x90
시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율
5 초 8 MB 197399 45716 34498 23.464%

문제

N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.

 

입력

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

 

출력

첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.

 

예제 입력 1 

10
5
2
3
1
4
2
3
5
1
7

예제 출력 1 

1
1
2
2
3
3
4
5
5
7

 

알고리즘 분류

  • 정렬

 

시간 제한

  • Java 8: 3 초
  • Java 8 (OpenJDK): 3 초
  • Java 11: 3 초
  • Kotlin (JVM): 3 초
  • Java 15: 3 초

 

메모리 제한

  • Java 8: 512 MB
  • Java 8 (OpenJDK): 512 MB
  • Java 11: 512 MB
  • Kotlin (JVM): 512 MB
  • Java 15: 512 MB

 

문제 출처

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

 

10989번: 수 정렬하기 3

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

www.acmicpc.net

 

문제 해결 방법

  • 맨 처음엔 벡터(vector) sort() 함수를 이용하여 문제를 해결하려고 하였으나 메모리 초과 오류가 떴다.
  • 그래서 다른 방법을 찾아보다가 10,000 보다 작거나 같은 자연수들을 정렬하는 문제임을 확인하고 배열을 이용하여 1부터 10,000까지의 숫자가 각각 몇 번 나오는지를 체크하여 출력시키는 방법을 이용하기로 하였다.
for (int i = 0; i < N; i++) {
    cin >> num;
    cnt[num]++;
}

for (int i = 0; i < 10001; i++) {
    for (int j = 0; j < cnt[i]; j++) {
        cout << i << '\n';
    }
}
  • cnt[i]의 값이 0이 아닐 경우, i를 cnt[i]의 크기 만큼 출력한다.
    • 예) 2를 2번 입력 받을 경우, cnt[2]의 값은 2가 된다. 2중 for 문을 돌 때, cnt[2]가 2일 경우, i는 2이므로 2가 2번 출력된다.
  • 이번 문제를 풀면서 입력 받는 수의 경우의 수가 적을 경우, 배열을 활용하여 문제를 쉽게 해결할 수 있다는 점을 배울 수 있었다.
  • 입력 받은 수를 다 입력 받아서 배열에 저장하여 문제를 풀 경우, 제한된 8MB의 메모리를 초과한다.
    • 1 ≤ N ≤ 10,000,000, int 형 : 4 Bytes
    • $10^{7} × 4$ Bytes = 40MB

 

코드

#include <iostream>
using namespace std;

int N, num, cnt[10001];

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    cin >> N;

    for (int i = 0; i < N; i++) {
        cin >> num;
        cnt[num]++;
    }

    for (int i = 0; i < 10001; i++) {
        for (int j = 0; j < cnt[i]; j++) {
            cout << i << '\n';
        }
    }
    
    return 0;
}

 

채점 결과

 

참고

  • [단계별로 풀어보기] > [정렬]
  • 브론즈I
728x90