처음에 set을 이용하여 중복을 제거하여 문제를 풀었는데 그렇게 되면
3번 예제의 경우, str1 = ['AA', 'AA'], str2 = ['AA', 'AA', 'AA']가 나와(대문자로 통일)
교집합 = ['AA'], 합집합 = ['AA']가 나오는 문제가 발생한다.
그래서 파이썬 내장함수인 Counter 함수를 이용해 교집합과 합집합을 구하면,
교집합 = ['AA', 'AA'], 합집합 = ['AA', 'AA', 'AA'](다중집합을 허용하여 str2가 합집합이 된다.)이 되어 답을 구할 수 있다.
collections.Counter(a) : a에서 요소들의 개수를 세어, 딕셔너리 형태로 반환합니다. {문자 : 개수} 형태
Ex. 합집합
list1 | list2 => Counter({'HA': 2, 'AN': 1, 'ND': 1, 'DS': 1, 'SH': 1, 'AK': 1, 'KE': 1})
Ex. 교집합
list1 & list2 => Counter({'HA': 2, 'AN': 1, 'ND': 1, 'DS': 1, 'SH': 1, 'AK': 1, 'KE': 1})
Ex. Counter 값 불러오기
(list1 | list2).values() => dictvalues([2, 1, 1, 1, 1, 1, 1])
Ex. Counter 요소 불러오기
list(list1 & list2).elements() => ['HA', 'HA', 'AN', 'ND', 'DS', 'SH', 'AK', 'KE']
Ex. 합집합의 수
sum((list1 | list2).values()) => 8
Ex. 교집합의 수_
sum((list1 & list2).values()) => 8
from collections import Counter def solution(str1, str2): answer = 0 arr1 = [str1[i:i+2].upper() for i in range(len(str1)-1) if str1[i:i+2].isalpha()] arr2 = [str2[i:i+2].upper() for i in range(len(str2)-1) if str2[i:i+2].isalpha()] ## 공집합일 경우 if len(arr1) == 0 and len(arr2) == 0: return 65536 ## Counter 함수를 이용해 원소 count c1 = Counter(arr1) c2 = Counter(arr2) ## 합집합 sum_set = sum((c1 | c2).values()) ## 교집합 inter_set = sum((c1 & c2).values()) print(sum((c1 & c2).values())) print(list((c1 & c2).elements())) ## int를 이용해 소수점 자르고, 교집합 수 / 합집합 수 * 65536 return int(inter_set / sum_set * 65536)