화은이는 이번 영어 시험에서 틀린 문제를 바탕으로 영어 단어 암기를 하려고 한다. 그 과정에서 효율적으로 영어 단어를 외우기 위해 영어 단어장을 만들려 하고 있다. 화은이가 만들고자 하는 단어장의 단어 순서는 다음과 같은 우선순위를 차례로 적용하여 만들어진다.
- 자주 나오는 단어일수록 앞에 배치한다.
- 해당 단어의 길이가 길수록 앞에 배치한다.
- 알파벳 사전 순으로 앞에 있는 단어일수록 앞에 배치한다
M보다 짧은 길이의 단어의 경우 읽는 것만으로도 외울 수 있기 때문에 길이가
M이상인 단어들만 외운다고 한다. 화은이가 괴로운 영단어 암기를 효율적으로 할 수 있도록 단어장을 만들어 주자.
<입력>
첫째 줄에는 영어 지문에 나오는 단어의 개수
N과 외울 단어의 길이 기준이 되는
M이 공백으로 구분되어 주어진다.둘째 줄부터
N+1 번째 줄까지 외울 단어를 입력받는다. 이때의 입력은 알파벳 소문자로만 주어지며 단어의 길이는
10을 넘지 않는다.
단어장에 단어가 반드시 1개 이상 존재하는 입력만 주어진다.<출력>
화은이의 단어장에 들어 있는 단어를 단어장의 앞에 위치한 단어부터 한 줄에 한 단어씩 순서대로 출력한다.
이 문제는 해시와 정렬을 잘 정리할 수 있는 좋은 문제였다고 생각한다. 처음 english 라는 배열을 받아 dictionary 에 저장한다. 이후 문제에 나온 정렬 기준을 만족시켜주는 문제이다.
✅ 정렬 조건 1 - 자주 나오는 단어일수록 앞에 배치한다.
sorted(dict.items(), key=lambda item: item[0])
✅ 정렬 조건 2 - 해당 단어의 길이가 길수록 앞에 배치한다.
sorted(answer, key=lambda item: len(item[0]), reverse=True)
✅ 정렬 조건 3 - 알파벳 사전 순으로 앞에 있는 단어일수록 앞에 배치한다
sorted(answer, key=lambda item: item[1], reverse=True)
위와 같이 3번의 정렬을 하여 문제에서 요구하는 사항을 충족시킬 수 있었다. 하지만 파이썬의 lamda 를 사용하여 한줄로 더 간단히 바꿀 수 있다.
answer = sorted(dict.items(), key=lambda item: (-item[1], -len(item[0]), item[0]))
내림차순 정렬을 할 경우 "reverse=True" 를 하여도 되지만, 정렬하고자 하는곳에 '-' 를 해주면 내림차순 정렬이 된다.
import sys
def solution(english, m):
dict = {}
for eng in english:
if len(eng) >= m:
if eng not in dict:
dict[eng] = 1
else:
dict[eng] += 1
# answer = sorted(dict.items(), key=lambda item: item[0])
# answer = sorted(answer, key=lambda item: len(item[0]), reverse=True)
# answer = sorted(answer, key=lambda item: item[1], reverse=True)
answer = sorted(dict.items(), key=lambda item: (-item[1], -len(item[0]), item[0]))
return answer
n, m = map(int, sys.stdin.readline().strip().split())
english = []
for i in range(n):
a = sys.stdin.readline().strip()
english.append(a)
result = solution(english, m)
for ans in result:
print(ans[0])