Algorithm
[프로그래머스] 뉴스 클러스터링
쑤야.
2023. 12. 21. 13:16
https://school.programmers.co.kr/learn/courses/30/lessons/17677?language=python3
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
접근
- 다중 집합에 대해 각 케이스별 개수 정보가 필요하므로 Set이 아닌, Dictionary를 사용한다.
로직
- 문자열 대소문자를 하나로 통일하기을 위해 소문자화 시킨다.
- 2글자씩 끊어 딕셔너리에 케이스를 Key값으로, 케이스 개수를 Value로 저장하낟.
- str1에 대해 우선 반복문을 수행한다.
- str1의 Key값이 str2에도 존재할 경우, 교집합과 합집합을 모두 업데이트한다. 업데이트 이후, str2 데이터에서 해당 Key와 Value 값을 제거한다.
- str1의 Key값이 str2에 존재하지 않을 경우, 합집합만 업데이트한다.
- str2에 대해 반복문을 수행한다. (str1과 교집합에 해당하는 Key값은 모두 제거된 상태이다.)
- 자카드 유사도에 보정치를 입힌 후, 값을 반환한다.
코드
def solution(str1, str2):
def generate(str):
str = list(str)
result = {}
for i in range(1,len(str)):
element = str[i-1] + str[i]
if element.isalpha():
if element in result:
result[element] += 1
else:
result[element] = 1
return result
str1 = generate(str1.lower())
str2 = generate(str2.lower())
intersection = 0
join = 0
for key in str1:
value = str1[key]
if key in str2:
intersection += min(value, str2[key])
join += max(value, str2[key])
del str2[key]
else:
join += value
for key in str2:
join += str2[key]
return 65536 if join == 0 else int(intersection / join * 65536)