[Programmers/프로그래머스] 2019 KAKAO BLIND RECRUITMENT 후보키 - Python/파이썬 [해설/풀이]

SihoonCho·2022년 11월 1일
0
post-thumbnail
[Programmers/프로그래머스] 2019 KAKAO BLIND RECRUITMENT [코딩테스트]
  1. [Lv. 2] 오픈채팅방
  2. [Lv. 1] 실패율
  3. [Lv. 2] 후보키
  4. [Lv. 4] 무지의 먹방 라이브
  5. [Lv. 3] 길 찾기 게임
  6. [Lv. 3] 매칭 점수
  7. [Lv. 4] 블록 게임

📌 문제


📝 제한사항


💻 입출력 예


📖 입출력 예에 대한 설명


📌 풀이


from itertools import combinations

def solution(relations):    
    # 조합가능한 모든 경우의 후보키 생성
    candidates = []
    columns_num = len(relations[0])
    for k in range(1, columns_num + 1):
        candidates += list(combinations(range(columns_num), k))
    
    # 유일성 체크
    unique = []
    for candidate in candidates:                # 각 속성조합에 대해
        # 각 튜플에 대해, 해당조합의 속성만 추출한 튜플 생성
        temp = [tuple([relation[i] for i in candidate]) for relation in relations]
        if len(set(temp)) == len(relations):    # 추출된 튜플이 모든 튜플을 식별했다면
            unique.append(candidate)            # 해당속성조합을 unique에 저장

    # 최소성 체크, 중복없이 모두 비교
    answer = set(unique)                        # discard 사용을 위한 set변환
    for i in range(len(unique) - 1):            # i = 0 ~ end-1
        for j in range(i + 1, len(unique)):     # j = i + 1 ~ end
            # 현재속성조합과 다음속성조합을 비교, 공통인 속성의 개수가 현재속성 조합개수와 같다면
            # = 현재속성조합이 다음속성조합의 부분집합이라면, 다음속성조합은 최소성을 만족하지 못 함 
            if len(unique[i]) == len(set(unique[i]) & set(unique[j])):
                answer.discard(unique[j])       # 다음속성조합 unique에서 삭제

    return len(answer)

set() 자료형의 remove() 메소드는,
지우려는 엘리먼트가 존재하지 않으면 KeyError 발생

set() 자료형의 discard() 메소드는,
지우려는 엘리먼트가 존재하지 않더라도 KeyError 발생 없이 정상종료

profile
개발을 즐길 줄 아는 백엔드 개발자

0개의 댓글