[BOJ_1062] 가르침(python)

그냥·2024년 6월 9일

알고리즘

목록 보기
8/23

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

문제


코드

from itertools import combinations

def find(base, arr):
    cnt = 0
    for i in arr: 
        if (base & i) == i:
            cnt += 1
    return cnt

n, k = map(int, input().split())
t = []
v = set()
k -= 5
for _ in range(n):
    s = input().strip()
    r = 0
    for i in s:
        if i in 'acint': continue
        v.add(1 << ord(i) - 97)
        r |= (1 << ord(i) - 97)
    t.append(r)
if k < 0:
    print(0)
else:
    ans = 0
    for comb in combinations(v, min(k, len(v))):
        base = 0
        for c in comb:
            base += c
        ans = max(ans, find(base, t))
    print(ans)

Idea 1

for i in s:
	if i in 'acint': continue  	 # 'acint'가 포함된 경우는 확인하지 않음
    v.add(1 << ord(i) - 97)		 # 사용되는 문자를 하나씩 저장하는 집합(set)
    r |= (1 << ord(i) - 97)      # 비트 OR연산을 통해 사용되는 문자 전체 저장

Idea 2

combinations(v, k) -> 오류
combinations(v, min(k, len(v)))  # 조합(문자 집합, 최소값(사용할 수 있는 문자 개수, 문자 집합의 길이(개수))

-> 사용할 수 있는 문자(k)는 20개 이지만 집합에는 2개의 문자(len(v))만 포함되어 있다면 오류가 발생 

++ 문제를 풀때는 생각이 잘 안났는데 다시 보니 너무 당연한 것 같네.. 집합 길이보다 선택개수가 크면 어떻게 뽑겠니? 어? 

0개의 댓글