백준 문제 풀이/수학

10989 수 정렬하기 3 (python)

한사공사 2024. 6. 26. 11:04

시도 1 (실패)

import sys
 
n = int(sys.stdin.readline())

for _ in range(n):
    m = list(int(sys.stdin.readline().strip()))
    list.sort()

print(m)
   

 

m = list(int(sys.stdin.readline().strip()))

이라는 문장은 성립 불가능

 

int(sys.stdin.readline().strip())으로 정수를 읽어온 후, 이를 다시 리스트로 변환하려고 시도했음

 

하지만 int 객체는 반복 가능하지 않다

따라서 list(int(...)) 구문이 TypeError: 'int' object is not iterable 오류를 발생시킴

 

시도 2 (실패)

import sys

n = int(sys.stdin.readline().strip())

numbers = []
for _ in range(n):
    m = int(sys.stdin.readline().strip())
    numbers.append(m)

numbers.sort()

for i in numbers:
    print(i)

답은 성공적으로 나왔지만

메모리 초과

 

for문 속에서 append를 사용하게 되면 메모리 재할당이 이루어져서 메모리 초과가 발생했다

 

메모리를 더 줄일 수 있는 방법을 찾아야 한다.

입력을 다시 살펴보면

첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다.

둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 10,000보다 작거나 같은 자연수라고 한다.

 

그러면 수는 최대 10,000개 들어올 수 있고 중복으로 10,000,000까지 가능하다는 것이기에

배열을 사용해 10001개까지 만들어서 그 안에 저장하는 방식을 사용해봤다.

 

시도 3 (성공)

import sys

n = int(sys.stdin.readline())
arr = [0]*10001

for _ in range(n):
    num = int(sys.stdin.readline())
    arr[num] += 1

for i in range(10001):
    if arr[i] != 0:
        for j in range(arr[i]):
            print(i)

10001 길이(0번째 배열 포함)의 배열을 선언해서 만약 숫자 1이 두개라면

배열[1] = 2로 지정하고 숫자 1을 두 번 print 하는 방식으로 풀었다.

 

---

그리고 찾아보니 pypy3이 python보다 빠르다고 들어 pypy3으로 제출하고 있었는데,

메모리는 python보다 pypy3이 더 많았다.

메모리 초과가 발생할 때는 python으로, 시간 초과가 발생했을 때는 python으로 제출하는 것도 답인 것 같다.

 

'백준 문제 풀이 > 수학' 카테고리의 다른 글

1541 잃어버린 괄호 (python)  (0) 2024.07.06
1193 분수찾기 (python)  (0) 2024.07.02
15829 Hashing (python)  (0) 2024.06.27
11050 이항 계수 1 (python)  (0) 2024.06.26
2738 행렬 덧셈 (python)  (0) 2024.06.26