def solution(str1, str2):
ratio = 0
str1 = str1.lower()
str2 = str2.lower()
arr1 = [str1[i:i+2] for i in range(len(str1)-1) if str1[i:i+2].isalpha()]
arr2 = [str2[i:i+2] for i in range(len(str2)-1) if str2[i:i+2].isalpha()]
if len(arr1)==0 and len(arr2) == 0:
ratio = 1
return int(ratio*65536)
intersect = []
arr2_tmp = arr2.copy()
for i in arr1:
if i in arr2_tmp:
arr2_tmp.remove(i)
intersect.append(i)
union = arr1+arr2_tmp
ratio = len(intersect)/len(union)
return int(ratio*65536)
다중집합도 문제에 포함되어있기 때문에, set을 쓸 수 없다
그렇기 때문에 교집합과 합집합을 직접 구해줘야한다
arr1와 arr2에 둘 다 있는지 확인하는 과정에서, arr1에도 있고 arr2에도 있다면 arr2에서 값을 삭제해주고 교집합 list에 값을 추가한다
합집합을 구할 때, arr1+arr2에서 남은값 을 하면 합집합이 만들어진다
그러고 나면 교집합과 합집하의 길이로 자카도 유사도를 구하고 값을 return 해주면 된다
from collections import Counter
def solution(str1, str2):
ratio = 0
str1 = str1.lower()
str2 = str2.lower()
arr1 = [str1[i:i+2] for i in range(len(str1)-1) if str1[i:i+2].isalpha()]
arr2 = [str2[i:i+2] for i in range(len(str2)-1) if str2[i:i+2].isalpha()]
count1 = Counter(arr1)
count2 = Counter(arr2)
intersect = list((count1&count2).elements())
union = list((count1|count2).elements())
if len(intersect)==0 and len(union)==0:
ratio = 1
else:
ratio = len(intersect)/len(union)
문제를 풀고나서 다른 분들의 코드를 더 살펴보았고, Counter를 사용하면 다중집합일 때 집합 연산자(&, | 등)를 쓸 수 있다는 사실을 알았다