문제 접근 및 공부 내용, 풀이는 모두 하단 코드에 "주석"으로 포함되어 있으니 참고해주세요.
문제 유형 보기
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)
'Algorithms and Languages > 파이썬 알고리즘 문제풀이' 카테고리의 다른 글
[Python/백준] 9291. 스도쿠 채점 (0) | 2025.02.18 |
---|---|
[Python/DailyAlgo] 71. 이차원 배열의 델타 탐색 1 (0) | 2025.02.18 |
[Python/백준] 1931. 회의실 배정 (0) | 2025.02.05 |
[Python/프로그래머스] 42746. 가장 큰 수 (0) | 2025.02.05 |
[Python/DailyAlgo] 70. 이차원 배열의 회전 (0) | 2025.02.05 |