20/07/08 - TIL

Harry·2020년 7월 8일

TIL

목록 보기
5/8
post-thumbnail

오늘 한 일

  • programmers - level_2 에서 못 풀었던 "후보키 문제"를 공부하였다.

풀이 코드

from itertools import combinations

data = [
    ["100", "ryan", "music", "2"],
    ["200", "apeach", "math", "2"],
    ["300", "tube", "computer", "3"],
    ["400", "con", "computer", "4"],
    ["500", "muzi", "music", "3"],
    ["600", "apeach", "music", "2"],
]


def solution(relation):
    col_size = len(relation[0])
    row_size = len(relation)
    check_list = []
    # 유일성 검사
    for i in range(1, col_size + 1):
        comb_attribute = combinations(range(col_size), i)
        print(list(comb_attribute))
        for check_comb in list(comb_attribute):
            all_attr_list = [
                tuple(row[index] for index in check_comb) for row in relation
            ]
            if len(set(all_attr_list)) != row_size:
                continue
            else:
                check_list.append(set(check_comb))
    # 최소성 검사
    for item_1 in check_list[:]:
        for item_2 in check_list[:]:
            if item_1 != item_2:
                if item_1 == item_1 & item_2:
                    check_list.remove(item_2)


solution(data)

공부한 것들

combinations을 이용하여 조합(경우의 수) 생성

col_size = len(relation[0])
for i in range(1, col_size+1):
	comb_attribute = combinations(range(col_size), i)
    for check_comb in list(comb_attribute):
    	...
  • 자주 애용할 것 같다! 기억해두자!!

Comprehension

all_attr_list = [tuple(row[index] for index in check_comb) for row in relation]
  • python의 comprehension은 정말 리스트를 생성하는 데에 있어서 매우 편하고, 코드를 간결하게 해주는 강력한 기능인 것 같다 comprehension 자주 애용할 듯...

set 교집합 ( & )

for item_1 in check_list[:]:
    for item_2 in check_list[:]:
        if item_1 != item_2:
            if item_1 == item_1 & item_2:
                check_list.remove(item_2)
  • 처음 봤을 때 이해가 안 가서 구글링을 많이 해보았고, 해당 링크 를 통해 이해가 되었다.
  • 해당 연산자 ( & ) 는 두 변수의 비트가 같을 경우, 예를 들면 즉 A 와 B 라는 변수의 비트 값이 1101, 1001일 경우에 A & B = 1011 이 된다.
  • 하지만 set에서는 두 set값에서 같은 값이 있을 경우, 해당 값을 return해준다. 예를 들어 A = {0, 1} / B = {0, 1, 2, 3} 이면 A & B = {0, 1} 의 값이 나오게 된다. ( 교집합을 구해주는 것. )
  • 해당 후보키 문제는 유일성이 만족된 attribute의 집합에서 마지막으로 최소성을 만족시켜주어야 한다.
    & 연산자를 이용하여 두 집합 중 똑같은 값이 있을 경우에 제일 적은 수로 이루어진 집합은 내버려두고, 제일 많은 수의 집합은 없애버려서 유일성과 최소성을 만족시키는 attribute의 집합을 구할 수 있다.

오늘 느낀 점

  • 해당 후보키 문제에 대하여 여러 파이썬 풀이 코드가 있었지만 해당 풀이코드가 제일 간결하고 깔끔해보여서 이 코드를 위주로 공부했다.
  • set의 활용, 집합 연산 (교집합[&], 합집합[|]), comprehension, combinations... 해당 문제를 못 풀긴 했지만 이 문제를 공부하면서 제일 많이 배웠던 것 같다.
  • 정말 많은 걸 얻어갈 수 있는 문제인 것 같다.

내일 할 일

  • 다른 사람들의 풀이코드도 확인해 볼 것.

Memo

  • 기억할 수 있도록 계속해서 복습하자.

알고리즘 문제 복습 언제하지...? 이메일에 쌓인 Weekly 글도 읽어야 하는데... 큰일났네

0개의 댓글