백준 1181번 - 단어 정렬 (Python3)
코드
input() 활용
n = int(input())
list_ = []
for _ in range(n):
list_.append(input())
# 중복 제거
ls = list(set(list_))
# 리스트 정렬 후 길이 별로 정렬
ls.sort()
ls.sort(key=len)
# 선택 정렬 => 시간 초과
# for i in range(len(ls)-1):
# for j in range(i, len(ls)-1):
# if(len(ls[i]) == len(ls[j+1])):
# if(ls[i] > ls[j+1]):
# ls[i], ls[j+1] = ls[j+1], ls[i]
# break
for i in ls:
print(i)
sys.stdin.readline() 활용
import sys
# input()보다 속도 면에서 우수
n = int(sys.stdin.readline())
list_ = []
for _ in range(n):
# 한 줄 단위로 입력받기 때문에 개행문자가 같이 입력 받아짐 => strip()으로 제거
list_.append(sys.stdin.readline().strip())
ls = list(set(list_))
# 리스트를 길이 별로 정렬
ls.sort()
ls.sort(key=len)
for i in ls:
print(i)
문제 해설
파이썬 기본 정렬 라이브러리를 사용하지 않고 선택 정렬을 직접 구현하니 시간 초과가 발생하였다. 알고리즘 문제를 풀 때 시간 복잡도를 제어하는 것이 중요하다는 것을 또 한 번 깨달았다.
파이썬 기본 정렬 라이브러리는 병합 + 삽입 정렬의 하이브리드 방식으로 동작하여 최악의 경우에도 O(NlogN)을 보장하여 선택 정렬(시간 복잡도 : O(N**2))보다 더 빠른 성능을 보여준다
또한 시간을 더 단축하기 위하여 input() 대신 sys.stdin.readline()을 활용하여 답안도 작성하였다
댓글남기기