728x90

20240410 백준 파이썬 공부
20920번 영단어 암기는 괴로워

1. 문제
화은이는 이번 영어 시험에서 틀린 문제를 바탕으로 영어 단어 암기를 하려고 한다. 
그 과정에서 효율적으로 영어 단어를 외우기 위해 영어 단어장을 만들려 하고 있다. 
화은이가 만들고자 하는 단어장의 단어 순서는 다음과 같은 우선순위를 차례로 적용하여 만들어진다.

1) 자주 나오는 단어일수록 앞에 배치한다.
2) 해당 단어의 길이가 길수록 앞에 배치한다.
3) 알파벳 사전 순으로 앞에 있는 단어일수록 앞에 배치한다

M보다 짧은 길이의 단어의 경우 읽는 것만으로도 외울 수 있기 때문에 길이가 M이상인 단어들만 외운다고 한다. 
화은이가 괴로운 영단어 암기를 효율적으로 할 수 있도록 단어장을 만들어 주자.

2. 입력
첫째 줄에는 영어 지문에 나오는 단어의 개수 N과 외울 단어의 길이 기준이 되는 M이 공백으로 구분되어 주어진다. 
(1 <= N <= 100,000, 1 <= M <= 10)

둘째 줄부터 N+1번째 줄까지 외울 단어를 입력받는다. 
이때의 입력은 알파벳 소문자로만 주어지며 단어의 길이는 10을 넘지 않는다.
단어장에 단어가 반드시 1개 이상 존재하는 입력만 주어진다.

3. 출력
화은이의 단어장에 들어 있는 단어를 단어장의 앞에 위치한 단어부터 한 줄에 한 단어씩 순서대로 출력한다.

>>>코드

import sys
word = {} # 단어와 입력된 횟수를 저장할 딕셔너리 생성
n, m =  map(int, input().split()) # n, m 입력받기
for _ in range(n):
    w = sys.stdin.readline().strip() # 단어 입력받기
    if len(w) >= m and w in word: # 단어의 길이가 m 이상이고, word 딕녀너리 안에 존재
        word[w] += 1 # 해당 단어의 입력된 횟수 +1
    elif len(w) >= m and w not in word: # 단어의 길이가 m 이상이고, word 딕녀너리 안에 존재하지 않음
        word[w] = 1 # 해당 단어 생성
# 조건에 맞게 정렬한 리스트 생성(1. 입력된 횟수 내림차순, 2. 단어의 길이 내림차순, 3. 알파벳순 오름차순)
result = sorted(list(word.keys()), key = lambda x: (-word[x], -len(x), x))
# 순서대로 출력
print(*result, sep = "\n")



>>> 코드 해설

1) sorted(리스트, key = lambda x: (정렬 조건1, 정렬 조건2, ..))
- 리스트를 정렬 조건에 따라 순서대로 정렬하는 함수
- 정렬 조건에는 x(사전순서 or 숫자순서), len(x)(단어의 길이) 등등이 올수 있으며, 
그냥 쓰면 오름차순, 앞에 "-" 를 붙이면 내림차순이 된다

2) 딕셔너리.keys()
- 딕셔너리에서 key들을 반환하는 함수
- list()안에 사용해주면 해당 딕셔너리의 key들을 리스트에 반환해준다.

3) 딕셔너리.values()
- 딕셔너리에서 value들을 반환하는 함수
- list()안에 사용해주면 해당 딕셔너리의 value들을 리스트에 반환해준다.


>>>문제링크
https://www.acmicpc.net/problem/20920

728x90

+ Recent posts