https://programmers.co.kr/learn/courses/30/lessons/17677
문제를 간단하게 설명하자면 다중집합으로 확장한 자카드 유사도를 구현하는 것이다. 두개의 문자열이 주어졌을때 각 문자열은 2-gram으로 쪼갠 다중집합에서 자카드 유사도를 구하는 것이다.
이어서 채원이의 야매 설명 (정확한 것은 구글링을 필요로 합니다...)
def solution(str1, str2):
str1 = str1.lower()
str2 = str2.lower()
arr_str1 = [str1[i]+str1[i+1] for i in range(len(str1)-1) if((str1[i]+str1[i+1]).isalpha())]
arr_str2 = [str2[i]+str2[i+1] for i in range(len(str2)-1) if((str2[i]+str2[i+1]).isalpha())]
union = arr_str1 + arr_str2 #합집합
inter = [i for i in arr_str1 if(i in arr_str2)] #교집합
for i in inter:
union.remove(i)
if(len(union)==0 and len(inter)==0):
return 65536
elif(len(union)==0):
return 0
else:
return int(len(inter)/len(union)*65536)
def solution(str1, str2):
inter = []
arr_str1 = [str1[i:i+2].lower()for i in range(len(str1)-1) if((str1[i:i+2]).isalpha())]
arr_str2 = [str2[i:i+2].lower() for i in range(len(str2)-1) if((str2[i:i+2]).isalpha())]
union = arr_str1 + arr_str2 #합집합
for i in arr_str1:
if(i in arr_str2):
inter.append(i)
arr_str2.remove(i)
for i in inter:
union.remove(i)
if(len(union)==0 and len(inter)==0):
return 65536
elif(len(union)==0):
return 0
else:
return int(len(inter)/len(union)*65536)
import re
import math
def solution(str1, str2):
str1 = [str1[i:i+2].lower() for i in range(0, len(str1)-1) if not re.findall('[^a-zA-Z]+', str1[i:i+2])]
str2 = [str2[i:i+2].lower() for i in range(0, len(str2)-1) if not re.findall('[^a-zA-Z]+', str2[i:i+2])]
gyo = set(str1) & set(str2)
hap = set(str1) | set(str2)
if len(hap) == 0 :
return 65536
gyo_sum = sum([min(str1.count(gg), str2.count(gg)) for gg in gyo])
hap_sum = sum([max(str1.count(hh), str2.count(hh)) for hh in hap])
return math.floor((gyo_sum/hap_sum)*65536)
문제에 힌트가 있었다. 바로 다중집합의 교집합 요소 x의 교집합에서의 갯수는 min(str1에서 x개수, str2에서 y개수)
다중집합의 합집합의 요소 x의 합집합에서의 갯수는 max(str1에서 x개수, str2에서 x개수)
그걸 사용한 풀이다.