Programmers Level.2 후보키
from itertools import combinations
def solution(relation):
answer_list = []
num_list = []
row = len(relation) # 튜플 개수
column = len(relation[0]) # 속성 개수
for i in range(column):
num_list.append(i)
for i in range(1, column + 1):
for j in combinations(num_list, i): # 조합
array = [[] for _ in range(row)]
for k in range(row):
for l in j:
array[k].append(relation[k][l])
array[k] = tuple(array[k])
if len(set(array)) == row:
answer_list.append(j)
print(answer_list)
return
# answer_list = [(0,), (0, 1), (0, 2), (0, 3), (1, 2), (0, 1, 2), (0, 1, 3), (0, 2, 3), (1, 2, 3), (0, 1, 2, 3)]
- 유일성을 찾는 것 까지는 해낼 수 있었다.
- 하지만 최소성을 만족시키는 해를 찾기는 어려웠다.
- 최소성을 만족시키는 해를 하나 찾았다면 이 해를 포함하는 나머지 해들은 최소성이 만족되지 않는 것은 알겠는데 이것을 어떻게 구현할 지는 아이디어가 떠오르지 않았고 오랜 고민 끝에 구글 검색을 통해 해결하기로 결정했다.
from itertools import combinations
def solution(relation):
answer_list = []
num_list = []
row = len(relation) # 튜플 개수
column = len(relation[0]) # 속성 개수
for i in range(column): # num_list = [0,1,2,3]
num_list.append(i)
for i in range(1, column + 1): # i는 조합에 쓰이는 변수
for j in combinations(num_list, i): # j는 조합
array = [[] for _ in range(row)]
for k in range(row):
for l in j:
array[k].append(relation[k][l])
array[k] = tuple(array[k])
if len(set(array)) == row: # 유일성 판단
put = True
for x in answer_list:
if set(x).issubset(set(j)): # 최소성 판단
put = False
break
if put: answer_list.append(j)
return len(answer_list)
Programmers Level.2 2개 이하로 다른 비트
def solution(numbers):
answer = []
for number in numbers:
if number % 2 == 0: # 짝수의 경우
answer.append(number + 1) # 1만 더하면 됨
else: # 홀수일 경우
number = bin(number)
number = number[0] + number[2:]
i = len(number) - 1
while True:
if number[i] == '0': # 이진수로 표현했을 때 맨 오른쪽에 등장하는 0과 그 우측의 1을 자리 바꿈
number = number[:i] + number[i+1] + number[i] + number[i+2:]
answer.append(int(number,2))
break
i -= 1
return answer
- 짝수는 이진수로 표현했을 때 마지막 자리 수가 0이므로 단순히 1만 더하면 해결.
- 홀수일 때는 규칙을 찾아보니까 이진수로 표현했을 때, 맨 오른쪽에 등장하는 0과 그 우측의 1을 자리바꿈하면 됐고 이를 구현함.
'알고리즘 문제 풀이 > Programmers' 카테고리의 다른 글
[21회차] 프렌즈 4블록 (0) | 2022.01.04 |
---|---|
[20회차] 영어 끝말잇기 (0) | 2021.12.31 |
[18회차] 캐시 (0) | 2021.12.28 |
[17회차] 괄호 회전하기, H-index, 예상 대진표, 순위 검색, 올바른 괄호 (0) | 2021.12.27 |
[16회차] 조이스틱 (0) | 2021.12.26 |
댓글