프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
처음 시도한 코드
def solution(str1, str2):
str1 = str1.upper()
str2 = str2.upper()
# 다중집합 구하기
A, B = [], []
for i in range(len(str1)-1):
str = str1[i:i+2] # 두글자씩 끊어
if str.isalpha(): # 영문자로 된 글자만 다중집합의 원소로 만듦
A.append(str)
for i in range(len(str2)-1):
str = str2[i:i+2] # 두글자씩 끊어
if str.isalpha(): # 영문자로 된 글자만 다중집합의 원소로 만듦
B.append(str)
# 자카드 유사도 구하기
if len(A) == 0 and len(B) == 0:
j = 1
else:
inter, union = 0, 0 # 교집합, 합집합
for a in A:
if a in B: # A와 B 공통 원소
inter += 1
else: # A에만 있는 원소
union += 1
union += len(B) # 합집합 = A에만 있는 원소 + B
j = inter/union # 자카드 유사도 = 교집합/합집합
return (int(j * 65536))
위 코드를 제출하면 5개의 테스트 케이스에서 실패한다.
일반적으로 A, B 두 집합의 합집합은 A에만 존재하는 원소 + B로 구할 수 있다.
하지만 다중합집합은 일반적인 합집합과 교집합을 구하는 방식과 다르기 때문에 이 코드를 제출하면 실패하는 것이다.
정답 코드
def solution(str1, str2):
str1 = str1.upper()
str2 = str2.upper()
# 다중집합 구하기
A, B = [], []
for i in range(len(str1)-1):
str = str1[i:i+2] # 두글자씩 끊어
if str.isalpha(): # 영문자로 된 글자만 다중집합의 원소로 만듦
A.append(str)
for i in range(len(str2)-1):
str = str2[i:i+2] # 두글자씩 끊어
if str.isalpha(): # 영문자로 된 글자만 다중집합의 원소로 만듦
B.append(str)
# 자카드 유사도 구하기
if len(A) == 0 and len(B) == 0:
j = 1
else:
# 다중합집합
a_temp = A.copy()
a_result = A.copy()
for i in B:
if i not in a_temp: # B에만 존재하면 합집합에 추가
a_result.append(i)
else: # 공통으로 존재하면 중복되므로 제거
a_temp.remove(i)
# 다중교집합
result = []
for i in B:
if i in A:
A.remove(i)
result.append(i)
j = len(result)/len(a_result) # 자카드 유사도 = 교집합/합집합
return (int(j * 65536))
위 코드와 같이 다중합집합과 다중교집합을 구하는 부분을 수정해 주면 된다.
다중합집합과 다중교집합을 구하는 방법은 아래 블로그에 자세하게 설명되어 있다.
[개념정리] 파이썬 다중 집합의 교집합, 합집합
코테 연습할때마다 잊을만 하면 나오는 다중집합이다. 굳이 몰라도 되지만, 모른채 쓰려면 머지소트를 구현해야 하는 굉장한 번거로움이 있기때문에 알아두는게 좋을 것 같아서 포스팅 한다. 1.
velog.io
반응형