[Programmers/프로그래머스] 2018 KAKAO BLIND RECRUITMENT [1차 코딩테스트]
- [Lv. 1] 비밀 지도
- [Lv. 1] 다트 게임
- [Lv. 2] 캐시
- [Lv. 3] 셔틀버스
- [Lv. 2] 뉴스 클러스터링
- [Lv. 2] 프렌즈4블록
- [Lv. 3] 추석 트래픽
from collections import Counter
def jaccard(list_a, list_b):
# 다중집합의 교집합, 합집합 연산을 위한 Counter 변환
counter_a, counter_b = Counter(list_a), Counter(list_b)
inter = list((counter_a & counter_b).elements()) # 교집합
union = list((counter_a | counter_b).elements()) # 합집합
# 유사도 = 교집합크기 / 합집합크기, 분모가 0인 경우 유사도 1
return len(inter) / len(union) if len(union) > 0 else 1
def solution(str1, str2):
# set 대신 다중집합을 위한 list 생성
list_a, list_b = list(), list() # 다중집합 A, B
str1, str2 = str1.lower(), str2.lower() # 대소문자 소문자로 통일
# str1에 대해 2글자씩을 원소로 하는 다중집합A 생성
for i in range(len(str1) - 1): # 2글자씩 끊어야 하므로 len - 1
if str1[i].isalpha() and str1[i + 1].isalpha(): # 특수문자 및 숫자 제외
list_a.append(str1[i] + str1[i + 1]) # 2글자 원소 추가
# str1에 대해 2글자씩을 원소로 하는 다중집합B 생성
for i in range(len(str2) - 1): # 2글자씩 끊어야 하므로 len - 1
if str2[i].isalpha() and str2[i + 1].isalpha(): # 특수문자 및 숫자 제외
list_b.append(str2[i] + str2[i + 1]) # 2글자 원소 추가
# 65536 곱한 후 소수점 아래를 버리고 정수부만 출력
return int(jaccard(list_a, list_b) * 65536)