문제설명
두 개의 문자열을 입력받고 그 문자열들의 자카드 유사도를 구하는 문제입니다. 이때 영어 이외의 문자가 포함된 문자열들은 취급하지 않고 대소문자는 구분없이 처리합니다.
작동 순서
두 문자열들을 입력받습니다.
두 문자열들을 연속된 알파벳들로만 구성해서 분할합니다.
분할된 두 문자열들의 분할 개수로 전체집합의 크기를 구합니다.
두 문자열들의 부분집합들을 비교하며 교집합의 개수를 확인합니다.
교집합의 개수를 합집합의 개수(전체집합의 개수-교집합의 개수)로 나눠줍니다.
위에서 구한값에 65536을 곱한뒤 정수로 변환해서 출력합니다.
소스코드
import re
def solution(str1, str2):
intersectionNum = 0
set1=getTrimmedString(str1)
set2=getTrimmedString(str2)
universalSetNum=len(set1)+len(set2)
for i in range(len(set1)):
for j in range(len(set2)):
if set1[i]==set2[j]:
intersectionNum+=1
del set2[j]
break
if universalSetNum==0:
answer=1
else:
answer=intersectionNum/(universalSetNum-intersectionNum)
answer*=65536
return int(answer)
def getTrimmedString(string):
s=[]
for i in range(len(string)-1):
text = re.sub('[^a-zA-Z]',' ',string[i:i+2]).strip()
if len(text)==2:
s.append(text.upper())
return s
후기
자카드 유사도라는 용어 자체를 처음봐서 좀 많이 헤맸네요. 그리고 isalpha()라는 함수를 쓰면 쉽게 해결할수 있는 걸 복잡하게 풀어놨네요... 아직도 갈길이 먼 것 같습니다.