본문 바로가기
카테고리 없음

[프로그래머스/python/Lv2] 뉴스 클러스터링

by Bokoo14 2023. 12. 16.

코딩테스트 연습 > 2018 KAKAO BLIND RECRUITMENT > [1차] 뉴스 클러스터링

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

코드

def makeArrays(sstr): #"FRANCE", "aa1+aa2"  # 다중집합 만들기
    sstr = sstr.lower()
    sstr = list(sstr+ " ") # 문자열 한글자씩 끊기
    for i in range(len(sstr)-1):
        sstr[i] = sstr[i] + sstr[i+1]
    new_sstr = []
    for s in sstr:
        if len(s) == 2 and 97 <= ord(s[0]) <= 122 and 97 <= ord(s[1]) <= 122:
            new_sstr.append(s)
    return new_sstr

def findIntersect(str1, str2): # 교집합의 개수 구하기
    intersectArray = []
    for s1 in str1:
        if s1 in str2: # 두 집합의 원소가 동일하다면
            intersectArray.append(s1)
            str2.remove(s1)
    return len(intersectArray)

def solution(str1, str2):
    answer = 0
    # 다중집합 만들기
    str1 = makeArrays(str1)
    str2 = makeArrays(str2)
    
    # 교집합의 개수 구하기
    str1Len1, str2Len2 = len(str1), len(str2)
    numberOfIntersect = 0
    if str1Len1 <= str2Len2:
        numberOfIntersect = findIntersect(str1, str2)
    else:
        numberOfIntersect = findIntersect(str2, str1)
        
     # 자카드 유사도
    if len(str1) == 0 and len(str2) == 0:
        answer = 1 * 65536
    else: 
        answer = int(numberOfIntersect / (str1Len1+str2Len2-numberOfIntersect) * 65536)
    return answer

풀이

직접 다중 집합을 만든 후, 교집합의 개수 구하기


코드2

import re
import math

def solution(str1, str2):
    str1 = [str1[i:i+2].lower() for i in range(0, len(str1)-1) if not re.findall('[^a-zA-Z]+', str1[i:i+2])]
    str2 = [str2[i:i+2].lower() for i in range(0, len(str2)-1) if not re.findall('[^a-zA-Z]+', str2[i:i+2])]

    gyo = set(str1) & set(str2)
    hap = set(str1) | set(str2)

    if len(hap) == 0 :
        return 65536

    gyo_sum = sum([min(str1.count(gg), str2.count(gg)) for gg in gyo])
    hap_sum = sum([max(str1.count(hh), str2.count(hh)) for hh in hap])

    return math.floor((gyo_sum/hap_sum)*65536)

풀이

파이썬의 내장 함수인 정규식 활용