본문 바로가기

알고리즘/백준

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

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

 

10989번: 수 정렬하기 3

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

www.acmicpc.net

# 백준 10989 수 정렬하기 3

import sys
n = int(input())
num=[]
for _ in range(n):
  num.append(int(sys.stdin.readline()))
for i in sorted(num):
  print(i)

# 메모리 초과 뜸
# append를 할 때마다 메모리 재할당이 발생한다고 함

이 전과 비슷하게 진행하면 메모리 초과 에러발생 

append로 리스트에 요소를 추가 할 때마다 메모리 재할당이 일어난다고 합니다.

재귀에서 메모이제이션 활용해서 문제 푸는것과 비슷하게 진행 해봤습니다.

import sys
n = int(input())

a = [0] * 10001  # 1
for _ in range(n):  # 2
  # num = int(sys.stdin.readline())
  num = int(input())
  a[num] += 1  # 3

for i in range(len(a)):  # 4
  if a[i] != 0:  # 5
    for _ in range(a[i]):  # 6
      print(i)  # 7

# 1 : 먼저 0으로 이루어지고 인덱스가 0 ~ 10000까지 있는 리스트 생성( n의 범위가 1에서 10000까지이기 때문)

# 2 : n번 반복해서 수 입력 받음

# 3 : 입력 받은 수를 a의 index로 하고 거기에 1을 더해줌

# 4 : a의 인덱스를 처음부터 훑어줌

# 5 : a의 요소가 0이 아닌 경우만 생각 ( 인덱스에 해당하는 값이 위에서 입력으로 들어왔다는 뜻)

# 6 : 해당 요소의 값 만큼 반복 ( 해당 인덱스의 값이 입력으로 들어온 횟수)

# 7 : 해당 인덱스 출력

 

  • 위에 num = int(input()) 으로 진행하면 시간 초과뜨니까 num = int(sys.stdin.readline())으로 진행하면 됩니다.