[programmers] 후보키

zioo·2022년 9월 11일
1

문제

유일성 - 값을 추출해서 tuple에 담아 리스트로 모아둔 값이 row의 길이와 같은지 체크 (중복 체크)
최소성 - issubset() 을 사용해서 아닌 경우만 unique에 담기

issubset()

부분집합 여부 확인

{3,4}.issubset({2,3,4})
>> True

tuple 사용하는 이유

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)

0개의 댓글