처음 시도한 코드
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))
위 코드와 같이 다중합집합과 다중교집합을 구하는 부분을 수정해 주면 된다.
다중합집합과 다중교집합을 구하는 방법은 아래 블로그에 자세하게 설명되어 있다.
반응형