[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 모듈의 기능들을 정리할 필요가 있다.
'algorithm > 프로그래머스 문제' 카테고리의 다른 글
[프로그래머스LV2] 게임 맵 최단거리 (0) | 2022.08.01 |
---|---|
[프로그래머스 LV2]프린터 (0) | 2022.07.28 |
[프로그래머스 LV2]행렬 테두리 회전하기 (0) | 2022.07.18 |
[프로그래머스LV2]메뉴 리뉴얼 (0) | 2022.07.15 |
[프로그래머스 LV2] 소수 찾기 (0) | 2022.07.15 |