백준 20920: 영단어 암기는 괴로워 (Python)
1. Lambda를 활용한 다중 조건 정렬
이번 문제에서 가장 흥미로웠던 부분은 여러 조건을 동시에 고려해야 하는 정렬이었습니다. Python의 sorted()
함수와 lambda
를 사용하면 이러한 다중 조건 정렬을 매우 우아하게 구현할 수 있습니다.
sorted_words = sorted(word_count.keys(),
key=lambda x: (-word_count[x], -len(x), x))
이 한 줄의 코드는 다음 세 가지 조건을 순차적으로 적용합니다:
- 단어 빈도수 내림차순 (-word_count[x])
- 단어 길이 내림차순 (-len(x))
- 알파벳 사전순 (x)
여기서 주목할 점은 내림차순 정렬을 위해 마이너스(-)를 사용한 것입니다. 이는 Python에서 자주 사용되는 테크닉으로, 값에 마이너스를 붙이면 자연스럽게 내림차순으로 정렬됩니다.
2. sys.stdin.readline()으로 입력 성능 개선
두 번째로 배운 점은 입력 처리 성능 최적화입니다. 기존에 사용하던 input()
보다 sys.stdin.readline()
을 사용하면 훨씬 빠른 입력 처리가 가능합니다.
import sys
# 입력 처리
N, M = map(int, sys.stdin.readline().split())
words = [sys.stdin.readline().rstrip() for _ in range(N)]
sys.stdin.readline()
을 사용할 때 주의할 점은 입력 끝에 개행문자(\n)가 포함된다는 것입니다. 따라서 문자열을 저장할 때는 rstrip()
을 사용하여 개행문자를 제거해야 합니다.
전체 코드
import sys
def sort_words(N, M, words):
# M보다 짧은 단어 필터링
filtered_words = [word for word in words if len(word) >= M]
# 단어 빈도수 계산
word_count = {}
for word in filtered_words:
word_count[word] = word_count.get(word, 0) + 1
# 다중 조건 정렬
sorted_words = sorted(word_count.keys(),
key=lambda x: (-word_count[x], -len(x), x))
return sorted_words
# 빠른 입력 처리
N, M = map(int, sys.stdin.readline().split())
words = [sys.stdin.readline().rstrip() for _ in range(N)]
# 결과 출력
result = sort_words(N, M, words)
for word in result:
print(word)
마치며
이번 문제를 통해 Python의 강력한 정렬 기능과 입력 처리 최적화 방법을 배웠습니다. 특히 lambda를 사용한 다중 조건 정렬은 코드를 간결하고 읽기 쉽게 만들어주는 훌륭한 도구라는 것을 알게 되었습니다. 또한 sys.stdin.readline()
을 사용한 입력 최적화는 앞으로 다른 알고리즘 문제를 풀 때도 유용하게 활용할 수 있을 것 같습니다.
'Algorithm' 카테고리의 다른 글
JSP로 게시판 페이징 구현하기: 코드와 함께 알아보는 동작 원리 (Paging Algorithm) (0) | 2024.04.04 |
---|