[프로그래머스 Lv.2] 2019 카카오 블라인드 채용 - 후보키

2024. 12. 18. 15:44·코딩테스트
728x90
반응형

문제

프렌즈대학교 컴퓨터공학과 조교인 제이지는 네오 학과장님의 지시로, 학생들의 인적사항을 정리하는 업무를 담당하게 되었다.

그의 학부 시절 프로그래밍 경험을 되살려, 모든 인적사항을 데이터베이스에 넣기로 하였고, 이를 위해 정리를 하던 중에 후보키(Candidate Key)에 대한 고민이 필요하게 되었다.

후보키에 대한 내용이 잘 기억나지 않던 제이지는, 정확한 내용을 파악하기 위해 데이터베이스 관련 서적을 확인하여 아래와 같은 내용을 확인하였다.

관계 데이터베이스에서 릴레이션(Relation)의 튜플(Tuple)을 유일하게 식별할 수 있는 속성(Attribute) 또는 속성의 집합 중, 다음 두 성질을 만족하는 것을 후보 키(Candidate Key)라고 한다.

  • 유일성(uniqueness) : 릴레이션에 있는 모든 튜플에 대해 유일하게 식별되어야 한다.
  • 최소성(minimality) : 유일성을 가진 키를 구성하는 속성(Attribute) 중 하나라도 제외하는 경우 유일성이 깨지는 것을 의미한다. 즉, 릴레이션의 모든 튜플을 유일하게 식별하는 데 꼭 필요한 속성들로만 구성되어야 한다.

릴레이션을 나타내는 문자열 배열 relation이 매개변수로 주어질 때, 이 릴레이션에서 후보 키의 개수를 return 하도록 solution 함수를 완성하라.

 

코드

from itertools import combinations

def solution(relation):row = len(relation)
    col = len(relation[0])
    arr = []
    
    for c in range(col):
        combs = combinations(list(range(col)), c+1)
        for comb in combs:
            isOK = True
            
            for a in reversed(arr):
                if set(a).issubset(set(comb)):
                    isOK = False
                    break
            
            if isOK:
                result = set()
                for r in range(row):
                    c = tuple(relation[r][i] for i in comb)
                    result.add(c)

                if len(result) == row:
                    arr.append(comb)
    return len(arr)

 

코드2 (간결하게 수정)

from itertools import combinations

def solution(relation):
    row = len(relation)
    col = len(relation[0])
    
    full_combination = []
    answer_combination = []
    
    for c in range(col):
        full_combination += combinations(list(range(col)), c+1)
    
    for comb in full_combination:
        minimality = True
        
        for c in answer_combination:
            if set(c).issubset(set(comb)):
                minimality = False
                break
        
        if minimality:
            result = [tuple(r[i] for i in comb) for r in relation]
            if len(set(result)) == row:
                answer_combination.append(set(comb))
                    
    return len(answer_combination)

 

메모

22번째 줄 result = [~~~] 부분에서 약간 헤맸었다.

파이썬에서 set 안에 있는 원소들은 immutable 해야 한다.

comb 열에 포함되는 원소들을 단순히 list로 묶어준 후에 set으로 바꿔주면 오류가 난다.

왜냐면 list형은 immutable 하지 않기 때문이다.

이런 경우에는 immutable한 튜플을 사용하는 것이 바람직하다.

 

 

728x90
반응형

'코딩테스트' 카테고리의 다른 글

[프로그래머스 Lv.2] 과제 진행하기  (2) 2024.12.21
[프로그래머스 Lv.2] 2023 카카오 블라인드 채용 - 이모티콘 할인행사  (3) 2024.12.21
[프로그래머스 Lv.2] 하노이의 탑  (2) 2024.12.18
[프로그래머스 Lv.2] 2021 카카오 채용연계형 인턴십 - 거리두기 확인하기  (1) 2024.12.17
[프로그래머스 Lv.2] 줄 서는 방법 / 코드 상세 설명  (0) 2024.12.17
'코딩테스트' 카테고리의 다른 글
  • [프로그래머스 Lv.2] 과제 진행하기
  • [프로그래머스 Lv.2] 2023 카카오 블라인드 채용 - 이모티콘 할인행사
  • [프로그래머스 Lv.2] 하노이의 탑
  • [프로그래머스 Lv.2] 2021 카카오 채용연계형 인턴십 - 거리두기 확인하기
View synthesis 공부하는 대학원생
View synthesis 공부하는 대학원생
AI - view synthesis에 대해 공부하고 있으며, AI 공부하시는 분들과 함께 소통하고 싶습니다 😍
  • View synthesis 공부하는 대학원생
    Happy Support's Blog
    View synthesis 공부하는 대학원생
  • 전체
    오늘
    어제
    • 분류 전체보기 (62)
      • View synthesis (3)
      • Backbone (5)
      • Generative Models (5)
      • On-device AI (3)
      • ML (2)
      • DL (1)
      • LLM (2)
      • 코딩테스트 (25)
      • 에러 해결 모음집 (11)
      • 기타 (4)
  • 링크

  • 인기 글

  • 최근 댓글

  • 최근 글

  • 250x250
    반응형
  • hELLO· Designed By정상우.v4.10.3
View synthesis 공부하는 대학원생
[프로그래머스 Lv.2] 2019 카카오 블라인드 채용 - 후보키
상단으로

티스토리툴바