<문제>
화은이는 이번 영어 시험에서 틀린 문제를 바탕으로 영어 단어 암기를 하려고 한다. 그 과정에서 효율적으로 영어 단어를 외우기 위해 영어 단어장을 만들려 하고 있다. 화은이가 만들고자 하는 단어장의 단어 순서는 다음과 같은 우선순위를 차례로 적용하여 만들어진다.
- 자주 나오는 단어일수록 앞에 배치한다.
- 해당 단어의 길이가 길수록 앞에 배치한다.
- 알파벳 사전 순으로 앞에 있는 단어일수록 앞에 배치한다
M보다 짧은 길이의 단어의 경우 읽는 것만으로도 외울 수 있기 때문에 길이가 M이상인 단어들만 외운다고 한다. 화은이가 괴로운 영단어 암기를 효율적으로 할 수 있도록 단어장을 만들어 주자.
<코드>
import sys
input=sys.stdin.readline
eng=dict()
n,m=map(int,input().split())
for i in range(n):
word=input().rstrip()
if word not in eng:
eng[word]=1
else:
eng[word]=eng[word]+1
eng={key:value for key,value in eng.items() if len(key)>=m}
eng=sorted(eng.items(),key=lambda x: (-x[1],-len(x[0]),x[0]))
for i in eng:
print(i[0])
<문제풀이>
처음에 딕셔너리로 단어를 입력받고, 딕셔너리에 단어가 없을 경우, 단어를 추가해주고 1로 초기화 해주었다.
똑같은 단어가 입력 되었으면, eng[단어]에 단어 횟수에 1을 더해 값을 업데이트 해주었다.
딕셔너리를 처음엔 m보다 작으면 바로 삭제를 해주려고 했었는데 반복문으로 del하면 딕셔너리의 크기가 달라져 오류가 떴다.
이럴때는 딕셔너리를 아예 조건에 맞는 딕셔너리로 바꿔주면 된다고 하였다.
따라서 eng={key:value for key,value in eng.items() if len(key)>=m}을 해주어 m이상의 길이들만 딕셔너리에 있게 해주었다.
이때 우선 순위 정렬을 어떻게 해야할지 몰라서 구글링을 하였는데 람다함수로 다중정렬을 할수있다는 글을 봤다.
어떤식으로 동작이 되는거냐면, 우서너 sorted는 key값을 중심으로 오름차순을 해준다.
따라서 lambda x:(우선순위1,우선순위2,우선순위3){튜플형식}이면 처음에 우선순위1이 반환되어 그 기준으로 오름차순하고, 그다음 우선 순위 2로 넘어가 그 기준으로 오름차순해주고, 그다음 우선순위 3으로 넘어가 오름차순을 해준다.
우선 순위가 여러개일때 lambda x:(튜플)로 정렬해주는 것을 연습해야겠다!
'알고리즘 > 백준' 카테고리의 다른 글
백준 10819번: 차이를 최대로 (0) | 2024.05.26 |
---|---|
백준 1003번: 피보나치함수 (0) | 2024.05.26 |
백준 4195번:친구 네트워크 (0) | 2024.02.27 |
백준 1753번: 최단경로 (0) | 2024.02.10 |
백준 18352번: 특정 거리의 도시 찾기 (0) | 2024.02.10 |