https://school.programmers.co.kr/learn/courses/30/lessons/17677
import copy
def solution(str1, str2):
# 자카드 유사도 : 두 집합의 교집합 크기를 두 집합의 합집합 크기로 나눈 값으로 정의
answer = 0
# 대소문자 구분하지 않기 위해 모두 대문자로 통일
str1 = str1.upper()
str2 = str2.upper()
set_str1 = []
set_str2 = []
# 다중집합 원소로 만들기
for i in range(len(str1) - 1):
temp = str1[i : i + 2] # 2글자씩 분리
if temp.isalpha(): # 알파벳인 경우
set_str1.append(temp)
for i in range(len(str2) - 1):
temp = str2[i : i + 2]
if temp.isalpha():
set_str2.append(temp)
temp_str1 = copy.deepcopy(set_str1)
interaction_set = [] # 교집합
union_set = copy.deepcopy(set_str1) # 합집합
if len(set_str1) == 0 and len(set_str2) == 0:
return 65536
else:
# 다중합집합
for i in set_str2:
if i not in temp_str1: # str1에 없으면
union_set.append(i)
else: # str1에 있으면
temp_str1.remove(i) # 중복 요소 제거
# 다중교집합
for i in set_str2:
if i in set_str1:
set_str1.remove(i)
interaction_set.append(i)
# 자카드 유사도 구하고 65536 곱하고 int로 정수만 출력
answer = int(len(interaction_set) / len(union_set) * 65536)
return answer
set()
을 이용해 계산했을텐데 다중교집합, 다중합집합이라 애먹었다. 다중교집합 참고 링크, 정답 참고 링크copy.deepcopy()
from collections import Counter
def solution(str1, str2):
str1_low = str1.lower()
str2_low = str2.lower()
str1_lst = []
str2_lst = []
for i in range(len(str1_low)-1):
if str1_low[i].isalpha() and str1_low[i+1].isalpha():
str1_lst.append(str1_low[i] + str1_low[i+1])
for j in range(len(str2_low)-1):
if str2_low[j].isalpha() and str2_low[j+1].isalpha():
str2_lst.append(str2_low[j] + str2_low[j+1])
Counter1 = Counter(str1_lst)
Counter2 = Counter(str2_lst)
inter = list((Counter1 & Counter2).elements())
union = list((Counter1 | Counter2).elements())
if len(union) == 0 and len(inter) == 0:
return 65536
else:
return int(len(inter) / len(union) * 65536)