10989번: 수 정렬하기 3

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

www.acmicpc.net

시간 제한

5초

메모리 제한

8MB

문제

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

나의 풀이

  • 입력이 100만개 이기 때문에 sys.stdin.readline().rstrip()으로 입력 받음
  • 입력되는 숫자의 범위가 1~10000이므로 Count(계수)정렬 사용

 

처음 풀이

메모리 초과 발생

  • 입력 값의 최대 최소를 알아내기 위해서 n_list에 입력 저장
  • 입력 값의 최대 최소를 알아내 Count 리스트를 줄이는 것보다 n_list(100만개의 성분)로 인해 손해보는 것이 더 큼
import sys

n = int(input())
# for _ in range(n) : 반복 부분
n_list = [int(sys.stdin.readline().rstrip()) for _ in range(n)]
n_max, n_min = max(n_list), min(n_list) 
#idx 0 = 1
count = [0] * (n_max - n_min + 1)

for i in n_list:
    count[i - n_min] += 1

for i in range(len(count)):
    for j in range(count[i]):
        print(i + n_min)

 

최종 풀이

입력 값이 1~10000으로 제한 돼있으므로 값을 받으면서 동시에 count를 수행하는 방향으로 수정

이를 통해 기존 100만개를 저장했던 풀이와 달리 메모리 절약 가능

import sys

n = int(input())
n_list = [0] * 10000

for i in range(n):
    n_list[int(sys.stdin.readline().rstrip()) - 1] += 1

for i in range(len(n_list)):
    for j in range(n_list[i]):
        print(i + 1)

다른 사람 풀이

메모리가 8MB로 제한돼있는 문제라서 그런지 풀이가 다들 똑같아서 굳이 다루지 않음