[프로그래머스 파이썬] [1차] 뉴스 클러스터링

일단 해볼게·2024년 2월 12일
0

프로그래머스

목록 보기
99/106

https://school.programmers.co.kr/learn/courses/30/lessons/17677

import copy
def solution(str1, str2):
    # 자카드 유사도 : 두 집합의 교집합 크기를 두 집합의 합집합 크기로 나눈 값으로 정의
    answer = 0
    # 대소문자 구분하지 않기 위해 모두 대문자로 통일
    str1 = str1.upper()
    str2 = str2.upper()
    
    set_str1 = []
    set_str2 = []
    
    # 다중집합 원소로 만들기
    for i in range(len(str1) - 1):
        temp = str1[i : i + 2] # 2글자씩 분리
        
        if temp.isalpha(): # 알파벳인 경우
            set_str1.append(temp)
            
    for i in range(len(str2) - 1):
        temp = str2[i : i + 2]
        
        if temp.isalpha():
            set_str2.append(temp)

    temp_str1 = copy.deepcopy(set_str1)
    interaction_set = [] # 교집합
    union_set = copy.deepcopy(set_str1) # 합집합

    if len(set_str1) == 0 and len(set_str2) == 0:
        return 65536
    else:
    
        # 다중합집합
        for i in set_str2:
            if i not in temp_str1: # str1에 없으면
                union_set.append(i)
            else: # str1에 있으면
                temp_str1.remove(i) # 중복 요소 제거
        # 다중교집합
        for i in set_str2:
            if i in set_str1:
                set_str1.remove(i)
                interaction_set.append(i)
    
    # 자카드 유사도 구하고 65536 곱하고 int로 정수만 출력
    answer = int(len(interaction_set) / len(union_set) * 65536)
    
    return answer

다른 사람 풀이(Counter 이용)

from collections import Counter

def solution(str1, str2):
    str1_low = str1.lower()
    str2_low = str2.lower()
    
    str1_lst = []
    str2_lst = []
    
    for i in range(len(str1_low)-1):
        if str1_low[i].isalpha() and str1_low[i+1].isalpha():
            str1_lst.append(str1_low[i] + str1_low[i+1])
    for j in range(len(str2_low)-1):
        if str2_low[j].isalpha() and str2_low[j+1].isalpha():
            str2_lst.append(str2_low[j] + str2_low[j+1])
            
    Counter1 = Counter(str1_lst)
    Counter2 = Counter(str2_lst)
    
    inter = list((Counter1 & Counter2).elements())
    union = list((Counter1 | Counter2).elements())
    
    if len(union) == 0 and len(inter) == 0:
        return 65536
    else:
        return int(len(inter) / len(union) * 65536)

Counter 참고 링크

profile
시도하고 More Do하는 백엔드 개발자입니다.

0개의 댓글