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

게으른 완벽주의자·2023년 2월 9일
0

프로그래머스

목록 보기
58/83

프로그래머스_뉴스 클러스터링

내 답안 코드

def solution(str1, str2):
    ratio = 0
    str1 = str1.lower()
    str2 = str2.lower()    
    arr1 = [str1[i:i+2] for i in range(len(str1)-1) if str1[i:i+2].isalpha()]
    arr2 = [str2[i:i+2] for i in range(len(str2)-1) if str2[i:i+2].isalpha()]
    
    
    if len(arr1)==0 and len(arr2) == 0:
        ratio = 1
        return int(ratio*65536)
    
    intersect = []
    arr2_tmp = arr2.copy()
    for i in arr1:
        if i in arr2_tmp:
            arr2_tmp.remove(i)
            intersect.append(i)

    union = arr1+arr2_tmp
    ratio = len(intersect)/len(union)

       
    return int(ratio*65536)

다중집합도 문제에 포함되어있기 때문에, set을 쓸 수 없다
그렇기 때문에 교집합과 합집합을 직접 구해줘야한다
arr1와 arr2에 둘 다 있는지 확인하는 과정에서, arr1에도 있고 arr2에도 있다면 arr2에서 값을 삭제해주고 교집합 list에 값을 추가한다
합집합을 구할 때, arr1+arr2에서 남은값 을 하면 합집합이 만들어진다
그러고 나면 교집합과 합집하의 길이로 자카도 유사도를 구하고 값을 return 해주면 된다

추가 답안 코드

from collections import Counter
def solution(str1, str2):
    ratio = 0
    str1 = str1.lower()
    str2 = str2.lower()    
    arr1 = [str1[i:i+2] for i in range(len(str1)-1) if str1[i:i+2].isalpha()]
    arr2 = [str2[i:i+2] for i in range(len(str2)-1) if str2[i:i+2].isalpha()]
    
    count1 = Counter(arr1)
    count2 = Counter(arr2)
    
    intersect = list((count1&count2).elements())
    union = list((count1|count2).elements())
    
    if len(intersect)==0 and len(union)==0:
        ratio = 1
    else:
        ratio = len(intersect)/len(union)

문제를 풀고나서 다른 분들의 코드를 더 살펴보았고, Counter를 사용하면 다중집합일 때 집합 연산자(&, | 등)를 쓸 수 있다는 사실을 알았다

profile
데이터를 공부하고 있습니다

0개의 댓글