말감로그

[백준] 10989 수 정렬하기3 (파이썬) 본문

백준

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

habbn 2024. 2. 21. 13:42
728x90
 

10989번: 수 정렬하기 3

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

www.acmicpc.net

문제

N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.

입력

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

출력

첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.

예제 입력 1 복사

10
5
2
3
1
4
2
3
5
1
7

예제 출력 1 복사

1
1
2
2
3
3
4
5
5
7

 


풀이

 

이 문제는 시간초과나 메모리 초과가 없다면 굉장히 쉬운 문제이다.

그러나 메모리 초과가 걸리면서 메모리를 줄이기 위해 코드를 짜야했다.

 

내가 푼 코드 (메모리 초과 코드)
import sys
input = sys.stdin.readline

n = int(input())
nums =[]
for i in range(n):
    nums.append(int(input()))
    
nums.sort()

for s in nums:
    print(s)

 

빈 리스트를 만들어서 입력값을 하나씩 append하고 오름차순으로 정렬해서 출력하는 코드를 짰는데

메모리 초과로 틀렸다.

 

정답 코드
import sys
input = sys.stdin.readline

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

for _ in range(n):
    nums[int(input())] += 1
    
for i in range(10001):
    if nums[i] != 0:
        for j in range(nums[i]):
            print(i)

 

for 문 속에서 append를 사용하게 되면 메모리 재할당이 이루어져서 메모리를 효율적으로 사용하지 못한다.

그래서 입력값이 10000개까지 주어질 수 있으니 10000개 만큼의 리스트를 만들어 놓고(인덱스는 0부터 시작하니까 10001개 생성) 리스트에 각 요소마다 0을 할당하여 입력값을 받을 때마다 그 입력값과 같은 인덱스에 +1씩 해준다.

입력을 다 받고나서 0보다 큰 요소를 갖는 인덱스들을 찾아서 그 수만큼 인덱스를 출력해주면 된다.

 

파이썬은 내장함수를 사용하면 메모리를 효율적으로 관리할 수 있다.

728x90