유일성 - 값을 추출해서 tuple에 담아 리스트로 모아둔 값이 row의 길이와 같은지 체크 (중복 체크)
최소성 - issubset() 을 사용해서 아닌 경우만 unique에 담기
부분집합 여부 확인
{3,4}.issubset({2,3,4})
>> True
set 변환 문제
2차원 리스트를 set으로 변환해 중복 값을 제거하려고 하면 에러가 발생
-> list를 tuple로 바꾼 다음에 set으로 변경해야 됨
set([[9, 9], [], [], [9, 9]])
Traceback (most recent call last):
File "", line 1, in
TypeError: unhashable type: 'list'
# 이러한 경우에는 list 안에 있는 list를 tuple로 변환하고 set으로 다시 변환해 중복 값을 제거할 수 있습니다.
#list를 tuple로 변환
list(map(tuple,[[9, 9], [], [], [9, 9]]))
#[(9, 9), (), (), (9, 9)]
#tuple을 set으로 변환해 중복값을 제거
set(list(map(tuple,[[9, 9], [], [], [9, 9]])))
#{(), (9, 9)}
from itertools import combinations
def solution(relation):
answer = 0
col = len(relation[0])
row = len(relation)
combi = []
# 후보키 가능 경우의 수
for i in range(1,col+1):
combi+= combinations(range(col),i)
# 유일성
unique = []
for com in combi :
# 2차원 이상 list -> set 변환 안됨
# tuple -> set
only = [tuple([r[c] for c in com] ) for r in relation]
if len(set(only)) == row :
check = True
for x in unique :
# 최소성 확인
if set(x).issubset(set(com)):
check = False
break
if check :
unique.append(com)
return len(unique)