본문 바로가기

Algorithms and Languages/파이썬 알고리즘 문제풀이

[Python/백준] 20920. 영단어 암기는 괴로워

문제 접근 및 공부 내용, 풀이는 모두 하단 코드에 "주석"으로 포함되어 있으니 참고해주세요.

문제 유형 보기

https://www.acmicpc.net/problem/20920


1차 풀이

import sys
input = sys.stdin.readline
from collections import Counter

# 우선순위1: 자주 나오는 단어일수록 앞에 배치한다.
# 우선순위2: 해당 단어의 길이가 길수록 앞에 배치한다.
# 우선순위3: 알파벳 사전 순으로 앞에 있는 단어일수록 앞에 배치한다

# 입력 : 단어의 개수 N과 외울 단어의 길이 기준이 되는 M
# 길이가 M 이상인 단어만 선택할 거임.
# 출력 : 단어장에 들어갈 단어 우선순위 따라 순서대로 출력

n, m = map(int, input().split())
# N, M이 각각 정수로 저장됨.

voca_list = []
for _ in range(n):
    word = input().rstrip()
    if len(word) >= m:
        voca_list.append(word)

voca_counter = Counter(voca_list)

voca_sorted = sorted(voca_counter.items(), key =\
    lambda x: (-x[1], -len(x[0]), x[0])    )
# 아직까지 voca_sorted는 [(key, value), ...] 꼴의 튜플 리스트임!!
# 이걸 아래 리스트 컴프리헨션을 통해 key만 추출해줘야 함.
voca_sorted_list = [key for key, value in voca_sorted]

# 이거 1일차 출력 시간에 배운 *로 리스트 언패킹한 거임.
print(*voca_sorted_list, sep = '\n')

우선순위1: 자주 나오는 단어일수록 앞에 배치한다.

→ 이거 보자마자 Counter 써야겠다! 생각.

→ 한 줄씩 받아서 리스트에 넣고, 결과 리스트에 Counter 돌려줬음.

(Counter을 안 쓰고 그냥 defaultdict에 일일이 추가하는 방법도 가능함)

이후 우선순위1을 반영하기 위해, Counter의 key와 value를 모두 고려 가능하도록 Counter.items()를 써서 sorted를 돌려줬음.

단, 이 sorted()의 결과물은 [(key, value), …] 꼴의 튜플 리스트이므로, 마지막에 리스트 컴프리헨션으로, key만 포함한 꼴의 리스트로 변환해줘야함.

마지막으로, 세로로 한 줄씩 출력해야 하므로, 1일차 때 배운 *로 리스트를 언패킹해줬음.

2차 풀이

# 2차 풀이, 1차 풀이를 최적화함.
import sys
input = sys.stdin.readline
from collections import Counter

# 우선순위1: 자주 나오는 단어일수록 앞에 배치한다.
# 우선순위2: 해당 단어의 길이가 길수록 앞에 배치한다.
# 우선순위3: 알파벳 사전 순으로 앞에 있는 단어일수록 앞에 배치한다

# 입력 : 단어의 개수 N과 외울 단어의 길이 기준이 되는 M
# 길이가 M 이상인 단어만 선택할 거임.
# 출력 : 단어장에 들어갈 단어 우선순위 따라 순서대로 출력

n, m = map(int, input().split())
# N, M이 각각 정수로 저장됨.

# 리스트 컴프리헨션으로 더 간결하게
voca_list = [input().rstrip() for _ in range(n)]

voca_counter = Counter(voca_list)

unique_words = voca_counter.keys()
# voca_counter을 람다로 써서 빈도 알 수 있음!!
result = sorted(unique_words, key=lambda x: (-voca_counter[x], -len(x), x))

for word in result:
    if len(word) >= m:
        print(word)

 


250217 재풀이

from collections import Counter
import sys
input = sys.stdin.readline

# 1. 자주 나오면 앞에
# 2. 길이 길수록 앞에
# 3. 사전 순 앞에
# 길이 m 이상만 외움

n, m = map(int, input().split())

voca_counter = Counter([input().rstrip() for _ in range(n)])
voca_sorted_keys = sorted(voca_counter.keys(), key = \
    lambda x: (-voca_counter[x], -len(x), x))

for word in voca_sorted_keys:
    if len(word) >= m:
        print(word)