# 후보키 - 프로그래머스
def solution(relation):
c_li = []
unique = []
l = len(relation[0])
for i in range(1, l + 1):
c = combinations([i for i in range(0, l)], i)
c_li.extend(c)
# 유일성 (구별할 수 있는 조합)
for comb in c_li:
temp = []
for row in range(0, len(relation)):
temp_li = [relation[row][i] for i in comb]
temp.append(tuple(temp_li))
if len(set(temp)) == len(relation):
unique.append(comb)
# 최소성
s = set(unique)
for i in range(0, len(unique) - 1): # 후보키의 갯수가 작은 것부터 확인하므로
for j in range(i + 1, len(unique)):
if set(unique[i]) == set(unique[i]) & set(unique[j]): # 나머지 현재 인덱스 이후로 겹치는 것이 있다면 최소성을 만족하지 않으므로
s.discard(unique[j]) # 삭제
return len(s)