Algorithm/Baekjoon

[해시] 백준 #20920 영단어 암기는 괴로워 - Python

jyjyjy25 2024. 2. 20. 23:07

🗂️ 문제

링크: https://www.acmicpc.net/problem/1167

 

1167번: 트리의 지름

트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2 ≤ V ≤ 100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. 정점 번호는 1부터 V까지

www.acmicpc.net

 

😎 내 풀이

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])

 

💡 접근법

  1. 딕셔너리를 통해 단어와 단어가 등장한 횟수를 key-value 형식으로 저장한다.
    • 딕셔너리에 단어가 존재하지 않는다면 딕셔너리에 {”단어”: 1}을 추가한다.
    • 딕셔너리에 단어가 존재한다면 단어가 등장한 횟수를 +1한다.
  2. 우선순위를 역순(3 → 2 → 1)으로 적용하여 단어장을 정렬한다.
    • 파이썬의 sort 및 sorted 함수의 key 인자 값을 통해 조건을 지정하여 정렬한다.
💡 이때 다중 조건 정렬을 사용할 경우엔 우선순위를 차례대로 적용해야 한다.
다중 조건에서는 첫 번째 조건에 따라 정렬한 결과가 동일한 것들에 대해서만 두 번째 조건에 따라 정렬하기 때문이다.
예를 들어 첫 번째 조건(자주 나오는 단어일수록 앞에 배치한다.)에 의해 (sand, 3) (apple, 2) (append, 2) 순으로 정렬되었을 때 apple과 append는 첫 번째 조건에 의한 정렬 결과가 동일하다.
이후 두 번째 조건(해당 단어의 길이가 길수록 앞에 배치한다.)에 따라 정렬을 수행할 경우 sand에 대해서는 정렬이 수행되지 않고 apple과 append에 대해서만 정렬이 수행된다. 즉 정렬 결과는 (sand, 3) (append, 2) (apple, 2) 이다.

 

🧐 배운 점

  1. 다중 조건 정렬튜플 형식으로 조건을 나열한다. 이때 -는 내림차순 정렬을 의미한다.
    • sorted(word_dict.items(), key = lambda x : (조건1, 조건2, 조건3))
  2. 딕셔너리에 키가 없을 때엔 None을 반환한다.

 

✅ 정답 확인