[백준] 1181: 단어 정렬 - 파이썬[python]

다인·2024년 9월 10일

백준

목록 보기
58/112
post-thumbnail

어떤 로직을 사용하느냐에 따라 걸리는 시간이 달라져서 어떤 게 가장 빠른지 테스트해 보았다.

조합

  1. input()을 사용하느냐 sys.stdin.readline()를 사용하느냐.
  2. 2가지 조건을 정렬할 때 sort() 한 번에 정렬하느냐, 두 번의 sort로 나누어 정렬하느냐.
  3. 중복을 제거할 때 for문에서 if문을 쓰냐, 다 넣고 set함수를 쓰냐.

1. input() + sort() 1번

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')

2. sys.stdin.readline() + sort() 1번

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')
  • 1번에서 input()만 sys.stdin.readline()로 바꾸었다.

3. sys.stdin.readline() + sort() 2번

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')
  • 2번에서 1번의 sort를 2번으로 나누어 썼다.
  • 여기서는 순서에 조심해야 된다.
    문제에 짧은 것부터 정렬하라고 해서 이를 먼저 코드로 쓰면 안 된다.
  • 먼저 사전 순으로 정렬한 다음 길이순으로 정렬해야지 같은 길이인 애들은 사전 순으로 배열돼서 주어진 조건에 만족하게 되는 것이다.

4. sys.stdin.readline() + sort() 2번 + set()

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')
  • 3번 코드에서 for문을 돌 때마다 해당 단어가 존재하는지 검사하는 것이 아니라, 다 넣고 set함수를 이용해서 중복을 제거한다.

결과

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

0개의 댓글