Post

🦊 가르침

1. 문제 링크

1062번: 가르침


2. 코드

Python3 31120KB 1660ms

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
31
32
33
34
35
36
37
38
39
40
41
42
43
N, K = map(int, input().split())

words = []
for i in range(N):
    word = input()
    word_bit = 0
    for ch in word:
        word_bit |= 1 << (ord(ch) - ord('a'))
    words.append(word_bit)

learn_count = 0
if K < 5:
    print(0)
elif K == 26:
    print(N)
else:
    learned = 0
    antatica = ['a', 'n', 't', 'i', 'c']
    for ch in antatica:
        learned |= 1 << (ord(ch) - ord('a'))

    def backtracking(n, picked):
        global learned
        global learn_count
        if picked == K:
            count = 0
            for i in range(N):
                if (words[i] & learned) == words[i]:
                    count += 1
            learn_count = max(learn_count, count)
            # print(count)
            return

        # 배움
        for i in range(n, 26):
            to_learn = 1 << i
            if not (learned & to_learn):
                learned |= to_learn
                backtracking(i, picked + 1)
                learned &= ~to_learn

    backtracking(0, 5)
    print(learn_count)


3. 해설

combinations 내장 함수가 너무 느려서 시간초과 발생, 직접 구현하니까 됨

알파벳을 배우는 경우를 int 의 bit 로 마스킹해서 저장

이후 K개의 단어를 배웠을때 비트로 변환한 단어들과 비교해서 배운 여부를 판단

This post is licensed under CC BY 4.0 by the author.