

영단어 암기를 도와주는 단어장을 만들려고 한다.
단, 아래 조건을 만족하는 단어만 단어장에 포함된다.
M 이상이어야 한다.우선순위는
1 > 2 > 3
7 4
apple
ant
sand
apple
append
sand
sand
sand
apple
append
문제의 핵심은 우선순위 정렬이다.
우선 길이 조건(M 이상)을 만족하는 단어만 필터링한 뒤,
등장 빈도를 세고, 우선순위에 따라 정렬해주면 된다.
이 정렬은 Python의 sorted() 함수에서 key를 잘 설정하면
아주 간단하게 구현할 수 있다.
이전 포스팅에서 다뤘던
📊 백준 2108번: 통계학 문제에서는
최빈값(가장 자주 등장한 값)을 구하는 딕셔너리 활용법을 익혔다.
freq = {}
for num in numbers:
if num in freq:
freq[num] += 1
else:
freq[num] = 1
이 방식 그대로, 이번 문제에서도 단어 등장 횟수를 딕셔너리에 저장해서
정렬 기준 1번(자주 나오는 단어)을 구현할 수 있다.
sorted()의 key 정리Python의 sorted() 함수는 정렬 기준을 key로 받을 수 있다.
sorted(리스트, key=정렬기준함수, reverse=False)
여기서 key 값에 정렬기준함수를 넣으면 되는데 우리의 경우 세개를 넣어야한다.
그리고 좌측부터 우측순으로 우선순위가 매겨진다.
우리는 단어 리스트를 다음 기준으로 정렬해야 한다:
sorted(words, key=lambda word: (-freq[word], -len(word), word))
-freq[word]: 등장 횟수가 많을수록 먼저 (-을 붙여 내림차순 정렬)-len(word): 단어 길이가 길수록 먼저 (-을 붙여 내림차순 정렬)word: 알파벳 순으로 정렬 (오름차순)lambda란?lambda는 간단한 함수를 한 줄로 표현할 수 있는 Python 문법이다
아래 코드는
lambda word: (-freq[word], -len(word), word)
이건 사실 아래 함수와 동일한 역할을 한다:
def 정렬기준(word):
return (-freq[word], -len(word], word)
sorted(words, key=정렬기준)
즉, lambda는 짧은 함수를 따로 정의하지 않고도 바로 사용할 수 있게 해주는 문법이다.
(-빈도수, -길이, 알파벳 순) 기준으로 정렬 import sys
input = sys.stdin.readline
N, M = map(int, input().split())
freq = {}
for _ in range(N):
word = input().strip()
if len(word) >= M:
freq[word] = freq.get(word, 0) + 1
words = list(freq.keys())
words.sort(key=lambda word: (-freq[word], -len(word), word))
for word in words:
print(word)
만약 lambda 함수를 쓰지 않고 정렬 함수를 따로 선언했다면 코드는 이렇게 된다.
import sys
input = sys.stdin.readline
N, M = map(int, input().split())
freq = {}
for _ in range(N):
word = input().strip()
if len(word) >= M:
freq[word] = freq.get(word, 0) + 1
def sort_key(word):
return (-freq[word], -len(word), word)
words = list(freq.keys())
words.sort(key=sort_key)
for word in words:
print(word)
이 두 가지가 이 문제의 핵심 포인트였다.
이전 문제에서 배운 최빈값 활용법을 다시 써먹을 수 있어서
더 재밌게 풀 수 있었다
dict.get()딕셔너리에서 key가 있을 수도, 없을 수도 있을 때
dict.get(key, 기본값)을 쓰면 안전하게 값을 꺼낼 수 있음.
freq[word] = freq.get(word, 0) + 1
word 라는 키 값에 + 1 할건데, 만약 없다면 0 에서 +1 해라 라는 뜻
위 코드처럼 등장 횟수를 셀 때 자주 씀.
키 값이 없을 때 KeyError 안 나서 깔끔하게 처리 가능!