백준 | 영단어 암기는 괴로워

justhaza.log·2024년 7월 28일

알고리즘: BOJ

목록 보기
63/125

백준 영단어 암기는 괴로워 문제 풀이이다.


입력된 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])
profile
알고리즘이나 SQL 문제 풀이를 올리고 있습니다. 피드백 환영합니다!

0개의 댓글