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

Sujin Lee·2022년 10월 11일
0

코딩테스트

목록 보기
136/172
post-thumbnail

문제

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

시행착오

  • 테스트케이스 올패스 불가능 -> elif~ eles가 잘못됐음
def solution(str1, str2):
    answer = 0
    arr1 = []
    arr2 = []
    
    for i in range(len(str1)-1):
        if str1[i:i+2].isalpha():
            arr1.append(str1[i:i+2].lower())
    for i in range(len(str2)-1):
        if str2[i:i+2].isalpha():
            arr2.append(str2[i:i+2].lower())    

    if not arr1 and not arr2:
        answer = 1*65536
    elif set(arr1) == set(arr2):
        answer = int(min(len(arr1),len(arr2)) / max(len(arr1),len(arr2)) * 65536)
    else:
        inter = 0
        union = len(arr1) + len(arr2)
        for i in arr1:
            if i in arr2:
                inter += 1
        answer = int(inter / (union - inter) * 65536)

    return answer 

풀이

def solution(str1, str2):
    answer = 0
    arr1 = []
    arr2 = []
    # 두 개씩 잘랐을 때 문자로만 이루어져있으면 배열에 넣기
    for i in range(len(str1)-1):
        if str1[i].isalpha() and str1[i+1].isalpha():
            arr1.append(str1[i:i+2].lower())
    for i in range(len(str2)-1):
        if str2[i].isalpha() and str2[i+1].isalpha():
            arr2.append(str2[i:i+2].lower())   
            
    # set으로 중복을 제거하고 그 중에서 교집합
    intersection_list = set(arr1).intersection(set(arr2))
    # set으로 중복을 제거하고 그 중에서 합집합
    union_list = set(arr1).union(set(arr2))
    
    # 둘 다 공집합이면 65536 반환
    if not arr1 and not arr2:
        return 65536
    
    inter, union = 0, 0
    
    # 교집합 원소가 배열에 있을 때 그 개수를 세고
    # 두 개의 배열 중에서 가장 작은 값을 inter에 더해준다.
    for i in intersection_list:
        inter += min(arr1.count(i),arr2.count(i))

	# 합집합 원소가 배열에 있을 때 그 개수를 세고
    # 두 개의 배열 중에서 가장 큰 값을 union에 더해준다.    
    for u in union_list:
        union += max(arr1.count(u),arr2.count(u))

    answer = int(inter / union * 65536)

    return answer 
profile
공부한 내용을 기록하는 공간입니다. 📝

0개의 댓글