백준 10989 - 수 정렬하기 3 (Python3)
코드
메모리 초과
# 메모리 초과
n = int(input())
nums = []
for _ in range(n):
nums.append(int(input()))
nums.sort()
for n in nums:
print(n)
계수 정렬 사용 (Python3 사용해야함)
import sys
n = int(sys.stdin.readline())
nums = [0] * 10001
for _ in range(n):
# 숫자를 입력받으면 그 값에 해당하는 리스트의 인덱스에 +1
nums[int(sys.stdin.readline())] += 1
for i in range(len(nums)):
# 입력받은 숫자만 고려하면 됨 => 0인 경우는 입력을 받지 않음
if nums[i] != 0:
# 해당 인덱스에 들어있는 값 => 입력받은 횟수
# 그 값 만큼 반복해서 해당 인덱스 즉, 입력받은 값을 출력
for j in range(nums[i]):
print(i)
문제 해설
문제의 조건을 봤을 때, 단순하게 풀면 안 될 거 같았다. 기본적으로 구현해보니, 메모리 초과가 발생하였다. 흔히 시간 복잡도에서의 에러 발생이 많았는데 메모리 초과를 보니 좀 신선한 느낌이었다. 결국 계수 정렬을 이용해서 문제를 풀었고 정답을 맞추었다.
이 문제의 경우 2가지 배움이 있었는데
1. 단순히 list의 append를 사용할 시, 메모리의 재할당이 발생하여 공간 복잡도 면에서 불리하다.
- append를 사용하면 list의 크기를 하나 하나 늘려가면서 메모리르 재할당하므로 느려진다.
2. Pypy3의 경우 Python3보다 시간 복잡도면에서는 유리하나 공간 복잡도면에서는 불리하다.
댓글남기기