https://school.programmers.co.kr/learn/courses/30/lessons/42890
문제를 이해하는데 절반의 시간을 보낸 것 같다..
나의 풀이
from itertools import combinations as C
def solution(relation):
answer = []
rows = len(relation)
columns = [i for i in range(len(relation[0]))]
for n in range(1, len(relation[0])+1):
check = list(C(columns, n))
for c in check:
row_l = []
isCandi = True
for row in range(rows):
chain=''
for c_ in c:
chain += str(relation[row][c_])
if chain in row_l:
isCandi = False
break
else:
isCandi = True
row_l.append(chain)
if isCandi == True:
if len(c) == 1:
answer.append(c)
for c_ in c:
columns.pop(columns.index(c_))
else:
isin = False
for an in answer:
count = 0
for a in an:
if a in c:
count += 1
if count == len(an):
isin = True
break
else:
isin = False
if isin == False:
answer.append(c)
return answer
다른 사람 풀이
- 내 머릿속 생각을 딱 필요한것만 깔끔하게 정리한 코드이다.. 조금 더 노력해야겠다.
- intersection에 대해 정리해야 겠다.
from itertools import combinations
def solution1(relation):
n_row=len(relation)
n_col=len(relation[0]) #->runtime error 우려되는 부분
candidates=[]
for i in range(1,n_col+1):
candidates.extend(combinations(range(n_col),i))
final=[]
for keys in candidates:
tmp=[tuple([item[key] for key in keys]) for item in relation]
if len(set(tmp))==n_row:
final.append(keys)
answer=set(final[:])
for i in range(len(final)):
for j in range(i+1,len(final)):
if len(final[i])==len(set(final[i]).intersection(set(final[j]))):
answer.discard(final[j])
return len(answer)
'Coding Test > 프로그래머스' 카테고리의 다른 글
[Level 2] / [Python] 숫자 블록 (0) | 2022.10.23 |
---|---|
[Level 2] / [Python] N-Queen (0) | 2022.10.19 |
[Level 1] / [Python] 숫자 문자열과 영단어 (0) | 2022.10.14 |
[Level 1] / [Python] K번째 수 (0) | 2022.10.14 |
[Level 1] / [Python] 문자열 내 마음대로 정렬하기 (0) | 2022.10.14 |