728x90
https://programmers.co.kr/learn/courses/30/lessons/17677
def solution(str1, str2):
str1 = str1.lower()
str2 = str2.lower()
# 집합 생성
set1, set2 = set(), set()
dict1, dict2 = {}, {}
for i in range(len(str1) - 1):
tmp = str1[i:i + 2]
if not tmp.isalpha(): continue
if not dict1.get(tmp):
dict1[tmp] = 0
dict1[tmp] += 1
set1.add(tmp)
for i in range(len(str2) - 1):
tmp = str2[i:i + 2]
if not tmp.isalpha(): continue
if not dict2.get(tmp):
dict2[tmp] = 0
dict2[tmp] += 1
set2.add(tmp)
if not set1 and not set2:
return 65536
# 자카드 유사도 계산
numerator, denominator = 0, 0
for i in set1&set2:
numerator += min(dict1.get(i) if dict1.get(i) else 0, dict2.get(i) if dict2.get(i) else 0)
for i in set1|set2:
denominator += max(dict1.get(i) if dict1.get(i) else 0, dict2.get(i) if dict2.get(i) else 0)
return int(65536 * numerator / denominator)
자카드 유사도를 계산하기위해 전처리 과정이 필요하다.
두개의 문자열에서 두 글자씩 끊어서 몇번씩 나오는지 확인을 해야한다. set과 dictionary 를 사용해서 각각 저장한다.
set 은 합집합과 곱집합을 구하기 쉽기 때문에 사용했고, dictionary는 중복되는 값이 몇번 나오는지 계산하기 위해 사용했다.
set1, set2가 모두 공집합 인경우엔 자카드 유사도에서 1로 처리하라고 되어있으므로 return으로 끝낸다.
그 이후에는 자카드 유사도의 계산 방법을 통해서 구한다.
이때 dictionary에서 get을 쓰면 none type이 들어오는데 이 값을 0으로 처리하기 위해 삼항 연산자를 사용했다.
re.findall('[^a-zA-Z]+', str1[i:i+2])
정규 표현식을 사용하려고 했으나 어떻게 사용할지 몰랐는데 타인의 코드에 바로 나와있었다.
알파벳이 아닌 값이 나오면 넘어가는 코드로 구현한듯하다.
'STUDY > Algorithm' 카테고리의 다른 글
[프로그래머스] 영어 끝말잇기, Summer/Winter Coding(~2018), python (0) | 2021.06.25 |
---|---|
[프로그래머스] 배달, Summer/Winter Coding(~2018), python (0) | 2021.06.23 |
[프로그래머스] 게임 맵 최단 거리, python (0) | 2021.06.22 |
[프로그래머스] 오픈채팅방, 2019 KAKAO BLIND RECRUITMENT, python (0) | 2021.06.21 |
[프로그래머스] 카카오프렌즈 컬러링북, C++ (0) | 2021.06.21 |