티스토리 뷰

수 정렬하기 3

시간 제한 : 5초 | 메모리 제한 : 8 MB

문제

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

내 풀이

def counting_sort(arr):
    max_arr = max(arr)
    count = [0] * (max_arr + 1)
    sorted_arr = list()

    for i in arr:    # 카운팅
        count[i] += 1

    for i in range(max_arr + 1):
        for _ in range(count[i]):
            sorted_arr.append(i)
    return sorted_arr

풀면서 생겼던 오류들

  • 시간 초과 : sys 사용으로 해결! sys.stdin.readline()을 좀 더 생활화해야겠음
  • 메모리 초과 : 숫자가 최대 10,000개 입력되기 때문에 이 숫자들을 list에 저장하려고 하면 메모리가 초과됨. for문으로 처리!

 


 

카운팅 정렬 Counting Sort

= 계수 정렬
: 배열에 존재하는 수의 개수를 세어주고, 이를 바탕으로 정렬

  • $$O(n+k)$$의 시간 복잡도를 가진 정렬, 이때 $k$ : 정렬을 수행할 배열의 가장 큰 값

1. 배열을 이용한 방식

def counting_sort(arr):
    count = dict()
    sorted_arr = list()

    for i in arr:
        if i in count:
            count[i] += 1
        else:
            count[i] = 1

    for i in sorted(count.keys()):
        for _ in range(count[i]):
            sorted_arr.append(i)
    return sorted_arr
  • key: value = 배열의 원소: 해당 원소의 개수

단점

계수 정렬은 정렬하고자 하는 배열의 최대값이 매우 클 때 메모리를 매우 비효율적으로 사용함

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함