시간 제한
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로 제한돼있는 문제라서 그런지 풀이가 다들 똑같아서 굳이 다루지 않음