[알각코] 백준 10989번 - 수 정렬하기 3

백준 10989번

num = int(input())

numList = []
while num > 0:
  numList.append(input())
  num -= 1

print('\n'.join(sorted(numList)))

Screen Shot 2021-08-29 at 1 59 45 PM

앗…메모리 초과라니..

import sys

num = int(sys.stdin.readline())

numList = []
while num > 0:
  numList.append(sys.stdin.readline())
  num -= 1

sys.stdout.write(''.join(sorted(numList)))

Screen Shot 2021-08-29 at 2 04 09 PM

앗 또 메모리 초과당…

다시 살펴보니 2751번인 수 정렬하기 2 문제는 256MB 였는데 이번 문제는 8MB여따…헉

import sys

num = int(sys.stdin.readline())

numList = [0] * 10000000
for i in range(1, num+1):
  numList[i] = int(sys.stdin.readline())

sys.stdout.write(''.join(map(str, sorted(numList))))

Screen Shot 2021-08-29 at 6 12 36 PM

메모리 제한이 있을 경우 리스트 틀을 미리 만들어 놓고 증감식으로 개수를 세는 것이 유리하다는데… 난 사실 무슨 말인지 한 번에 못 알아들었당

그래서 일단 리스트를 한번에 불리고 그 리스트에 숫자를 집어넣었는데…결과는 같았음

import sys

num = int(sys.stdin.readline())

numList = [0] * 10000
for i in range(num):
  numList[int(sys.stdin.readline())] += 1

for i in range(10000):
  for j in range(numList[i]):    
    print(i)

그래서 참고한 사이트의 코드를 잘 뜯어보니..

수는 1~10000 사이가 올 수 있으니까 10000개의 빈(0) 리스트를 먼저 만들어놓는다.

그리고 받아오는 input에 따라 해당 리스트 input번째를 1개씩 늘리는 것이다.

그렇게 하면 input 번쨰의 숫자가 몇번 들어오는지도 중복된 개수를 셀 수 있으면서 10000개가 들은 리스트로 소팅 필요없이 끝낼 수 있는 것이다!

그래서 메모리를 적게 쓰고 문제를 통과할 수 있을듯!

Screen Shot 2021-08-29 at 10 17 46 PM

했는데 오잉?! 왜 틀렷지…

import sys

num = int(sys.stdin.readline())

numList = [0] * 10001
for i in range(num):
  numList[int(sys.stdin.readline())] += 1

for i in range(len(numList)):
  for j in range(numList[i]):    
    print(i)

잘 생각해보니, 1~10000개까지 숫자가 나올 수 있다했는데, 리스트는 0번째부터 시작이고, 우리는 0번째는 제외하고 첫 번째 리스트부터 사용하니, 10001개가 들어있는 리스트를 사용해야 알맞다!

Screen Shot 2021-08-29 at 10 44 01 PM

Reference