코딩테스트/백준

[백준][Python] 10989. 수 정렬하기 3

내만 2022. 7. 19. 12:09
728x90
반응형

 

 

 

 

 

 

🙆‍♂️문제


 

 

🙋‍♂️풀이


이번 문제는 계수 정렬을 활용해서 푸는 문제입니다.

 

 

🚀 입력받기


import sys
n= int(sys.stdin.readline())
arr = [int(sys.stdin.readline())for _ in range(n)]

sys 라이브러리를 import 하여 더 빠르게 입력되어서 시간 초과가 되지 않도록 했습니다.

 

 

🚀 계수 정렬


def countSort(arr):
    length = len(arr)
    minNum = min(arr)
    maxNum = max(arr)

    #카운팅 배열 구하기
    alpha = maxNum - minNum + 1
    cntArr = [0]*alpha

    for i in arr:
        j = i - minNum
        cntArr[j]+=1

    #누적 카운팅 배열 구하기
    accArr = []
    accCnt=0
    for i in cntArr:
        accCnt+=i
        accArr.append(accCnt)

    #최종 인덱스 배열 구하기
    endIdxArr = [a-1 for a in accArr]

    #정렬 배열 구하기
    sortArr = [0]*length
    for i in reversed(arr):
        cntIdx = i - minNum
        endIdx = endIdxArr[cntIdx]
        sortArr[endIdx] = i
        endIdxArr[cntIdx]-=1

    return sortArr

sortArr = countSort(arr)

카운팅 정렬 함수를 만들어서 사용했습니다. 

자세한 내용은 계수 정렬 이 곳에 정리되어 있습니다.

 

🚀 출력하기


for i in sortArr:
    print(i)

반복문을 사용하여 정렬된 배열을 출력했습니다.

 

그런데 이제 이렇게 하면 메모리 초과가 납니다. 그래서 엄청나게 축약시켜줍니다.

 

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

cntArr = [0]*10001
for i in range(n):
    cntArr[int(sys.stdin.readline())] +=1

for i in range(len(cntArr)):
    for j in range(cntArr[i]):
        print(i)

최종 코드 입니다.

 

728x90
반응형