어떤 로직을 사용하느냐에 따라 걸리는 시간이 달라져서 어떤 게 가장 빠른지 테스트해 보았다.
N = int(input())
words = []
for _ in range(N):
word = input()
if word not in words:
words.append(word)
words.sort(key = lambda x: (len(x), x))
print(*words, sep='\n')
import sys
N = int(input())
words = []
for _ in range(N):
word = sys.stdin.readline().strip()
if word not in words:
words.append(word)
words.sort(key = lambda x: (len(x), x))
print(*words, sep='\n')
import sys
N = int(input())
words = []
for _ in range(N):
word = sys.stdin.readline().strip()
if word not in words:
words.append(word)
words.sort()
words.sort(key = len)
print(*words, sep='\n')
import sys
N = int(input())
words = []
for _ in range(N):
word = sys.stdin.readline().strip()
words.append(word)
words = list(set(words))
words.sort()
words.sort(key = len)
print(*words, sep='\n')

아래서부터 1~4번 코드이다.
이렇게나 차이가 나다니.....
곰곰이 생각해 보니 in문으로 인해 words라는 리스트를 하나하나 비교하며 모두 탐색하기 때문이다.
코드를 짤 때 무지성으로 냅다 쓰지 말고 성능 면도 꼭 고려하며 짜도록 하자.