티스토리 뷰
반응형
백준 영단어 암기는 괴로워 20920 파이썬
문제
- 단어 N개가 주어진다.
- 길이가 M 이상인 단어만 암기 대상이다.
- 단어의 정렬 기준은 다음과 같다:
- 많이 등장한 단어가 먼저
- 단어 길이가 길수록 먼저
- 사전순으로 앞선 단어가 먼저
- 출력은 정렬된 단어들을 한 줄씩 출력한다.
테스트케이스
입력 1
7 4
apple
ant
sand
apple
append
sand
sand
출력 1
sand
apple
append
입력 2
12 5
appearance
append
attendance
swim
swift
swift
swift
mouse
wallet
mouse
ice
age
출력 2
swift
mouse
appearance
attendance
append
wallet
문제작동원리
- 단어를 입력받으면서 길이가 M 이상인지 확인한다.
- 단어 빈도를 세기 위해 **딕셔너리(dictionary)**를 사용한다.
- 모든 단어를 리스트에 옮겨 담은 뒤 `sort()`로 정렬한다.
- 정렬 기준:
- 등장 횟수 N (내림차순)
- 단어 길이 len (내림차순)
- 사전순 (오름차순)
아이디어
- 파이썬의 **딕셔너리**를 활용해 단어 빈도를 효율적으로 집계한다.
- 이후 **커스텀 정렬**을 위해 `Word` 클래스를 정의하고, `__lt__` 메소드를 오버라이딩하여 문제의 정렬 기준을 구현한다.
- 마지막으로 정렬된 리스트를 순회하며 출력한다.
- 이렇게 하면 복잡한 구현 없이 문제를 효율적으로 해결할 수 있다.
전체코드
import sys
input = sys.stdin.readline
class Word:
def __init__(self, arr, N):
self.arr = arr
self.N = N
self.lenArr = len(arr)
def __lt__(self, word):
if self.N != word.N:
return self.N > word.N
if self.lenArr != word.lenArr:
return self.lenArr > word.lenArr
return self.arr < word.arr
def __str__(self):
return f'{self.arr}'
N, M = map(int, input().split())
arr = dict()
for i in range(N):
temp = input().strip()
if len(temp) < M:
continue
if temp in arr:
arr[temp] += 1
else:
arr[temp] = 1
st = []
for key, val in arr.items():
st.append(Word(key, val))
st.sort()
for i in range(len(st)):
print(st[i])
결론
- 파이썬의 **딕셔너리**를 사용해 단어 빈도 집계를 \(O(N)\)으로 처리할 수 있습니다.
- 클래스를 정의하고 **`__lt__` (less than) 메소드를 오버라이딩**하여 여러 정렬 기준을 한 번에 적용할 수 있습니다.
- 이를 통해 BOJ 20920번 문제를 시간 초과 없이 효율적으로 해결할 수 있습니다.
반응형
'백준 스터디' 카테고리의 다른 글
백준 17484 진우의 달 여행 (Small) Python (1) | 2025.09.04 |
---|---|
백준 17484 진우의 달 여행 (Small) C++ (0) | 2025.09.04 |
백준 영단어 암기는 괴로워 (20920번) C++ (1) | 2025.08.31 |
백준 비밀번호 발음하기 (4659번) 파이썬 (0) | 2025.08.31 |
백준 비밀번호 발음하기 (4659번) C++ (0) | 2025.08.31 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 문제 풀이
- 동적 계획법
- 파이썬
- 프로그래밍
- 그리디알고리즘
- 그리디
- 코딩
- DP
- 코딩테스트
- c언어
- 알고리즘 문제풀이
- 브루트포스
- Python
- 알고리즘문제풀이
- 파이썬코딩
- 백준
- 문제풀이
- python 알고리즘
- 동적계획법
- C++ 알고리즘
- 인접 행렬
- 문자열처리
- 알고리즘기초
- 코딩 테스트
- c++알고리즘
- 그래프 탐색
- C++
- 알고리즘
- dfs
- 객체지향
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
글 보관함
반응형