algorithm/프로그래머스 문제

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

장경훈 2022. 7. 19. 10:42
>
  [LV2] 뉴스 클러스터링 문제링크
여러 언론사에서 쏟아지는 뉴스, 특히 속보성 뉴스를 보면 비슷비슷한 제목의 기사가 많아 정작 필요한 기사를 찾기가 어렵다. Daum 뉴스의 개발 업무를 맡게 된 신입사원 튜브는 사용자들이 편리하게 다양한 뉴스를 찾아볼 수 있도록
www.programmers.co.kr

#예제 입출력

str1 str2 answer
FRANCE french 16384
handshake shake hands 65536
aa1+aa2 AAAA12 43690
E=M*C^2 e=m*c^2 65536

 

 

문제 해설

 

이번 문제는 자카드 유사도를 구현하는 문제이며 자카드 유사도를 모르더라도 문제에 설명되어 있는 것처럼 문자열을 2개씩 나눈 후 유사도=다중집합의 교집합/ 다중집합의 합집합 이 공식을 사용하여 유사도를 구할 수 있다.  코드는 다음과 같다.

from math import floor #버림 해주기 위해 math 사용
def solution(str1, str2):
    answer = 0
    str1=str1.upper() #대소문자 상관없이 비교하기 위해 두 문자열 모두 대문자로 변경
    str2=str2.upper()
    A=[]#각각의 문자열을 2문자씩 잘라 저장하는 리스트
    B=[]
    
    for i in range(len(str1)-1): #만약 문자가 알파벳이 아닌 경우 비교대상에서 제외한다
        if str1[i].isalpha() and str1[i+1].isalpha():
            A.append(str1[i:i+2])        
    for i in range(len(str2)-1):#만약 문자가 알파벳이 아닌 경우 비교대상에서 제외한다
        if str2[i].isalpha() and str2[i+1].isalpha():
            B.append(str2[i:i+2])
            
    inter=set(A)&set(B) # 두 다중집합의 교집합 원소확인  
    union=set(A)|set(B) # 두 다중집합의 합집합 원소 확인
    
    if len(union) == 0: #만약 합집합이 0라면 비교대상이 없기 때문에 65536을 반환한다
        return 65536
        
    multi_inter=sum([min(A.count(i),B.count(i)) for i in inter]) #위의 확인된 교집합 원소를 각각의 다중 집합이 가진 수의 최소값을 더해준다
    multi_union=sum([max(A.count(i), B.count(i)) for i in union])#위의 확인된 합집합 원소를 각각의 다중 집합이 가진 수의 최대값을 더해준다
    answer=floor((multi_inter/multi_union)*65536)#유사도 계산
    return answer

 

Feedback

 

  • 다중집합의 교집합, 합집합 개념에 대해서  다시한번 개념정리를 해볼 필요가 있다.
  • math 모듈의 기능들을 정리할 필요가 있다.