[백준] 1062번 가르침
문제 링크
https://www.acmicpc.net/problem/1062
문제 설명
- 문자열 리스트가 주어짐
- antatica를 무조건 포함
- 소문자 알파벳 중에서 k개를 선택해서 가르침
- 단어를 온전히 읽을 수 있는 개수의 최대값 출력
풀이
- antic를 미리 선택
- 나머지 중에서 k-5개 선택
- 선택한 알파벳으로 읽을 수 있는 단어 카운트
- 최댓값 출력
후기
- 처음에 복잡도 계산을 잘못해서 시간초과가 날 줄 알았다
- 문제 유형에 비트마스킹이 있어서 그쪽으로 생각해봤다
- 근데 antatica를 빼고 다시 계산해보니 모든 경우의 수를 세어도 40만 이하였다
- 완전탐색해보니 그냥 풀렸다
코드
import sys
from itertools import combinations
def solution():
read = sys.stdin.readline
n, k = map(int, read().split())
words = [read().rstrip()[4:-4] for _ in range(n)]
# antatica를 선택할수 없으면 0
if k < 5:
print(0)
return
already = set('antatica')
chars = [chr(ord('a')+i) for i in range(26) if chr(ord('a')+i) not in already]
max_count = float('-inf')
# chars 중에서 k-5개 선택
for combi in combinations(chars, k-5):
sett = already | set(combi)
count = 0
for word in words:
possible = True
# words 중에 하나라도 불가능하면 break
for i in range(len(word)):
if word[i] not in sett:
possible = False
break
if possible:
count += 1
max_count = max(max_count, count)
print(max_count)
solution()
Author And Source
이 문제에 관하여([백준] 1062번 가르침), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@leehj8896/백준-1062번-가르침
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
- 처음에 복잡도 계산을 잘못해서 시간초과가 날 줄 알았다
- 문제 유형에 비트마스킹이 있어서 그쪽으로 생각해봤다
- 근데 antatica를 빼고 다시 계산해보니 모든 경우의 수를 세어도 40만 이하였다
- 완전탐색해보니 그냥 풀렸다
코드
import sys
from itertools import combinations
def solution():
read = sys.stdin.readline
n, k = map(int, read().split())
words = [read().rstrip()[4:-4] for _ in range(n)]
# antatica를 선택할수 없으면 0
if k < 5:
print(0)
return
already = set('antatica')
chars = [chr(ord('a')+i) for i in range(26) if chr(ord('a')+i) not in already]
max_count = float('-inf')
# chars 중에서 k-5개 선택
for combi in combinations(chars, k-5):
sett = already | set(combi)
count = 0
for word in words:
possible = True
# words 중에 하나라도 불가능하면 break
for i in range(len(word)):
if word[i] not in sett:
possible = False
break
if possible:
count += 1
max_count = max(max_count, count)
print(max_count)
solution()
Author And Source
이 문제에 관하여([백준] 1062번 가르침), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@leehj8896/백준-1062번-가르침
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
import sys
from itertools import combinations
def solution():
read = sys.stdin.readline
n, k = map(int, read().split())
words = [read().rstrip()[4:-4] for _ in range(n)]
# antatica를 선택할수 없으면 0
if k < 5:
print(0)
return
already = set('antatica')
chars = [chr(ord('a')+i) for i in range(26) if chr(ord('a')+i) not in already]
max_count = float('-inf')
# chars 중에서 k-5개 선택
for combi in combinations(chars, k-5):
sett = already | set(combi)
count = 0
for word in words:
possible = True
# words 중에 하나라도 불가능하면 break
for i in range(len(word)):
if word[i] not in sett:
possible = False
break
if possible:
count += 1
max_count = max(max_count, count)
print(max_count)
solution()
Author And Source
이 문제에 관하여([백준] 1062번 가르침), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@leehj8896/백준-1062번-가르침저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)