# 후보키 - 프로그래머스

후보키 - 프로그래머스

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)