⚡️algorithm

[조합, 자료구조] 프로그래머스 lv2. 후보키

남남이루 2022. 5. 31. 17:51

문제

문제 바로가기

후보키를 구하는 문제이다. 후보키의 개념을 알고 있다면, 문제이해가 빠르긴 한데 구현이 더 중요하다.

리뷰

주요 변수는 맞았는데,
for의 전개나 구조가 너무 복잡하게 느껴졌었다.
다른 사람들 코드를 보니 자료구조를 정말 적극적으로 사용한 게 보였다. 반복해서 연습하면 skill 향상이 되지 않을까 한다..
냠냠..

코드

from itertools import combinations

rel = [["100","ryan","music","2"],["200","apeach","math","2"],["300","tube","computer","3"],["400","con","computer","4"],["500","muzi","music","3"],["600","apeach","music","2"]]
result = 2

candidate_key = []
c_cnt = len(rel[0]) # 컬럼수
p_cnt = len(rel) # 사람수
key_idx = list(range(c_cnt))


for i in range(1, c_cnt+1):
    candidate_key.extend(combinations(key_idx,i))

unique = []
for ck in candidate_key:
    tmp = [tuple([item[i] for i in ck]) for item in rel]
    if len(set(tmp)) == p_cnt:
        unique.append(ck)

diff = set(unique)
for i in range(len(unique)):
    for j in range(i+1, len(unique)):
        if len(unique[i]) == len(set(unique[i]).intersection(set(unique[j]))):
            diff.discard(unique[j])
print(diff) # {(1, 2), (0,)}
print(len(diff))