Algorithm/Problems

[백준/파이썬] 10989번 수 정렬하기3

공부좀하시졍 2022. 11. 8. 11:54

https://www.acmicpc.net/problem/10989

 

10989번: 수 정렬하기 3

첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다.

www.acmicpc.net

틀린코드❌

import sys
input = sys.stdin.readline

nums = []
n = int(input())

for i in range(n):
  num = int(input())
  nums.append(num)

for i in sorted(nums):
  print(i)

 

문제만 보면 어려운 문제가 아니다. 하지만, 시간초과, 메모리초과 때문에 고려해야할 것이 있는 것 같다.

 

import sys
input = sys.stdin.readline

nums = [0]*10000
n = int(input())

for i in range(n):
  nums[int(input())-1] += 1

for i in range(10000):
  if nums[i] != 0:
    for j in range(nums[i]):
      print(i+1)

우선, 여러개를 입력 받을 때, input() 함수보다 sys.stdin.readline() 으로 사용했을 때 빠르다.

그리고 for문에서 append를 사용하면 메모리 재할당이 이루어지기 때문에 메모리를 효율적으로 사용하지 못한다고 한다.

 

문제를 보면 10000개까지 입력 가능하다고 하니 0으로 초기화 된 배열 10000개를 생성한 후 입력값-1 인덱스 값을 +1 해준다. 그리고 10000번 for문을 돌려 배열값이 0이 아닌 경우 출력해주면 따로 정렬을 하지 않아도 된다.

이때, for문을 사용하는 이유는 같은 수가 여러번 들어갔을 경우를 고려한 것이다.

 

✨ sys.stdin.readline 사용법

📢 sys.stdin.readline()은 한줄 단위로 입력받기 때문에, 개행문자가 같이 입력된다.

 

참고 url : https://velog.io/@yeseolee/Python-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%85%EB%A0%A5-%EC%A0%95%EB%A6%ACsys.stdin.readline