알고리즘/백준

백준-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로 시간을 단축시킬 수 있다.

 

문제링크

'알고리즘 > 백준' 카테고리의 다른 글

백준-1966-프린터 큐  (0) 2024.04.29
백준-11728-배열합치기  (0) 2024.04.12
백준-11399-ATM  (0) 2024.04.10
백준-1158-요세푸스 문제  (1) 2024.04.06
백준-2563-색종이  (1) 2024.04.06