jyamethyst21 님의 블로그
백준 20920번- '영단어 암기는 괴로워' (PYTHON 풀이) 본문
문제:

설명이 잘 나와있어서 딱히 더 말할 건 없다.
위 조건에 맞게 단어를 정렬해서 출력하면 된다.
풀이:
N, M = map(int,input().split())
word = {}
for i in range(N):
a = input()
if len(a) < M:
continue
if a in word:
word[a] += 1
else:
word[a] = 1
word_sort = sorted(word.items(), key=lambda x: (-x[1], -len(x[0]), x[0]))
for k, v in word_sort:
print(k)
처음에 이렇게 작성했는데 답은 잘 출력되지만 시간초과가 발생했다.
딕셔너리 형태로 만들어서 value값에 등장한 횟수를 넣고 이를 정렬해서 많이 나온 수를 1차로 정렬하고 그 다음 단어 길이 순, 사전순으로 추가 정렬 기준을 만들어서 코드를 작성했다.
import sys
N, M = map(int,sys.stdin.readline().split())
word = {}
for i in range(N):
a = input()
if len(a) < M:
continue
if a in word:
word[a] += 1
else:
word[a] = 1
word_sort = sorted(word.items(), key=lambda x: (-x[1], -len(x[0]), x[0]))
for k, v in word_sort:
print(k)
입력방식만 바꿔서 진행했는데도 시간초과가 나서 게시판을 둘러보다가 pypy3로 제출하면 통과된다고 해서 진행했더니 바로 맞출 수 있었다. 백준에서 늘 보기만 하던 언어라 무슨 차이인지 잘 몰랐는데 궁금해져서 찾아보았다. JIT 컴파일을 적용해서 복잡한 코드에서는 보통python3보다 pypy3가 더 우세하다고 한다. 시간초과 정도의 차이는 앞으로 pypy3로해서 내도 될 것 같다.
무튼 코드를 간략하게 설명하자면 단어 빈도수에 대한 내용을 보자마자 딕셔너리의 value를 활용하면 되겠다고 생각했는데, 딕셔너리는 {'a' : 1} 이러한 형태로 a를 key, 1을 value 값이라고 칭한다. 그래서 특정 기준 길이만 넘으면 해당 키의 값을 1씩 키워주고 없으면 딕셔너리에 키를 추가해서 딕셔너리를 만들고, sorted 함수를 활용해서 정렬 조건을 줬다.
예전에 딕셔너리 정렬 시 sorted의 key 매개변수를 활용해서 정렬 기준을 줬었는데 또 활용하였다. lambda 함수를 넣어서 세개의 정렬 기준을 그대로 만들어주었다. x[1]은 value값을 오름차순으로 정렬하겠다는건데 앞에 -를 붙이면 내림차순으로 정렬하겠단 의미가 된다 그 다음 조건도 마찬가지이고, 마지막은 사전순 정렬이니 - 없이 바로 x[0]로 key값을 기준으로 정렬하는 것으로 조건을 작성하였다.
'CODING 💻' 카테고리의 다른 글
| 백준 1920번- '수 찾기' (PYTHON 풀이) (0) | 2025.11.06 |
|---|---|
| 백준 2108번- '통계학' (PYTHON 풀이) (0) | 2025.11.05 |
| 백준 1037번- '약수' (PYTHON 풀이) (0) | 2025.11.03 |
| 백준 25192번- '인사성 밝은 곰곰이' (PYTHON 풀이) (1) | 2025.11.02 |
| 백준 1010번- '다리 놓기' (PYTHON 풀이) (0) | 2025.11.01 |
