🚨 메모리 제한이 8M이다.
문제
N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.
입력
첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다.
출력
첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.
전체 코드
import sys
N = int(input())
# 인덱스에 해당하는 숫자의 개수를 값으로 담을 배열
count = [0] * 10001
# count의 배열에서 정렬할 숫자의 인덱스에 해당하는 값을 1씩 증가한다.
for _ in range(N):
count[int(sys.stdin.readline())] += 1
# count 배열을 돌면서, 값만큼 index를 출력한다.
for i in range(10001):
for _ in range(count[i]):
print(i)
메모리 제한이 8M로 아주 작기 때문에
최대한 메모리를 사용하지 않는 방법으로 풀어야 한다.
정렬해야 하는 숫자가 10,000보다 작거나 같다고 정해져 있으므로,
도수 정렬(계수 정렬)을 활용할 수 있다.
배열을 활용하는 정렬이다.
배열을 하나 만들어서 정렬해야 하는 숫자에 해당하는 인덱스의 값으로
그 숫자가 등장한 횟수를 저장한다.
# 인덱스에 해당하는 숫자의 개수를 값으로 담을 배열
count = [0] * 10001
# count의 배열에서 정렬할 숫자의 인덱스에 해당하는 값을 1씩 증가한다.
for _ in range(N):
count[int(sys.stdin.readline())] += 1
입력 받을 수의 개수가 1 ≤ N ≤ 10,000,000
라서 입력받은 값조차 배열에 저장하면 안된다.
배열에 저장하면 메모리 초과된다 🙁 ㅠㅠ
값을 배열에 저장하지 말고, 입력 받자마자 정렬을 위한 배열에 정보를 저장해버려야 한다.
여기서 정보는 이 값의 등장 횟수!!
# count 배열을 돌면서, 값만큼 index를 출력한다.
for i in range(10001):
for _ in range(count[i]):
print(i)
여기서 중요한 점은, 값이 아닌 index를 출력하는 것이다!!
백준에서 언어를 Python3이 아닌 PyPy3으로 지정한다면 출력할 때 print(i)
가 아닌
sys.stdout.write(str(i)+"\n")
를 써야한다 🌟🔥