https://www.acmicpc.net/problem/10989
N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.
첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다.
첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.
나는 처음에 브론즈1 문제치고 너무 쉬워서 뭐지? 하고 append와 리스트를 활용해서 문제를 풀었다.
N = int(input())
L = []
for i in range(N) :
num = int(input())
L.append(num)
L.sort()
print(L)
for i in range(N) :
print(L[i])
하지만 제출하고 보니 메모리 초과라는 결과가 나왔고, 조건을 다시 살펴보니 " 첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. " 이런 조건이 있었던 것이다.....!!!!
N의 수가 너무 클 때가 있어 메모리 초과라는 결과가 나왔나보다.
그래서 방식을 바꾸었다.
1. 0이 든 10000칸의 리스트를 미리 만들어 둔다.
2. 입력 받은 숫자와 일치하는 리스트의 주소에 +1을 한다.
3. 출력 시, 10000번 동안 반복하며 리스트의 i번째 칸의 값이 0이 아니면 i 값을 출력
N = int(input())
L = [0]*10001
for i in range(N) :
num = int(input())
L[num] += 1
for i in range(10001) :
if L[i] !=0 :
for j in range(L[i]) :
print(i)
근데 그 다음 결과는 런타임 에러... 뭐가 문제인지 고민하다가 GPT님께 여쭈었다
input() 함수는 반복적으로 호출할 경우 속도가 느릴 수 있습니다. 대신, sys.stdin.readline를 사용하여 입력 속도를 높일 수 있습니다. 특히 데이터 크기가 큰 경우 유용합니다.
import sys
input = sys.stdin.read
import sys
N = int(sys.stdin.readline())
L = [0]*10000
for i in range(N):
a = int(sys.stdin.readline())
L[a-1] += 1
for k in range(10000):
if L[k] != 0:
for j in range(L[k]):
print(k+1)
여담,, 실패는 힘들어
