2751: 수 정렬하기 2

문제의 의도

수를 정렬하는 정렬 알고리즘을 구현하는 문제이다. 단, n이 최대 1,000,000의 큰 값을 가질 수 있으므로 시간 복잡도가 $O(n\log{n})$ 정도의 빠른 정렬 알고리즘이어야 한다.

아이디어

  • 이 자료에 따르면 파이썬의 list.sort() 혹은 sorted(list) 는 최악 시간복잡도가 $O(n\log{n})$ 이다. 내부적으로 Timsort라고 하는 알고리즘을 사용한다.

  • 또한 이 문제의 난이도가 실버 5로 낮은 편이므로, 정렬의 개념을 이해하고 정렬 알고리즘을 사용할 수 있는 수준이면 풀 수 있다고 이해하였다. 물론 직접 구현을 하는 것이 조금 더 문제를 정확하게 푸는 방법이나 정렬 알고리즘은 생각보다 그 방법이 방대하며 복잡하다.

  • 따라서 이 문제는 파이썬의 내부 정렬 알고리즘을 사용하는 것으로 해결할 수 있다.

  • 정렬과 같이 비용을 많이 사용하는 알고리즘의 경우 input()과 print() 때문에 문제가 생길 수 있다. 이를 내장 sys 라이브러리를 사용하여 해결할 수 있다.

풀이

  • 먼저 몇 개의 숫자를 받을 것인지 입력을 받고, 입력받은 값을 n에 저장한다.

  • n번만큼 입력을 받고, 입력받은 수를 list에 추가한다.

  • sorted() 함수를 이용하여 정렬된 리스트의 요소를 for…in 문으로 하나씩 조회하여 출력한다.

  • 성공 (메모리 84924 KB, 시간 1164 ms)

import sys

input = sys.stdin.readline
print = sys.stdout.write

n = int(input().rstrip())
list = []

for index in range(n):
  list.append(int(input().rstrip()))

for num in sorted(list):
  print(str(num) + '\n')

직접 구현의 경우

  • 직접 구현의 경우 알고리즘의 세부적인 이해까지는 시간이 부족하여 수도코드를 기반으로 하여 구현하였다.

Untitled
  • 퀵 소트: 최악 시간복잡도 $O(n^{2})$, 메모리 초과

  • 힙 소트: 최악 시간복잡도 $O(n\log{n})$

, 성공 (메모리 79064 KB, 시간 6892 ms)

  • 버블 정렬: 최악 시간복잡도 $O(n^{2})$, 시간 초과

Last updated