Problem solving

백준 1062번 가르침 (Python 3)

storkbear 2022. 9. 8. 14:49

 

Baekjoon online judge 1062번 파이썬

 

링크

https://www.acmicpc.net/problem/1062

 

1062번: 가르침

첫째 줄에 단어의 개수 N과 K가 주어진다. N은 50보다 작거나 같은 자연수이고, K는 26보다 작거나 같은 자연수 또는 0이다. 둘째 줄부터 N개의 줄에 남극 언어의 단어가 주어진다. 단어는 영어 소문

www.acmicpc.net

남들은 다 비트마스킹가지고 풀더라

우선 antic, 이 다섯 문자는 무조건 가지고 있어야한다. 따라서 k가 5보다 작다면 0을 출력한다.

combination을 이용해서 antic,을 제외한 문자를 선택한 경우의 수를 구한다.

입력을 set으로 바꾸고, antic를 빼준다. (차집합)

이제 우리가 선택한 경우의 수에서 issubset을 이용해 입력이 우리가 선택한 경우의 수의 부분집합인지 확인한다.

 

소스코드

import sys
from itertools import combinations
input=sys.stdin.readline

n,k=map(int,input().split())
alpha=['b','c','d','e','f','g','h','j','k','l','m','o','p','q','r','s',
       'u','v','w','x','y','z']


now_max=-1
if k>=5:
    possible=list(combinations(alpha,k-5))
    temp={'a','n','t','i','c'}

    s=list()
    for _ in range(n):
        s.append(set(input().rstrip())-temp)

    for p in possible:
        a=set(p)
        cnt=0
        for k in s:
            if k.issubset(a):
                cnt+=1
        now_max=max(now_max,cnt)
    print(now_max)
else:
    print(0)