후보키 - 카카오톡 리크루트
문제 해설 도움
[코테준비] N시간만에 끝내는 Python 코딩테스트 10편 : 2019 카카오 코딩테스트 3번 후보키
문제 팁
- 모든 후보키를 만들고 각각의 후보키가 키가 될 수 있는지 확인한다.
- 중복이 없는 키들을 찾기
문제에서 사용할 모듈
from itertools import combinations #중복되지 않는 조합 만들어줌
from pandas as pd #데이터프레임
코딩
1. 데이터 가져오기
from itertools import combinations #중복되지 않는 조합 만들어줌
from pandas as pd #데이터프레임
l=데이터
data=pd.DataFrame(l)
2. 모든 가능 칼럼 저장
data2=pd.DataFrame()
colname=range(len(l[0]))
only=[]
al=[]
for i in range(1,len(colname)+1):
colconcat=combinations(colname,i)
al.append(list(colconcat))
3. 모든 가능 조합 칼럼 저장
for j in al:
for k in j:
if len(k)==1:
data2[f'data[{k[0]}]']=data[k[0]]
elif len(k)==2:
data2[f'data[{k[0]}]+data[{k[1]}]']=data[k[0]]+data[k[1]]
elif len(k)==3:
data2[f'data[{k[0]}]+data[{k[1]}]+data[{k[2]}]']=data[k[0]]+data[k[1]]+data[k[2]]
elif len(k)==4:
data2[f'data[{k[0]}]+data[{k[1]}]+data[{k[2]}]+data[{k[3]}]']=data[k[0]]+data[k[1]]+data[k[2]]+data[k[3]]
4. 유일한 칼럼 확인 및 중복 삭제
index=data2.columns
for i in index:
if len(data2[i])==len(data2[i].value_counts()):
only.append(i)
for i in range(len(only)):
for j in range(i+1,len(only)):
if only[i] in only[j]:
only[j]='!'
5. 갯수 계산
return len(only)-only.count('!')
코드 전문
from itertools import combinations #중복되지 않는 조합 만들어줌
from pandas as pd #데이터프레임
l=데이터
data=pd.DataFrame(l)
data2=pd.DataFrame()
colname=range(len(l[0]))
only=[]
al=[]
for i in range(1,len(colname)+1):
colconcat=combinations(colname,i)
al.append(list(colconcat))
for j in al:
for k in j:
if len(k)==1:
data2[f'data[{k[0]}]']=data[k[0]]
elif len(k)==2:
data2[f'data[{k[0]}]+data[{k[1]}]']=data[k[0]]+data[k[1]]
elif len(k)==3:
data2[f'data[{k[0]}]+data[{k[1]}]+data[{k[2]}]']=data[k[0]]+data[k[1]]+data[k[2]]
elif len(k)==4:
data2[f'data[{k[0]}]+data[{k[1]}]+data[{k[2]}]+data[{k[3]}]']=data[k[0]]+data[k[1]]+data[k[2]]+data[k[3]]
index=data2.columns
for i in index:
if len(data2[i])==len(data2[i].value_counts()):
only.append(i)
for i in range(len(only)):
for j in range(i+1,len(only)):
if only[i] in only[j]: #이러면 에러가 남. data[0]+data[5]와 data[0]+data[3]+data[5] 비교시 중복 없음으로 파악
only[j]='!'
코드 수정
if only[i] in only[j]
->
if all(check in only[j].split('+') for check in only[i].split('+')):
# 문자열을 + 기준으로 split 하여 내부에 값이 중복되는것이 있는지 확인한다.
프로그래머스 제출
from itertools import combinations
import pandas as pd
def solution(relation):
answer = 0
l=relation
data=pd.DataFrame(l)
data2=pd.DataFrame()
colname=range(len(l[0]))
only=[]
al=[]
for i in range(1,len(colname)+1):
colconcat=combinations(colname,i)
al.append(list(colconcat))
for j in al:
for k in j:
if len(k)==1:
data2[f'data[{k[0]}]']=data[k[0]]
elif len(k)==2:
data2[f'data[{k[0]}]+data[{k[1]}]']=data[k[0]]+data[k[1]]
elif len(k)==3:
data2[f'data[{k[0]}]+data[{k[1]}]+data[{k[2]}]']=data[k[0]]+data[k[1]]+data[k[2]]
elif len(k)==4:
data2[f'data[{k[0]}]+data[{k[1]}]+data[{k[2]}]+data[{k[3]}]']=data[k[0]]+data[k[1]]+data[k[2]]+data[k[3]]
elif len(k)==5:
data2[f'data[{k[0]}]+data[{k[1]}]+data[{k[2]}]+data[{k[3]}]+data[{k[4]}]']=data[k[0]]+data[k[1]]+data[k[2]]+data[k[3]]+data[k[4]]
elif len(k)==6:
data2[f'data[{k[0]}]+data[{k[1]}]+data[{k[2]}]+data[{k[3]}]+data[{k[4]}]+data[{k[5]}]']=data[k[0]]+data[k[1]]+data[k[2]]+data[k[3]]+data[k[4]]+data[k[5]]
elif len(k)==7:
data2[f'data[{k[0]}]+data[{k[1]}]+data[{k[2]}]+data[{k[3]}]+data[{k[4]}]+data[{k[5]}]+data[{k[6]}]']=data[k[0]]+data[k[1]]+data[k[2]]+data[k[3]]+data[k[4]]+data[k[5]]+data[k[6]]
elif len(k)==8:
data2[f'data[{k[0]}]+data[{k[1]}]+data[{k[2]}]+data[{k[3]}]+data[{k[4]}]+data[{k[5]}]+data[{k[6]}]+data[{k[7]}]']=data[k[0]]+data[k[1]]+data[k[2]]+data[k[3]]+data[k[4]]+data[k[5]]+data[k[6]]+data[k[7]]
index=data2.columns
for i in index:
if len(data2[i])==len(data2[i].value_counts()):
only.append(i)
for i in range(len(only)):
for j in range(i+1,len(only)):
if all(check in only[j].split('+') for check in only[i].split('+')):
only[j]='!'
answer=len(only)-only.count('!')
return answer