일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- pipenv
- 포인터
- 속초여행
- 장고
- 건대입구맛집
- richtext
- 정렬알고리즘
- removetooltip
- 성수동카페
- DOM
- 노마드코더
- 코딩독학
- python3
- 추상클래스
- BeautifulSoup
- FLUTTER
- popupmenubutton
- 상속
- 부스트코스
- 강원도속초맛집
- Python
- 알고리즘
- c언어문자열
- 컴퓨터과학
- JavaScript
- Django
- 자바
- 남양주맛집
- 가상환경
- 아스키코드
- Today
- Total
YUYANE
알고리즘 / 계수 정렬 본문
학습 도서
이것이 코딩테스트다 with 파이썬 (한빛미디어, 나동빈 저)
정렬(Sorting)
- 데이터를 특정한 기준에 따라서 순서대로 나열하는 것
- 예시 : 오름차순, 내림차순
- 종류 : 선택 정렬, 삽입 정렬, 퀵 정렬, 계수 정렬
계수 정렬(Count Sort)
- 시간 복잡도(데이터의 개수 N, 데이터 최댓값 K) : O(N+K)
- 한계 : 데이터의 크기 범위가 제한 되어 정수 형태로 표현할 수 있을 때에만 사용 가능
- 컨셉 : 데이터의 개수 만큼의 리스트를 선언하고 그 안에 정렬에 대한 정보를 담는다.
- 알고리즘
1) 데이터 값의 개수를 원소로 가지고 있는 리스트를 선언한다.
2) 배열의 첫 번째 데이터를 확인한다.
3) '배열의 첫 번째 데이터'를 인덱스로 가지는 데이터에 1을 더한다.
4) 배열의 두 번째 데이터를 확인한다.
5) '배열의 두 번쨰 데이터'를 인덱스로 가지는 데이터에 1을 더한다.
...
위와 같은 방법으로 각 데이터가 몇 번씩 등장하는 지 알아보았다.
이제 그 횟수 만큼 각 데이터를 출력하면, 기존에 주어진 모든 데이터를 오름차순으로 정리할 수 있다.
전체 소스 코드
array = [7, 5, 9, 0, 3, 1, 6, 2, 9, 1, 4, 8, 0, 5, 2]
count = [0]*(max(array)+1) # [0,0,0,0,0,0,0,0,0,0]
for i in range(len(array)): # i = 0,1,2,3,4,...,10
count[array[i]] += 1
for i in range(len(count)):
for j in range(count[i]):
print(i, end=' ')
해설
코드를 차근차근 살펴보자.
array = [7, 5, 9, 0, 3, 1, 6, 2, 9, 1, 4, 8, 0, 5, 2]
- Goal : 데이터를 오름차순으로 정리하자.
count = [0]*(max(array)+1)
- [0,0,0,0,0,0,0,0,0,0]
- 데이터의 값은 0부터 9까지 분포해있다.
- max(array) = 9
- 데이터 값으로 0도 가지므로, max(array)+1 만큼의 데이터를 가지는 리스트를 생성한다.
- 아직 수를 세기 전이므로 리스트의 모든 데이터는 0으로 초기화한다.
for i in range(len(array)):
count[array[i]] += 1
- range(len(array)) = [0, 1, 2, ..., 9]
(포스팅 참고 : 1y9u9j2in.tistory.com/152?category=910442 )
- i = 0, array[0] = 7
count[7] = 1
리스트의 첫 번째 데이터가 7 이므로, count 리스트의 7번 째 값에 1을 더한다.
- i = 1, array[0] = 5
count[5] = 1
리스트의 두 번째 데이터가 5 이므로, count 리스트의 5번 째 값에 1을 더한다.
...
- count = [2,2,2,1,1,2,1,1,1,2]
for i in range(len(count)):
for j in range(count[i]):
print(i, end=' ')
- range(len(count)) = [0, 1, ..., 9]
- i= 0, range(count[0]) = [0, 1]
0을 2번 출력
- i = 1, range(count[1]) = [0, 1]
1을 2번 출력
- i = 2, range(count[2]) = [0, 1]
2를 2번 출력
...
최종 출력 결과 = 0 0 1 1 2 2 3 4 5 5 6 7 8 9 9
'Programming Theory > Algorithm' 카테고리의 다른 글
알고리즘 / 버블 정렬 (0) | 2021.02.17 |
---|---|
알고리즘 / 선형 검색 (0) | 2021.02.02 |
알고리즘 / 삽입 정렬 (0) | 2021.01.23 |
알고리즘 / 선택 정렬 (0) | 2021.01.22 |
Python/ HackerRank Find the Runner-Up Score! (0) | 2021.01.11 |