상세 컨텐츠

본문 제목

[프로그래머스] 뉴스 클러스터링

Algorithm

by 쑤야. 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)

관련글 더보기