카테고리 없음

[백준 알고리즘] 10989 - 수 정렬하기3

soom22 2023. 7. 9. 23:27
SMALL

수 정렬하기3 문제는 메모리 초과와 시간 초과를 겪고 제출하였다.

import sys

N=int(input())

list=[0]*10001

for i in range(N):
     num=int(sys.stdin.readline())
     list[num]+=1


for i in range(10001):
     if list[i]!=0:
        for j in range(list[i]):
            print(i)
더보기

예제 입력

10
5
2
3
1
4
2
3
5
1
7

예제 출력

1
1
2
2
3
3
4
5
5
7

 

떠올린 접근 방식, 과정

1. '전부 다 입력 다음에 sort하면 되겠다.' 라고 생각해서 배열로 입력받아 코드를 작성했는데 메모리 초과가 떴다.

메모리 초과는 배열을 너무 많이 써서 나는 오류인데

2. 다른 사람들이 푼 방법을 보고 미리 10000개의 공간을 가진 배열에 입력값을 추가하는 방식으로 코드를 작성했다.

그랬더니 시간 초과가 나왔다.

해당 접근 방식에 쓰이는 알고리즘과 판단 사유

어떤 알고리즘이 사용되었는지는 잘 모르겠지만

전체를 배열에 입력하는 것 대신 공간을 미리 만들어두는 방법으로 풀었다.

접근법의 총 시간복잡도

중첩 for문이 있으니깐 O(N^2)이지 않을까 싶다..!

(에러 오류가 발생했다면) 해결 과정

더보기

오류 코드

N=int(input())

list=[]
for i in range(N):
     num=int(input())
     list.append(num)

list=sorted(list)

for i in range(N):
     print(list[i])
N=int(input())

list=[0]*10001

for i in range(N):
     num=int(input())
     list[num]+=1


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

메모리 초과를 해결해야 했다.

전체 값을 다 배열에 저장하고 sort하는 방식은 메모리 초과가 걸려서 10000개의 배열을 만들어두고 해당하는 배열에 +1을 하는 방식으로 문제를 풀었는데 시간 초과가 나왔다.

알고보니 입력값을 for문으로 받을 때 input에서 시간을 많이 빼앗았고 sys을 import하고 sys.stdin.readline()으로 입력값을 받아 시간 초과를 해결했다.