백준 영단어 암기는 괴로워 문제 풀이이다.
입력된 n개의 단어에 대해 아래의 조건을 만족시키도록 단어를 출력해야 한다.
[1] 단어의 길이가 m 이상인 단어만 고려한다.
[2] 자주 나오는 단어일수록 앞에 배치한다. (빈도)
[3] 단어의 길이가 길수록 앞에 배치한다.
[4] 알파벳 사전 순으로 배치한다.
먼저 입력된 단어를 하나씩 확인하며 그 길이가 m 이상인 단어만 word_book이라는 딕셔너리에 추가했다.
이때 키가 없을 때 자동으로 기본 값이 생성되는 걸 활용하려고 defaultdict 클래스를 사용했다.
# defaultdict을 사용하여 임의의 키에 대한 기본 값을 0으로 설정한 경우
word_book = defaultdict(int)
for _ in range(n):
word = sys.stdin.readline().rstrip()
if len(word) >= m:
word_book[word] += 1
# dict를 직접 사용하여 키의 존재 유뮤에 따라 분기 처리를 한 경우
word_book = {}
for _ in range(n):
word = sys.stdin.readline().rstrip()
if len(word) >= m:
if word in word_book.keys():
word_book[word] += 1
else:
word_book[word] = 1
[2] ~ [4]에 해당하는 조건이 이 문제의 핵심인데, sorted()를 활용하면 쉽게 해결할 수 있다.
먼저 {'단어': '빈도'}로 구성되어 있는 word_book의 '단어', '빈도' 모두 정렬 기준으로 쓰이기 때문에, word_book.items()로 키, 값 쌍을 가져온다.
그리고 정렬의 우선 순위에 따라 자주 나오는 단어(-item[1]), 길이가 긴 단어(-len(item[0])), 알파벳 사전 순서(item[0])를 순서대로 lambda 함수의 정렬 키로 넣으면 된다.
코드(정답)는 다음과 같다.
import sys
from collections import defaultdict
n, m = map(int, sys.stdin.readline().split())
word_book = defaultdict(int)
for _ in range(n):
word = sys.stdin.readline().rstrip()
if len(word) >= m:
word_book[word] += 1
sorted_word_book = sorted(word_book.items(), key=lambda item: (-item[1], -len(item[0]), item[0]))
for item in sorted_word_book:
print(item[0])