알고리즘

백준 20920 (딕셔너리 정렬)

jwjwvison 2022. 12. 27. 10:44

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

 

20920번: 영단어 암기는 괴로워

첫째 줄에는 영어 지문에 나오는 단어의 개수 $N$과 외울 단어의 길이 기준이 되는 $M$이 공백으로 구분되어 주어진다. ($1 \leq N \leq 100\,000$, $1 \leq M \leq 10$) 둘째 줄부터 $N+1$번째 줄까지 외울 단

www.acmicpc.net

 

이 문제는 딕셔너리에 대해서 좀더 명확하게 이해할수 있게 만들어준 문제이다.

 

 

딕셔너리를 만든후 딕셔너리 구조를

d[key]: [단어개수, 단어길이, 단어] 로 구성한다

 

1. 정렬

 파이썬의 sort및 sorted 함수는 key 인자 값으로 정렬에 있어서 우선 순위 기준을 설정 할 수 있다.

sort(key= lambda x: (기준1, 기준2, 기준3))

여기서 중요한 점이 있는데 정렬 함수는 추가 인자 값으로 reverse=True를 줌으로써 내림차순 정렬을 실행할 수 있다.

sort(key= lambda x: (기준이 될 값), reverse = True)

그러나 다양한 정렬 기준이 있을때 reverse=True를 쓰게 되면 모든 기준들이 일괄적으로 내림차순 정렬이 된다. 그러므로 이러한 문제에서는 사용하지 않아야 한다.

 

 이 문제에서는 기준으로 주는 값에 -를 붙여서 해결 가능하다.

sort(key= lambda x: (-기준1, 기준2, 기준3))

 다만 이는 숫자형만 적용 되고 문자형은 적용이 되지 않는다.

 문제에서 단어 개수, 단어 길이는 내림차순으로 단어 순서는 오름차순으로 설정하라고 했으므로 개수와 길이 기준 앞에만 마이너스를 붙였다.

import sys

N,M=map(int,input().split())
d=dict()

for _ in range(N):
    let=sys.stdin.readline().rstrip()
    if len(let)<M:
        continue
    if let not in d:
        d[let]=[1,len(let),let]
    else:
        d[let][0]+=1

arr=d.values()
values=[*arr]


values.sort(key=lambda x:(-x[0],-x[1],x[2]))
for _,_,let in values:
    print(let)

'알고리즘' 카테고리의 다른 글

백준 1541번 - split() 함수의 활용  (0) 2022.06.23
연속합 - 백준 1912번  (0) 2022.06.17
분할 정복 예제 ( 괄호를 삽입하는 여러가지 방법)  (0) 2022.05.21
분할 정복  (0) 2022.05.21
그리디 알고리즘 예제  (0) 2022.05.19