백준 20920번: 영단어 암기는 괴로워 python

kimminjunnn·2025년 4월 21일

알고리즘

목록 보기
34/311

🧠 백준 20920번 - 영단어 암기는 괴로워 | Python 풀이


📌 문제 요약

🔗 문제 보러가기

영단어 암기를 도와주는 단어장을 만들려고 한다.
단, 아래 조건을 만족하는 단어만 단어장에 포함된다.

  • 단어의 길이가 M 이상이어야 한다.
  • 단어를 정렬할 때 다음 우선순위를 따른다:

📖 단어 정렬 규칙 (우선순위)

  1. 자주 등장한 단어일수록 앞에
  2. 단어 길이가 길수록 앞에
  3. 알파벳 사전 순으로 앞에

우선순위는 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: 알파벳 순으로 정렬 (오름차순)
    기본적으로 key는 입력받는 좌측부터 우선순위1,2,3,4.... 순이다.

lambda란?

lambda간단한 함수를 한 줄로 표현할 수 있는 Python 문법이다

아래 코드는

lambda word: (-freq[word], -len(word), word)

이건 사실 아래 함수와 동일한 역할을 한다:

def 정렬기준(word):
    return (-freq[word], -len(word], word)

sorted(words, key=정렬기준)

즉, lambda짧은 함수를 따로 정의하지 않고도 바로 사용할 수 있게 해주는 문법이다.

🔁 전체 흐름 정리

  1. 단어 입력 → 길이 M 이상만 필터링
  2. 각 단어의 등장 횟수를 딕셔너리에 기록
  3. 중복 제거된 단어 리스트를
    (-빈도수, -길이, 알파벳 순) 기준으로 정렬
  4. 결과 출력

🧾 최종 코드

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)

✍️ 마무리

  • 딕셔너리로 빈도수를 구하는 것
  • sorted의 key를 튜플로 설정해 정렬 우선순위 구현하는 것

이 두 가지가 이 문제의 핵심 포인트였다.

이전 문제에서 배운 최빈값 활용법을 다시 써먹을 수 있어서
더 재밌게 풀 수 있었다


🧩 자투리 지식 - dict.get()

딕셔너리에서 key가 있을 수도, 없을 수도 있을 때
dict.get(key, 기본값)을 쓰면 안전하게 값을 꺼낼 수 있음.

freq[word] = freq.get(word, 0) + 1

word 라는 키 값에 + 1 할건데, 만약 없다면 0 에서 +1 해라 라는 뜻

위 코드처럼 등장 횟수를 셀 때 자주 씀.
키 값이 없을 때 KeyError 안 나서 깔끔하게 처리 가능!

profile
Frontend Engineers

0개의 댓글