티스토리 뷰
[Python]20920번, 딕셔너리 다중정렬
Vagabund.Gni 2023. 4. 12. 23:10문제
화은이는 이번 영어 시험에서 틀린 문제를 바탕으로 영어 단어 암기를 하려고 한다.
그 과정에서 효율적으로 영어 단어를 외우기 위해 영어 단어장을 만들려 하고 있다.
화은이가 만들고자 하는 단어장의 단어 순서는 다음과 같은 우선순위를 차례로 적용하여 만들어진다.
- 자주 나오는 단어일수록 앞에 배치한다.
- 해당 단어의 길이가 길수록 앞에 배치한다.
- 알파벳 사전 순으로 앞에 있는 단어일수록 앞에 배치한다
M보다 짧은 길이의 단어의 경우 읽는 것만으로도 외울 수 있기 때문에 길이가 M이상인 단어들만 외운다고 한다.
화은이가 괴로운 영단어 암기를 효율적으로 할 수 있도록 단어장을 만들어 주자.
입력
첫째 줄에는 영어 지문에 나오는 단어의 개수 N과 외울 단어의 길이 기준이 되는 M이 공백으로 구분되어 주어진다.
(1 ≤ N ≤ 100000, 1 ≤ M ≤ 10)
둘째 줄부터 N+1 번째 줄까지 외울 단어를 입력받는다.
이때의 입력은 알파벳 소문자로만 주어지며 단어의 길이는 10을 넘지 않는다.
단어장에 단어가 반드시 1개 이상 존재하는 입력만 주어진다.
출력
화은이의 단어장에 들어 있는 단어를 단어장의 앞에 위치한 단어부터 한 줄에 한 단어씩 순서대로 출력한다.
풀이
이 문제를 풀고 느꼈다.
파이썬은 환상적이다. 필요한 게 다 있어.
자바의 스트림에 익숙한 나는 아.. 여긴 뭐 그런 것도 없냐.. 하면서 낑낑거렸는데
검색을 한 번 해보니 없는 게 아니라 필요 없는 것이었다는 사실.. 과 그 사실을 나만 몰랐다는 사실..
다중정렬은 기본적으로 딕셔너리 자료형을 대상으로 한다.
리스트의 경우는 단일정렬을 기본으로 하지만 내부 구조(리스트, 튜플 등)에 따라 다중정렬을 할 수도 있다.
문제의 조건은 세 개의 정렬을 겹쳐 요구하는데, 다시 정리하자면
- 등장 횟수 내림차순
- 1번이 같을 경우 문자열 길이 내림차순
- 2번도 같을 경우 사전순으로 오름차순
이 된다. 이 정렬을 파이썬으로 표현하면 아래와 같다.
import sys
n, m = map(int, sys.stdin.readline().rstrip().split())
y = dict()
for _ in range(n):
a = sys.stdin.readline().rstrip()
if len(a) >= m:
if a in y:
y[a] += 1
else:
y[a] = 1
y = sorted(y.items(), key=lambda x: (-x[1], -len(x[0]), x[0]))
for i in y:
print(i[0])
문제의 조건대로 m보다 짧은 문자열은 받지 않았고, 그보다 긴 문자열은 등장 횟수를 값으로 딕셔너리에 집어넣었다.
그다음 sorted()를 열고, items()를 이용해 키-값을 튜플로 받은 뒤, 람다 함수를 이용해 다중정렬을 해주었다.
여기서 key는 키-밸류의 키가 아니라 정렬 기준이 되는 값을 정하는 것을 말하며, 람다는 익명함수를 생성하는 명령어이다.
def로 정의하는 함수와 달리 이름이 없으며 x를 매개변수로 한 줄로 간단하게 쓰고 사용할 수 있다는 특징을 보인다.
이어서 괄호 안에는 우선순위에 따른 세 개의 정렬 방식이 쓰여 있는데, 정말 저게 끝이다.
살펴보면
- -x[1]: x의 1번 요소를 기준으로 내림차순 정렬. - 부호가 붙지 않으면 기본적으로 오름차순이다.
- -len(x[0]): 등장 횟수가 같다면 x의 0번 요소, 그러니까 단어의 길이로 내림차순 정렬
- x[0]: 그마저도 같다면 사전순으로 오름차순 정렬
조건문을 잔뜩 붙여 구현하던 내가 부끄러워지는 코드였다.
람다함수는 아직 익숙하지는 않은데 리스트 컴프리헨션과 마찬가지로 언젠간 가까워지겠지.
'Algorithm > [Java+Python+JavaScript]BackJoon' 카테고리의 다른 글
[Python]1021번, 원형 큐 (0) | 2023.04.18 |
---|---|
[Python]1874번, 스택 수열 (0) | 2023.04.16 |
[Python]10828번, 파이썬으로 스택 구현하기 (2) | 2023.04.14 |
[Python]17103번, 골드바흐 파티션 (1) | 2023.04.11 |
[Python]4948번, 베르트랑 공준, 에라토스테네스의 체 (0) | 2023.04.11 |
[Python]4134번, 소수 판별법, Trial Division (2) | 2023.04.10 |
- Total
- Today
- Yesterday
- Python
- 세모
- 동적계획법
- 리스트
- 칼이사
- 지지
- 남미
- Algorithm
- 알고리즘
- 유럽여행
- a6000
- 면접 준비
- 스트림
- RX100M5
- java
- 중남미
- 자바
- BOJ
- 야경
- 기술면접
- 스프링
- 맛집
- 세계일주
- spring
- 세계여행
- 백준
- 여행
- Backjoon
- 유럽
- 파이썬
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |