가르침(1062)

김동한·2025년 6월 13일
0

CODE_TEST

목록 보기
36/39

풀이

  1. 일단 "anta"로 시작해서 "tica"로 끝나는 단어만 있어서, "antic" 5글자는 최소 알아야한다.

  2. 26개 철자 모두 알면 주어진 n개의 단어 모두 읽을 수 있다.

  3. 그 사이에 있는 단어들은 읽을 수 있는지 확인해야한다.

  4. 학생이 배우는 글자의 경우의 수를 모두 탐색하면서, 최대가 되는 경우를 count하자.

  5. 비트마스킹을 진행한다.


    ord('a')의 결과 → 97 따라서, ord('char')-97는 a부터 z까지 0부터 25로 mapping할 수 있게 한다.

  6. learned_alphabet=[False]*26로 학생들이 배운 알파벳 배열을 선언한 뒤, 경우의 수를 백트래킹으로 탐색하자.

  7. for c in ('a','n','t','i','c'): learned_alphabet[ord(c)-ord('a')]=True 미리 'antic'단어는 True처리를 해둔다.

  8. 단어를 배울 때마다, depth를 1 증가하고, depth가 k(배울 수 있는 알파벳 한계)와 같아지면, 현재 answer와 비교해 최대값을 update해준다.

  9. if not learned_alphabet[i]를 통해서, 배우지 않은 철자만 배울 수 있게 시간을 단축시킨다.

n,k=map(int,input().split())
word_list=[list(input())for _ in range(n)]
answer=0
learned_alphabet=[False]*26

def checker(word_list):
    cnt=0
    for word in word_list:
        toggle=True
        for char in word:
            if not learned_alphabet[ord(char)-97]:
                toggle=False
        if toggle:
            cnt+=1

    return cnt

def dfs(start,depth):
    global answer

    if depth==k:
        answer=max(answer,checker(word_list))
        return
    
    for i in range(start,26):
        if not learned_alphabet[i]:
            learned_alphabet[i]=True
            dfs(i,depth+1)
            learned_alphabet[i]=False

if k<5:
    print(0)
elif k==26:
    print(n)
else:
    for c in ('a','n','t','i','c'):
        learned_alphabet[ord(c)-ord('a')]=True

    dfs(0,5)

    print(answer)
profile
(●'◡'●)

0개의 댓글