https://programmers.co.kr/learn/courses/30/lessons/17677
from collections import Counter
def solution(str1, str2):
str1, str2 = str1.upper(), str2.upper()
arr1, arr2 = [], []
for i in range(1,len(str1)):
if str1[i-1].isalpha() and str1[i].isalpha():
arr1.append(str1[i-1] + str1[i])
for i in range(1,len(str2)):
if str2[i-1].isalpha() and str2[i].isalpha():
arr2.append(str2[i-1] + str2[i])
counter1 = Counter(arr1)
counter2 = Counter(arr2)
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)
다중집합을 구하는 부분에서 막혀서 검색을 한 결과,
Counter 클래스간 연산 기능중에 교집합 합집합 기능을 이용하면 쉽게 풀 수 있음을 알게되었다.
원소의 중복을 허용하는 다중집합을 이용해 문제를 풀어야하는데
counter1 & counter2 로 교집합을 구하고
counter1 | counter2 로 합집합을 구한뒤
Counter의 .elements() 메소드를 이용하여
key를 value 값 만큼 뱉어내게 하면 다중집합을 구할 수 있다.
이때의 다중집합의 길이를 이용해 문제를 풀 수 있다.
from collections import Counter
def solution(str1, str2):
str1, str2 = str1.upper(), str2.upper() # 대,소문자 구분 없어야 하므로 대문자로 변환
arr1, arr2 = [], []
for i in range(1,len(str1)):
if str1[i-1].isalpha() and str1[i].isalpha():
arr1.append(str1[i-1] + str1[i])
for i in range(1,len(str2)):
if str2[i-1].isalpha() and str2[i].isalpha():
arr2.append(str2[i-1] + str2[i])
#입력으로 들어온 문자열은 두 글자씩 끊어서 다중집합의 원소로 만든다.
#기타 공백이나 숫자, 특수 문자가 들어있는 경우는 그 글자 쌍을 버린다.
counter1 = Counter(arr1)
counter2 = Counter(arr2)
inter = list((counter1&counter2).elements()) # 다중집합의 교집합
union = list((counter1|counter2).elements()) # 다중집합의 합집합
if len(union) == 0 and len(inter) == 0: #나누기 연산에서 0이 들어가면 오류가 발생하니 예외처리
return 65536
else:
return int(len(inter) / len(union) * 65536)