백준/String
[문자열/백준]20920번 : 영단어 암기는 괴로워
ydin
2023. 6. 1. 16:48
- 문제 : https://www.acmicpc.net/problem/20920
문제 이해
- 입력되는 단어 중에 길이 m 이상의 단어들을 저장한 뒤 출력하는데 다음과 같은 규칙으로 출력해야 한다.
1. 가장 자주 나오거나
2.횟수가 같다면 문자의 길이가 긴 순서로
3. 길이마저 같다면 알파벳 순서로 단어들을 출력하는 문제다.
- 단어 개수를 세기 위해 numbers라는 딕셔너리를 활용하고, 각 key에 대한 value는 [횟수, 길이]로 설정했다.
- 위의 순서대로 sorted()를 이용해 다중 정렬을 한 뒤, 각 단어들을 정렬된 순서대로 출력하면 된다.
# 다중 정렬은 (기준 컬럼1, 기준 컬럼2,,,)으로 설정하면 된다
# 만약 특정 기준 컬럼이 기존과 반대되는 정렬 방식을 사용한다면 앞에 '-'를 붙여주면 된다.
result = sorted(numbers.items(), key = lambda x : (-x[1][0], -x[1][1], x[0]))
- 풀이로직은 알았지만, rstrip()을 하지 않아 틀린 출력을 해서 약간 헤맸던 문제다.
정답 풀이
import sys
input = sys.stdin.readline
n, m = map(int, input().rstrip().split())
numbers = {} # [횟수, 길이]
for _ in range(n):
word = input().rstrip()
k = len(list(word))
if k >= m:
if word in numbers.keys():
numbers[word][0] += 1
else:
numbers[word] = [1, k]
result = sorted(numbers.items(), key = lambda x : (-x[1][0], -x[1][1], x[0]))
for i in range(len(result)):
print(result[i][0])