from collections import Counter
def solution(str1:str , str2: str) -> int:
sList1 = [str1[i:i+2].lower() for i in range(len(str1)-1) if str1[i:i+2].isalpha()]
sList2 = [str2[i:i+2].lower() for i in range(len(str2)-1) if str2[i:i+2].isalpha()]
Counter1 = Counter(sList1)
Counter2 = Counter(sList2)
inter = list((Counter1 & Counter2).elements())
union = list((Counter1 | Counter2).elements())
return 65536 if len(sList1) == 0 and len(sList2) == 0 else int(len(inter) / len(union) * 65536)
print(solution('FRANCE', 'french'))
print(solution('handshake', 'shake hands'))
print(solution('aa1+aa2', 'AAAA12'))
print(solution('E=M*C^2', 'e=m*c^2'))
isalpha(): 문자열인지 확인하고 True/False를 반환한다. 중간에 문자가 아닌 숫자 또는 공백이 있으면 False 반환
-> 처음에는 정규 표현식으로 알파벳인지의 여부를 판단하려 했었다. 하지만 isalpha()를 쓰면 정규표현식을 쓰지 않고도 매우 간단하게 문자 여부 판단이 가능하다! 비슷하게 isdigit(), isalnum()이 있으니 참고하면 좋을 것 같다.
교집합 / 합집합 구하기
(1) Counter()를 이용한 방법:
-> Counter()는 인자로 전달한 문자열 중 문자를 key로, 문자의 개수를 value로 하여 dictionary로 반환해주는 함수이다. dictionary를 확장하고 있기 때문에 딕셔너리 API를 모두 쓸 수 있으며 집합구조를 생성할 수 있다. 위 코드에서는 딕셔너리 형태에서 원소 값(key)값만 필요하므로 elements()를 이용하여 원소만 추출했다.
(2) set 을 이용한 방법:
-> set(sList1) & set(sList2)
, set(sList1) | set(sList2)
를 사용하면 합집합, 교집합을 구할 수 있다. 다만, 이 문제에서는 다중 합집합을 허용하고 있으므로 이 방법은 중복 값을 모두 제거해버려 부적합하다.