뉴스 클러스터링

Ssoony의 Velog·2024년 6월 28일
0

https://school.programmers.co.kr/learn/courses/30/lessons/17677

def solution(str1, str2):
    n1=len(str1)
    n2=len(str2)
    strList1=[str1[i].upper()+str1[i+1].upper() for i in range(n1-1)] #문자열을 대문자로 변환하고 2개씩 끊기
    strList2=[str2[i].upper()+str2[i+1].upper() for i in range(n2-1)]
    str1=[]
    str2=[]
    for i in strList1:
        if i.isalpha()==True: #알파벳이 아닌 숫자, 공백, 기호 등의 요소를 버림
            str1.append(i) 
    for i in strList2:
        if i.isalpha()==True:
            str2.append(i)
    inter=list(set(str1).intersection(str2)) #교집합 찾기
    union=list(set(str1).union(str2)) #합집합 찾기
    interSum = sum([min(str1.count(i), str2.count(i)) for i in inter]) #다중 교집합의 갯수
    unionSum = sum([max(str1.count(i), str2.count(i)) for i in union]) #다중 합집합의 갯수
    if len(str1)==0 and len(str2)==0:
        return 65536 #두 집합이 모두 공집합이면 1을 반환
    else :
        return int((interSum/unionSum)*65536)
  1. 주어진 문자열을 2개씩 잘라서 대문자로 변환하여 리스트에 저장
  2. 리스트의 각 요소들 중 알파벳으로만 이루어진(isalpha==True)인 요소들만 저장
  3. set()을 활용하여 intersection(), union()으로 교집합과 합집합을 찾기
  4. 주어진 합집합 교집합을 기준으로 다중 교집합의 갯수, 다중 합집합의 갯수를 구함
  5. 두 집합이 모두 공집합이면 1을 반환(문제에 명시되어있음)
  6. 주어진 두 집합이 모두 공집합이 아니면, 자카드 유사도 값을 구하여 정수의 값으로 변환하여 반환

★ 중요한 점!

다중 교집합, 다중 합집합의 개념이 어려운 문제였다.
A={1,1,1}, B={1,1,2}라는 두 개의 집합이 주어질 때,
A∩B = {1} , A∪B = {1,2} 이다.
하지만 다중 교집합, 다중 합집합의 경우 A∩B = {1,1} , A∪B = {1,1,1,2} 가 된다.
따라서 이러한 집합의 개수를 구하기 위해서 교집합과 합집합을 구한다음,

interSum(다중 교집합의 개수)는 A∩B = {1}의 요소가 각 집합에 있는 개수의 값을 구해서 최소값을 구했다.
즉, 집합 A에는 교집합의 요소인 1이 총 3개가 있고, 집합 B에는 교집합의 요소인 1이 총 2개가 있다.
이 두개의 값 (3, 2)의 최소값인 2({1,1}=2)가 다중 교집합의 개수가 된다!

unionSum(다중 합집합의 개수)는 A∪B = {1,2}의 요소가 각 집합에 있는 개수의 최대값을 구한다.
집합 A에는 합집합의 요소인 1은 총 3개가 있고, 2는 0개이다.
다음으로 집합 B에는 1이 총 2개가 있고, 2가 1개 있다.
따라서 합집합의 요소 1은 (3,2)의 최대값은 3({1,1,1})이고, 두번째 요소 2는 (0,1)의 최대값인 1({2})가 된다.
따라서 합집합은 총 4개 {1,1,1,2}가 된다.

profile
개발자로 성장하기 위한 한걸음

0개의 댓글