daniel7481의 개발일지

[프로그래머스]후보키 본문

프로그래머스

[프로그래머스]후보키

daniel7481 2022. 8. 2. 15:01
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/42890

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이

간단한 구현 문제였다. AI Tech4기 시험이 코앞으로 다가온 지금, 마땅히 손에 잡히는게 없어서 코테 문제만 주구장창 풀고 있다. 한 달 반이 넘는 기간동안 준비를 한만큼 좋은 결과가 있기를 바란다. 시험을 본 후 후기 또한 나중에 올리도록 하겠다. 이 문제는 딕셔너리 & combinations 모듈을 이용해서 풀 수 있는데, DB에서 후보키를 판별하라는 프로그램이다. 두 가지 조건인 유일성과 최소성만 만족하면 되는데, 일단 키를 만들 수 있는 모든 경우의 수를 combinations으로 구하고, 구한 인덱스를 통하여 딕셔너리를 하나 선언한 후 만약 중복된 키가 발견된다면(에러를 발생시키지 않는다면) 멈추고 flag=True로 해주었다. 이 부분이 유일성을 만족하는지 확인하는 부분이고, 최소성은 들어오는 경우의 수(pos)에 대하여 다시 한번 combinations로 모든 경우의 수를 구한 다음, 만약 이미 정답 처리가 된 키가 ans 딕셔너리에 있을 경우 탐색할 필요도 없이 continue해주면 된다

from itertools import combinations
def solution(relation):
    answer = 0
    poss = []
    #print(list(map(list, combinations([j for j in range(len(relation[0]))], 1))))
    for i in range(1, len(relation[0])+1):
        poss += list(combinations([j for j in range(len(relation[0]))], i))
    ans = {}
    for pos in poss:
        sec_pos = []
        for k in range(1, len(pos)+1):
            sec_pos += list(combinations(pos, k))
        con_flag = False
        for sp in sec_pos:
            if sp in ans:
                con_flag = True
                break
        if con_flag:
            continue
        dic = {}
        flag = False
        #print(pos)
        for i in range(len(relation)):
            compare = []
            for p in pos:
                compare.append(relation[i][p])
            compare = tuple(compare)
            try:
                dic[compare]
                flag = True
                break
            except:
                dic[compare] = True
        #print(dic)
        #print(flag)
        if not flag:
            ans[pos] = True
            answer += 1
    return answer
반응형