티스토리 뷰
📌계수 정렬
특정한 조건이 부합할 때만 사용할 수 있는 매우 빠른 정렬 알고리즘
데이터의 크기 범위가 제한되어 정수 형태로 표현할 수 있을 때만 사용 가능
일반적으로 가장 큰 데이터와 가장 작은 데이터의 차이가 1,000,000을 넘지 않을 때 효과적
계수 정렬에서는 모든 범위를 담을 수 있는 크기의 리스트(배열)를 선언해야 함
선택, 삽입, 퀵 정렬처럼 직접 데이터의 값을 비교한 뒤에 위치를 변경하며 정렬하는 방식이 아님
데이터의 크기가 제한되어 있다면 데이터 개수가 많더라도 빠르게 동작
정렬 방식
1. 가장 작은 데이터부터 가장 큰 데이터까지 모두 담길 수 있도록 하나의 리스트를 생성
2. 리스트의 모든 데이터가 0이 되도록 초기화
3. 데이터를 하나씩 확인하며 데이터의 값과 동일한 인덱스의 데이터를 1씩 증가
(결과적으로 리스트에는 각 데이터가 몇 번 등장했는지 횟수가 기록됨)
4. 리스트의 첫 번째 데이터부터 하나씩 그 값만큼 인덱스를 출력
📌계수 정렬의 시간, 공간 복잡도
시간 복잡도: O(N+K)
모든 데이터가 양의 정수인 상황에서 데이터의 개수를 N, 최대값의 크기를 K라고 할 때 시간 복잡도는 O(N+K)
앞에서부터 데이터를 하나씩 확인하면서 리스트에서 인덱스의 값을 1씩 증가시킬 뿐 아니라, 리스트의 각 인덱스에 해당하는 값들을 확인할 때 데이터 중 최대값의 크기만큼 반복을 수행해야 하기 때문
데이터 범위만 한정되어 있다면 매우 빠르게 동작
공간 복잡도: O(N+K)
때로는 심각한 비효율성 초래
만약 데이터가 0과 999,999 단 2개만 존재한다면 리스트의 크기가 100만 개가 되도록 선언해야 함
데이터의 크기가 한정되어 있고, 동일한 값을 가지는 데이터가 여러 개 등장할 때 적합
📌코드
# 모든 원소의 값이 0보다 크거나 같다고 가정
array = [7, 5, 9, 0, 3, 1, 6, 2, 9, 1, 4, 8, 0, 5, 2]
# 모든 범위를 포함하는 리스트 선언(모든 값은 0으로 초기화)
count = [0] * (max(array) + 1) # 예시에서는 0~9까지 총 10개
for i in range(len(array)):
count[array[i]] += 1 # 각 데이터에 해당하는 인덱스의 값 증가
for i in range(len(count)):
for j in range(count[i]):
print(i, end=" ")
📌참고
이것이 취업을 위한 코딩 테스트다 with 파이썬
IT 취준생이라면 누구나 입사하고 싶은 카카오・삼성전자・네이버・라인!취업의 성공 열쇠는 알고리즘 인터뷰에 있다! IT 취준생이라면 누구나 가고 싶어 하는 카카오, 라인, 삼성전자의 2016년
www.google.com
'코딩테스트' 카테고리의 다른 글
함수, global 키워드, 람다 표현식 (0) | 2024.10.18 |
---|---|
파이썬 리스트 자료형 (1) | 2024.10.18 |
퀵 정렬 (1) | 2024.10.17 |
삽입 정렬 (5) | 2024.10.16 |
정렬, 선택 정렬 (1) | 2024.10.15 |