알고리즘/백준
백준-1181-단어정렬
hong2943
2024. 4. 10. 22:26
코드 1
N = int(input())
word = []
for i in range(N):
a = input()
if a not in word:
word.append(a)
word.sort(key = lambda x : (len(x), x))
for i in word:
print(i)
이 문제는 바로 sort메서드에서 조건을 주고 정렬만 해주면 되는 간단한 문제였다.
그래서 sort의 key로써 첫 번째 조건은 입력받은 str값의 길이 , 두 번째 조건은 단순히 알파벳순으로 조건을 주었다.
하지만 이렇게 구현을 하면 4456ms로 시간이 많이 소모가 되는 것을 알 수 있다.
이유는 다음과 같았다.
1. list로 입력 받아서 중복을 없애기 위한 if문 부분에서 한 글자마다 확인을 하므로 시간이 매우 많이 걸림
2. 20,000 번의 입력까지 받는 a = input()은 매우 느리다. 반복문 내에서 연속적인 입력을 받을 때에는 sys를 사용하는 것이 훨씬 빠르다.
코드 2
import sys
N = int(sys.stdin.readline())
word = []
for i in range(N):
a = sys.stdin.readline().strip()
word.append(a)
#중복 제거를 위한 set
set_word = set(word)
#정렬을 위해 다시 리스트 변환
word = list(set_word)
word.sort(key = lambda x : (len(x), x))
for i in word:
print(i)
1번 문제를 해결하기 위해서 list -> set -> list를 만들어주는 과정을 수행
다시 list를 해주는 것은 set은 순서가 없는 자료형이라서 정렬이 불가하다.
그리고 a를 입력받을 때 sys.readline() 을 하게 되면 기본적으로 \n\n 값을 포함한다고 한다.
그래서 .strip()을 통해서 개행을 제거하게 되면 96ms로 시간을 단축시킬 수 있다.