728x90
    
    
  반응형
    
    
    
  
코딩테스트 연습 - 후보키
[["100","ryan","music","2"],["200","apeach","math","2"],["300","tube","computer","3"],["400","con","computer","4"],["500","muzi","music","3"],["600","apeach","music","2"]] 2
programmers.co.kr
데이터베이스에서 사용할 수 있는 후보키의 개수를 구하는 문제!
효율적으로 보이지는 않지만 후보키의 개수가 많이 않기 때문에 combinations을 사용해서 구해도 충분히 시간안에 해결 가능한 문제였다!
from itertools import combinations
def solution(relation):
    answer = 0
    n = len(relation[0]) # attributes 수
    keys = []
    # 가능한 키 모두 구하기
    for comb in list(list(combinations(range(n),  i)) for i in range(1, n+1)) : # 가능한 feature 조합
        for case in comb : 
            tmp = ["" for _ in range(len(relation))]
            for i in case :
                for j in range(len(relation)) :
                    tmp[j] = tmp[j] + relation[j][i]
                    
            att_set = set(tmp)
            if len(att_set) == len(relation) :
                keys.append(case)
    
    # 키 중에서 후보키만 필터링
    candidates = []
    for i in keys :
        flag = True
        for j in candidates :
            if len(set(i) & set(j)) == len(set(j)) :
                flag = False
                break
        if flag :
            candidates.append(i)
    answer = len(candidates)
    return answer

728x90
    
    
  반응형
    
    
    
  'CS Study > Algorithm(Coding Test)' 카테고리의 다른 글
| [Programmers] 피로도 (Python) (0) | 2022.03.24 | 
|---|---|
| [Programmers] 124 나라의 숫자 (Python) (0) | 2022.03.24 | 
| [Programmers] 방문 길이 (Python) (0) | 2022.03.24 | 
| [BOJ] 1261. 알고스팟 (Python) (0) | 2022.03.23 | 
| [2022 KAKAO BLIND RECRUITMENT] 양궁대회 (Python) (0) | 2022.03.23 |