[PRO] 후보키

천호영·2022년 8월 27일
0

알고리즘

목록 보기
49/100
post-thumbnail
from itertools import combinations
from collections import defaultdict

def solution(relation):
    columns = list(range(len(relation[0])))
    memoization = defaultdict(bool)
    for i in range(1,len(columns)+1):
        for column_combi in list(combinations(columns,i)): # 오름차순
            memoization[column_combi] = True
            
            # TODO 칼럼 하나 제외했을때 후보키 True인게 있나 체크 => 2개제외해도 있으면 안됨
            for k, v in memoization.items():
                if k!=column_combi and v is True: # 본인 제외
                    if not (set(k) - set(column_combi)):
                        memoization[column_combi] = False # 최소성에서 탈락
            
            # TODO 해당 칼럼들로 unique하게 식별가능한지 체크
            check_set = set()
            for one_rel in relation:
                check_tuple = tuple(one_rel[i] for i in range(len(one_rel)) if i in column_combi)
                check_set.add(check_tuple)
            if len(relation) != len(check_set):
                memoization[column_combi] = False # 유일성에서 탈락
            

    return list(memoization.values()).count(True)
profile
성장!

0개의 댓글