[プログラマ]候補鍵


質問リンク


https://programmers.co.kr/learn/courses/30/lessons/42890

問題の説明

  • の候補鍵の数を返します.
  • 候補鍵:一意性、最小性を満たす列の組合せ
  • に答える

  • 部分集合
  • 最小値と一意性を満たす場合setに追加
  • 最小性検査
  • の部分集合の部分集合が既に集合中に存在する場合、最小X
  • .
  • 一意性検査
  • に重複値
  • があるかどうかを確認します.
  • セットの
  • を返します.

    コード#コード#

    from itertools import combinations
    
    
    def solution(relation):
        candidates = set()
        cols = len(relation[0])
        for i in range(1, cols + 1):
            for combi in combinations(range(cols), i):
                if possible(relation, candidates, combi):
                    candidates.add(combi)
        return len(candidates)
    
    
    def possible(relation, candidates, combi):
        # 최소성
        for i in range(1, len(combi) + 1):
            for combi2 in combinations(combi, i):
                if combi2 in candidates:
                    return False
        # 유일성
        unique = set()
        for line in relation:
            curr = []
            for i in combi:
                curr.append(line[i])
            if tuple(curr) in unique:
                return False
            unique.add(tuple(curr))
        return True