🗂️ 문제
링크: https://www.acmicpc.net/problem/1167
😎 내 풀이
import sys
N, M = map(int, sys.stdin.readline().split())
arr = [sys.stdin.readline().rstrip() for _ in range(N)]
word_dict = {}
for i in arr:
# 단어의 길이가 M 이상인 단어만 단어장에 저장
if len(i) < M:
continue
if word_dict.get(i) is None:
word_dict[i] = 1
else:
word_dict[i] += 1
word_dict = sorted(word_dict.items(), key = lambda x : (-x[1], -len(x[0]), x[0]))
for w in word_dict:
print(w[0])
💡 접근법
- 딕셔너리를 통해 단어와 단어가 등장한 횟수를 key-value 형식으로 저장한다.
- 딕셔너리에 단어가 존재하지 않는다면 딕셔너리에 {”단어”: 1}을 추가한다.
- 딕셔너리에 단어가 존재한다면 단어가 등장한 횟수를 +1한다.
- 우선순위를 역순(3 → 2 → 1)으로 적용하여 단어장을 정렬한다.
- 파이썬의 sort 및 sorted 함수의 key 인자 값을 통해 조건을 지정하여 정렬한다.
💡 이때 다중 조건 정렬을 사용할 경우엔 우선순위를 차례대로 적용해야 한다.
다중 조건에서는 첫 번째 조건에 따라 정렬한 결과가 동일한 것들에 대해서만 두 번째 조건에 따라 정렬하기 때문이다.
예를 들어 첫 번째 조건(자주 나오는 단어일수록 앞에 배치한다.)에 의해 (sand, 3) (apple, 2) (append, 2) 순으로 정렬되었을 때 apple과 append는 첫 번째 조건에 의한 정렬 결과가 동일하다.
이후 두 번째 조건(해당 단어의 길이가 길수록 앞에 배치한다.)에 따라 정렬을 수행할 경우 sand에 대해서는 정렬이 수행되지 않고 apple과 append에 대해서만 정렬이 수행된다. 즉 정렬 결과는 (sand, 3) (append, 2) (apple, 2) 이다.
🧐 배운 점
- 다중 조건 정렬튜플 형식으로 조건을 나열한다. 이때 -는 내림차순 정렬을 의미한다.
- sorted(word_dict.items(), key = lambda x : (조건1, 조건2, 조건3))
- 딕셔너리에 키가 없을 때엔 None을 반환한다.
✅ 정답 확인
'Algorithm > Baekjoon' 카테고리의 다른 글
[그리디] 백준 #1541 잃어버린 괄호 - Python (0) | 2024.03.05 |
---|---|
[그리디] 백준 #11047 동전 0 - Python (0) | 2024.03.04 |
[BFS] 백준 #1167 트리의 지름 구하기 - Python (1) | 2023.10.10 |
[BFS] 백준 #2178 미로 탐색하기 - Python (0) | 2023.10.10 |
[DFS/BFS] 백준 #1260 DFS와 BFS 프로그램 - Python (0) | 2023.10.09 |