티스토리 뷰
- 블로그 찾아보면 비트마스킹으로 풀었다고 하는데 그게 더 효율적일지도 모르겠다.
- 본인은 set() 자료형과 배열, 부분집합 subset()을 활용하여 풀었다.
- 3중 for문이라니... ㅠㅠ;;; ;; (비공개를..해야하나..)
- 문제를 이해하는게 어려웠다. 특히 최소성 부분에서 subset()의 개념을 생각하지 못하고 중복하는 건 다 걸러버리도록 로직을 짜서 처음부터 뜯어고쳐야 했다.
- 시간이 굉장히 오래 걸렸지만.. 그래도 혼자 힘으로 구현하긴 했다. 실전이었으면 곤란했을 듯 하다.
from itertools import combinations
def is_duplicate(columns, relation):
"""
columns 가 (1, 2)라면
1번과 2번을 합친 값을 구하고 중복확인
"""
# 튜플 자료형 columns
new_set = set()
# 모든 tuple 돌면서 해당 column 의 문자열을 더해 set 에 있는지 확인
for tupl in relation:
candidate_str = ''
for column in columns:
candidate_str += tupl[column]
if candidate_str in new_set:
return True
else:
new_set.add(candidate_str)
return False
def solution(relation):
# 후보키의 수
answer = 0
attr_num = len(relation[0])
tuple_num = len(relation)
# 후보키면 해당 튜플을 False로 변경
is_candidate = [True] * attr_num
# 후보키
keys = list()
# k 개(1~튜플 갯수)의 튜플 뽑기
for k in range(1, attr_num + 1):
maybe_candidate_keys = list(combinations([x for x in range(attr_num)], k))
for maybe_candidate_key in maybe_candidate_keys:
flag = True
if not is_duplicate(maybe_candidate_key, relation): # 유일성 인정
maybe_candidate_key = set(maybe_candidate_key)
if len(keys):
for key in keys: # 0 # subset 이면 pass (최소성 미인정)
if key.issubset(maybe_candidate_key):
flag = False
break
if flag:
keys.append(maybe_candidate_key)
answer += 1 # 후보키 갯수 + 1
return answer
'Algorithm' 카테고리의 다른 글
[Baekjoon] 1094. 막대기 (비트마스킹) (0) | 2021.12.27 |
---|---|
[Baekjoon] 1966. 프린터 큐 (0) | 2021.12.11 |
[Baekjoon] 1012. 유기농 배추 (0) | 2021.12.09 |
DFS & BFS (0) | 2021.12.08 |
[프로그래머스][힙] 디스크 컨트롤러 (211114) (0) | 2021.11.14 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- ssafy합격후기
- 상업용무료폰트
- 클린코더
- ssafy후기
- ssafy6기
- 싸피6기
- 깃허브계정
- SSAFY
- 개발자도서추천
- 깃허브계정2개
- 싸피
- 개발도서추천
- 한글무료폰트추천
- 개발언어추천
- ssafy결과
- 폰트추천
- 코딩도서
- 개발자책추천
- intj여자
- 개발자
- 개발자커리
- 브왈라
- 개발자로드맵
- 폰트
- 클린코드
- 임대차3법
- 디즈니얼굴
- 무료폰트추천
- 맥과윈도우로깃허브
- 개발언어순위
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함