👨‍🏫ps/❄️프로그래머스

[프로그래머스] 후보키 [python]

peacekim 2023. 5. 2. 22:28
반응형

문제

조합과 구현을 섞어 놓은 문제였다. 구현을 잘 한다면 풀 수 있는 문제이다.

 

코드


def solution(relation):
    global answer
    answer = 0
    candidates = []
    for i in range(1,len(relation[0]) + 1): ## 조합
        combination([], i, 0, relation, candidates)
    return len(candidates)

def combination(comb, maxLen, nextN, relation, candidates):
    global answer
    if isInCandidates(comb, candidates): 
        return
    if maxLen == len(comb):
        if canUseCandidateKey(comb, relation) == False:
            return
        answer += 1
        candidates.append(tuple(comb))
        return
    for i in range(nextN, len(relation[0])):
        comb.append(i)
        combination(comb, maxLen, i + 1, relation, candidates)
        comb.pop(-1)

def canUseCandidateKey(comb, relation):
    allValues = []
    for r in relation:
        tmp = []
        for i in comb:
            tmp.append(r[i])
        if tmp in allValues:
            return False
        allValues.append(tmp)
    return True
def isInCandidates(comb, candidates):
    for i in candidates:
        cnt = 0
        for k in list(i):
            if k in list(comb):
                cnt += 1
        if cnt == len(i): 
            return True
    return False

"""
완전 탐색
comb에 있는 값들은 어떤 컬럼을 쓰는 지,
"""
반응형