본문 바로가기
알고리즘/프로그래머스

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

by SBOX Learning by doing 2022. 7. 12.
반응형

from collections import Counter


def solution(str1, str2):
    answer = 0
    # 소문자화
    str1 = str1.lower()
    str2 = str2.lower()
    
    str1_set2 = setString2(str1)
    str2_set2 = setString2(str2)
    similer_score = similer_count(str1_set2, str2_set2)

    if len(str1_set2) > 0 or len(str2_set2) > 0:
        zakad = (similer_score /(sum_count(str1_set2, str2_set2))) * 65536
    else:
        return 65536
    # 내림
    return int(zakad)

# 합집합
def sum_count(str1, str2):
    score = 0
    str1_counter = Counter(str1)
    str2_counter = Counter(str2)
    
    for i in str1_counter:
        # 겹칠때 큰 수 +
        if i in str2_counter:
            if str1_counter[i] <= str2_counter[i]:
                score += str2_counter[i]
            else:
                score += str1_counter[i]
        # 겹치지 않을때 +
        else:
            score += str1_counter[i]
    
    for j in str2_counter:
        # 겹치지 않을때 +
        if j not in str1_counter:
            score += str2_counter[j]

    return score

# 교집합
def similer_count(str1, str2):
    score = 0
    str1_counter = Counter(str1)
    str2_counter = Counter(str2)
    
    for i in str1_counter:
        if i in str2_counter:
            if str1_counter[i] <= str2_counter[i]:
                score += str1_counter[i]
            else:
                score += str2_counter[i]

    return score 

# 집합 생성
def setString2(a):
    temp = []
    for i in range(len(a)):
        # 2개의 집합이면 
        if len(a[i:i+2]) ==2:
            # 소문자 알파벳이면
            if ('a' <= a[i:i+2][0] <= "z") & ('a' <= a[i:i+2][1] <= "z"):
                temp.append(a[i:i+2])
    return temp

반응형

댓글