티스토리 뷰
수 정렬하기 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 = 배열의 원소: 해당 원소의 개수
단점
계수 정렬은 정렬하고자 하는 배열의 최대값이 매우 클 때 메모리를 매우 비효율적으로 사용함
'Study > Baekjoon' 카테고리의 다른 글
[Python] 백준 7785번 회사에 있는 사람 | set() (1) | 2024.02.12 |
---|---|
[Python] 백준 1009번 분산처리 | 런타임에러(KeyError) (0) | 2023.08.05 |
[Python] 백준 2745번 진법 변환 | int(진법표현, 진법) (0) | 2023.05.31 |
[Python] 백준 10798번 세로읽기 | 문자열 내 연속 문자 찾기 (0) | 2023.05.29 |
[Python] 백준 1316번 그룹 단어 체커 | 문자열 내 연속 문자 찾기 (0) | 2023.05.28 |