- Reference
- 괜히 문제 푸는 중에 다중집합이란 걸 찾아보다가 오히려 더 헷갈림.. Counter로 다중집합의 합집합, 교집합 바로 처리 가능
Solution
# 자카드 유사도: 집합의 교집합 크기를 두 집합의 합집합 크기로 나눈 값으로 정의
import math
from collections import Counter
def solution(str1, str2):
answer = 0
# 1. 2글자씩 끊어서 다중 집합 만들기 -> 사실상 리스트
# FRANCE -> {FR, RA, AN, NC, CE}
# 단! 기타 공백이나 숫자, 특수 문자가 들어있는 경우 -> 그 쌍을 버리기
# 둘 다 소문자로 바꿔주자
str1_list = make(str1)
print(str1_list)
str2_list = make(str2)
print(str2_list)
# 다중집합의 교집합 만들기
# !!!!!!!!! "집합의 원소가 서로 같을 때도 세줘야 함"
# gyo = []
# for s in str1_list:
# if s in str2_list:
# str2_list.remove(s)
# gyo.append(s)
# Counter 메서드는 각각의 리스트는 해당 원소값을 key값으로 하고
# 원소의 개수를 value값으로 하는 dictionary 형태의 구조를 반환
gyo = list((Counter(str1_list) & Counter(str2_list)).elements())
# 다중집합의 합집합 만들기
# !!!!!!!!! "집합의 원소가 서로 같을 때도 세줘야 함"
# tmp_str1_list = str1_list.copy()
# hap = str1_list.copy()
# for s in str2_list:
# if s not in tmp_str1_list:
# hap.append(s)
# else:
# tmp_str1_list.remove(s)
hap = list((Counter(str1_list) | Counter(str2_list)).elements())
# 교집합 크기 / 합집합 크기 -> 소수점 아래 버리기 (round 메서드였나 -> round는 반올림이고 trunc임)
if len(hap) == 0:
answer = 65536
else:
answer = math.trunc((len(gyo) / len(hap)) * 65536)
return answer
def make(str_tmp):
str_list = []
for i in range(len(str_tmp) - 1):
if str_tmp[i].isalpha() and str_tmp[i + 1].isalpha(): # 둘 다 알파벳일 경우만 추가해주기
str_list.append(str_tmp[i].lower() + str_tmp[i + 1].lower())
return str_list
# print(solution("FRANCE", "french"))
# print(solution("handshake", "shake hands"))
print(solution("aa1+aa2", "AAAA12"))
# print(solution("E=M*C^2", "e=m*c^2"))
Leave a comment