문제
화은이는 이번 영어 시험에서 틀린 문제를 바탕으로 영어 단어 암기를 하려고 한다. 그 과정에서 효율적으로 영어 단어를 외우기 위해 영어 단어장을 만들려 하고 있다. 화은이가 만들고자 하는 단어장의 단어 순서는 다음과 같은 우선순위를 차례로 적용하여 만들어진다.
- 자주 나오는 단어일수록 앞에 배치한다.
- 해당 단어의 길이가 길수록 앞에 배치한다.
- 알파벳 사전 순으로 앞에 있는 단어일수록 앞에 배치한다
M보다 짧은 길이의 단어의 경우 읽는 것만으로도 외울 수 있기 때문에 길이가 M이상인 단어들만 외운다고 한다. 화은이가 괴로운 영단어 암기를 효율적으로 할 수 있도록 단어장을 만들어 주자.
조건 및 입출력
- 첫째 줄에는 영어 지문에 나오는 단어의 개수 N과 외울 단어의 길이 기준이 되는 M이 공백으로 구분되어 주어진다. (1≤N≤100000, 1≤M≤10) 둘째 줄부터 N+1번째 줄까지 외울 단어를 입력받는다. 이때의 입력은 알파벳 소문자로만 주어지며 단어의 길이는 10을 넘지 않는다. 단어장에 단어가 반드시 1개 이상 존재하는 입력만 주어진다.
- 화은이의 단어장에 들어 있는 단어를 단어장의 앞에 위치한 단어부터 한 줄에 한 단어씩 순서대로 출력한다.
- 시간 제한: 1초 이내 (추가시간 없음) / 메모리 제한: 1024MB 이내
코드 (Python 3)
import sys
input=sys.stdin.readline;
voca,memorizing=map(int,input().split());
word={};
for i in range(voca):
temp=input().rstrip();
if(len(temp)<memorizing):
continue;
else:
if(temp not in word):
word[temp]=1;
else:
word[temp]+=1;
result=sorted(word.items(),key=lambda x:(-x[1],-len(x[0]),x[0]));
for i in range(len(result)):
print(result[i][0]);
여담
딕셔너리로 간단하게 풀었다.
기준 단어보다 작으면 다음 루프를 실행하고,
그렇지 않을 경우 최초 등장시 키값에 값을 1로 지정하고, 그 이후에는 +1 씩 계속 더해준다.
그 후 정렬을 수행한다.
딕셔너리를 정렬할 때는 keys, values에 따라 정렬이 가능하다. lambda 함수를 사용해서 문제 조건에 따라 값을 정렬하였다. (참고로 lambda 함수에서 x[0]은 keys, x[1]은 values다.)
그렇게하여, 키값 우선 정렬, 그 후 단어 길이 정렬, 마지막으로 알파벳 순으로 정렬하였다.
정렬 후 result 변수 안에는 keys,values 값이 튜플로 저장되어 있다.
values값은 필요없으니, keys값만 차례대로 출력하면 정답이다.
| 코드가 이상하거나, 이해되지 않는 부분이 있다면 댓글 남겨주세요! + 더 좋은 풀이 방법이 있다면 알려주세요 :) |
'Programming > Python' 카테고리의 다른 글
| [백준] 1269번 : 대칭 차집합 (Python / 파이썬) (0) | 2023.08.13 |
|---|---|
| [백준] 14425번 : 문자열 집합 (Python / 파이썬) (0) | 2023.08.13 |
| [백준] 2408번 : 큰 수 계산 (Python / 파이썬) (0) | 2023.08.07 |
| [백준] 10816번 : 숫자 카드 2 (Python / 파이썬) (0) | 2023.08.07 |
| [백준] 17219번 : 비밀번호 찾기 (Python / 파이썬) (0) | 2023.08.07 |