-
[백준 10989] 수 정렬하기 3 (python 풀이)자료구조 & 알고리즘/BOJ 문제풀이 2021. 9. 15. 15:36
1. 문제
N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.
2. 입력
첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다.
3. 출력
첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.
4. 포인트
- 대략적으로 파이썬은 1초에 2000만번에 연산을 수행한다.
- 위와 같은 지표로 대략적으로 시간 복잡도를 계산하여 알고리즘을 선택할 수 있겠다
- input() 함수 보다는 sys.stdin.readline() 함수가 빠르다
- 개수가 정해져있는 수 정렬에서는 계수 정렬 (counting sort ) 알고리즘을 사용 할 수 있다.
- 시간복잡도 O(n) 을 갖는다.
- 리스트의 sort() 함수의 시간 복잡도 O(nlogn) 인 점을 고려했을때 매우 빠름
4. 문제 풀이
해당 문제는 N이 천만 이하이므로 일반적인 정렬 의 시간복잡도 O(nlogn) 을 고려했을 때 시간 초과가 날 확률이 높다고 판단 했고 더 빠른 정렬 알고리즘중 계수 알고리즘을 찾을 수 있었다.
계수 알고리즘은 리스트의 인덱스를 해당 수로 생각하고 value 에 그 수가 몇번 출연했는지를 저장한다. 시간복잡도 O(n) 을 갖게된다. 또한 sys 모듈을 통해 input을 받아 내 시간을 단축함으로써 문제를 해결 할 수 있다.
# 수 정렬하기3 # 계수 정렬 알고리즘 사용 import sys test = int(input()) lst = [0] * 10001 for i in range(test): val = int(sys.stdin.readline()) lst[val] +=1 for i in range(10001): if lst[i] != 0 : for j in range(lst[i]): print (i)
'자료구조 & 알고리즘 > BOJ 문제풀이' 카테고리의 다른 글
[백준 2110] 공유기 설치 (python 풀이) (0) 2021.09.21 [백준 7490] 0 만들기 (python 풀이) (0) 2021.09.16 [백준 10814] 나이순 정렬(python 풀이) (0) 2021.09.13 [백준 4192] 친구 네트워크 (python 풀이) (0) 2021.09.12 [백준 5397] 키로거(python 풀이) (0) 2021.09.12 - 대략적으로 파이썬은 1초에 2000만번에 연산을 수행한다.