• Home
  • About
    • Lajancia Workspace photo

      Lajancia Workspace

      .

    • Learn More
    • Email
    • LinkedIn
    • Instagram
    • Tumblr
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects
  • Record
  • Blender
  • Blockchain

후보키[python]

27 Oct 2021

Reading time ~2 minutes

후보키 - 카카오톡 리크루트


문제 해설 도움

[코테준비] 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


pythoncoding-testalgorithm Share Tweet +1