Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
Tags
- 케이티 에이블스쿨 기자단
- 티스토리챌린지
- 백준
- 판다스
- KT 에이블스쿨
- 알고리즘
- 프로그래머스
- 케이티 에이블스쿨 6기 ai
- kt 에이블스쿨 6기 ai
- SQLD
- 케이티 에이블스쿨 6기
- 오블완
- 케이티 에이블스쿨 6기 java
- 케이티 에이블스쿨
- kt 에이블스쿨 6기 미니 프로젝트
- 에이블 기자단
- 구현
- kt aivle school
- kt 에이블스쿨 6기 빅프로젝트
- 엘라스틱서치
- 머신러닝
- 데이터 프레임
- 케이티 에이블스쿨 6기 후기
- ElasticSearch
- KT AIVLE
- 네트워크
- kt 에이블스쿨 6기
- 파이썬
- kt 에이블스쿨 기자단
- 앙상블
Archives
- Today
- Total
미식가의 개발 일기
[백준/Python] #1062번 가르침 본문

문제
- 읽을 수 있는 단어 개수가 최대가 되는 K개의 글자 찾기
- 모든 단어는 "anta"로 시작되고, "tica"로 끝난다.
- 남극언어에 단어는 N개 밖에 없다고 가정
<입력 조건>
- N <= 50인 자연수
- K <= 26인 자연수 or K = 0
- 단어: 영어 소문자, 8 <= 단어의 길이 <= 15, 중복 X
해결 방법
- 모든 단어에는 앞, 뒤로 무조건 와야하는 문자가 있으므로 'antic'은 무조건 K개의 글자에 포함되어야 한다. 따라서 K의 값이 5보다 작다면 정답은 0이고, 알파벳은 총 26글자 이므로 K의 값이 26이라면 정답은 N이다.
- itertools의 combinations를 사용하여 K-5개로 이뤄진 단어의 조합들을 탐색하며 읽을 수 있는 단어의 최댓값을 업데이트 해주면 된다.
- 단, 여기서 중요한 최적화 포인트는 비트 마스크 연산이다.(처음에는 집합을 이용해 포함 여부를 판별했지만, 시간 초과가 발생했다..)
- 'a'는 0번째 비트 → '1 << 0' → 0b000...0001
- 'b'는 1번째 비트 → '1 << 1' → 0b000...0010
정답

import sys
input = sys.stdin.readline
from itertools import combinations
def cal(words, N, K):
if K < 5:
return 0
elif K ==26:
return N
max_cnt = 0
target = [1 << i for i in range(26)]
for i in [ord(ch) - ord('a') for ch in 'antic']:
target.remove(1 << i)
for combi in combinations(target, K-5):
cnt = 0
base = sum(1 << (ord(c) - ord('a')) for c in 'antic')
for c in combi:
base += c
for w in words:
if base & w == w:
cnt += 1
max_cnt = max(max_cnt, cnt)
return max_cnt
def main():
N, K = map(int, input().split())
words = []
for _ in range(N):
w = 0
for i in list(input().rstrip()):
# 비트마스크 형태로 변환 (알파벳을 숫자로 변환 후 해당 위치에 비트를 1로 만듦)
# a -> 0 -> 0b000...0001, b -> 1 -> 0b000...0010
w |= (1 << (ord(i) - ord('a')))
words.append(w)
print(cal(words, N, K))
if __name__ == "__main__":
main()반응형
'Python > Algorithm' 카테고리의 다른 글
| [백준/Python] #2504번 괄호의 값 (1) | 2025.04.08 |
|---|---|
| [백준/Python] #14888번 연산자 끼워넣기 (0) | 2025.04.02 |
| [백준/Python] #1748번 수 이어 쓰기 1 (0) | 2024.12.10 |
| [백준/Python] #6064번 카잉 달력 (1) | 2024.12.08 |
| [백준/Python] #1107번 리모컨 (1) | 2024.12.05 |