1181: 단어 정렬 - Python

beaver.zip·2024년 12월 9일
0

[알고리즘] 백준

목록 보기
22/45

문제

https://www.acmicpc.net/problem/1181

풀이 1 (최초 풀이)

lst = []
for _ in range(int(input())):
    lst.append(input())

lst = list(set(lst))
lst.sort()
lst.sort(key = lambda x: len(x))
print(*lst, sep="\n")
  • 코드는 간결하지만, 메모리와 시간 측면에서 비효율적이다.

풀이 2 (풀이 1 개선)

import sys
input = sys.stdin.readline

lst = []
for _ in range(int(input())):
    lst.append(input().strip())

lst = list(set(lst))
lst.sort()
lst.sort(key=lambda x: len(x))
print(*lst, sep="\n")
  • 풀이 1에서 input()sys.stdin.readline()으로 변경했다. (-500ms)
  • .sort()를 다음의 방식으로 바꿔쓸 수 있으나, 채점 결과 이 코드가 제일 빨랐다.
  1. .sort(key = lambda x: len(x)) -> .sort(key=len) (+4ms)
  2. lst.sort(), lst.sort(key=lambda x: len(x)) -> lst.sort(key=lambda x: (len(x), x)) (+8ms)

풀이 3 (풀이 2 개선)

import sys
input = sys.stdin.readline

lst = []
for _ in range(int(input())):
    lst.append(input().strip())

lst = list(set(lst))
lst.sort()
lst.sort(key=lambda x: len(x))
print("\n".join(lst))
  • 풀이 2의 출력을 unpacking 대신 join()으로 바꾸어줬다. (-8ms)

풀이 4 (풀이 3 변형)

import sys
input = sys.stdin.readline

arr = {input().strip() for _ in range(int(input()))}
arr = sorted(arr)
arr = sorted(arr, key=lambda x: len(x))
print("\n".join(arr))
  • 풀이 3에서 list -> set -> list로 형변환하는 과정 없이, set comprehension으로 입력 받고 정렬한다.
  • 이때 set에서는 list와 달리 .sort()를 지원하지 않아 sorted()를 사용했다.
  • 코드는 깔끔하나, 예상과 달리 속도 개선이 이루어지지 않았다.

교훈

  • 여러 줄의 입력을 받을 때는 반드시 sys.stdin.readline()을 사용하자.
  • 여러 줄의 출력을 할 때는 unpacking보다는 "\n".join()을 사용하자.
profile
NLP 일짱이 되겠다.

0개의 댓글