코딩 테스트/문제 풀기

[프로그래머스] 후보키

hazel_ 2021. 3. 30. 21:18

programmers.co.kr/learn/courses/30/lessons/42890

 

코딩테스트 연습 - 후보키

[["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

 

from itertools import combinations
def solution(relation):
    com=[]
    first=[]
    for i in range(1,len(relation[0])+1):
        com.extend(combinations(range(len(relation[0])), i))

    for keys in com:
        tmp=[tuple([item[key] for key in keys]) for item in relation]
        if len(set(tmp))==len(relation):
            first.append(keys)

    answer=set(first)
    for i in range(len(first)):
        for j in range(i+1, len(first)):
            if len(first[i]) == len(set(first[i])&set(first[j])):
            	# discard로 할 경우 first[j]가 없는 경우에도 오류를 띄우지 않아. remove는 오류나
                answer.discard(first[j]) 
                print(first[i], first[j])

    return len(answer)

 

참고!

tuple과 list의 차이

1. list는 [] , tuple은 ()

2. list는 생성, 수정, 삭제 가능

   tuple은 생성, 수정, 삭제 불가능

 

위에서 list대신 tuple을 사용한 이유

-> 뒤에서 set형식으로 바꿔서 중복을 없앨건데, list경우 set(list)을 하면

TypeError: unhashable type: 'list'

라는 에러가 뜬다. 그래서 list대신 tuple로 해!