[알고리즘/프로그래머스] - 뉴스 클러스터링(python)

유현민·2022년 5월 31일
0

알고리즘

목록 보기
196/253
post-custom-banner

문제

처음에는 정규표현식을 이용하여 영어 알파벳만 골라냈다.

그 후 for문을 이용하여 union 및 intersection을 구하였다.

import re


def solution(str1, str2):
    p = re.compile('^[a-zA-Z]*$')
    answer = 65536
    a = list()
    b = list()
    for i in range(len(str1) - 1):
        if p.match(str1[i:i + 2]):
            a.append(str1[i:i + 2].lower())

    for i in range(len(str2) - 1):
        if p.match(str2[i:i + 2]):
            b.append(str2[i:i + 2].lower())

    a1 = a.copy()
    union = a.copy()

    for i in b:
        union.append(i) if i not in a1 else a1.remove(i)

    inter = []
    for i in b:
        if i in a:
            inter.append(i)
            a.remove(i)
    if not len(inter) and not len(union):
        pass
    else:
        answer = int(len(inter) / len(union) * 65536)
    return answer

더 좋은 방법을 찾았다!
isalpha()를 이용하여 알파벳을 찾았다.

교집합과 합집합을 구하여

교집합의 합은 교집합의 원소를 가져와 count를 사용하여 작은 갯수를 리스트에 넣어준다.
합집합도 동일하게 했다.

def solution(str1, str2):
    a1 = [str1[i:i+2].lower() for i in range(len(str1) - 1) if str1[i:i+2].isalpha()]
    a2 = [str2[i:i+2].lower() for i in range(len(str2) - 1) if str2[i:i+2].isalpha()]

    union = set(a1) | set(a2)
    inter = set(a1) & set(a2)
    if not len(union):
        return 65536

    s1 = sum([min(a1.count(i), a2.count(i)) for i in inter])
    s2 = sum([max(a1.count(i), a2.count(i)) for i in union])

    return int(s1 / s2 * 65536)
profile
smilegate
post-custom-banner

0개의 댓글