STUDY/Algorithm

[프로그래머스] 뉴스 클러스터링, 2018 KAKAO BLIND RECRUITMENT, python

sinawi95 2021. 6. 23. 20:49
728x90

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

 

코딩테스트 연습 - [1차] 뉴스 클러스터링

뉴스 클러스터링 여러 언론사에서 쏟아지는 뉴스, 특히 속보성 뉴스를 보면 비슷비슷한 제목의 기사가 많아 정작 필요한 기사를 찾기가 어렵다. Daum 뉴스의 개발 업무를 맡게 된 신입사원 튜브

programmers.co.kr

def solution(str1, str2):
    str1 = str1.lower()
    str2 = str2.lower()
    # 집합 생성
    set1, set2 = set(), set()
    dict1, dict2 = {}, {}
    for i in range(len(str1) - 1):
        tmp = str1[i:i + 2]
        if not tmp.isalpha(): continue
        if not dict1.get(tmp):
            dict1[tmp] = 0
        dict1[tmp] += 1
        set1.add(tmp)
    
    for i in range(len(str2) - 1):
        tmp = str2[i:i + 2]
        if not tmp.isalpha(): continue
        if not dict2.get(tmp):
            dict2[tmp] = 0
        dict2[tmp] += 1
        set2.add(tmp)
    
    if not set1 and not set2:
        return 65536
        
    # 자카드 유사도 계산
    numerator, denominator = 0, 0
    for i in set1&set2:
        numerator += min(dict1.get(i) if dict1.get(i) else 0, dict2.get(i) if dict2.get(i) else 0)
    for i in set1|set2:
        denominator += max(dict1.get(i) if dict1.get(i) else 0, dict2.get(i) if dict2.get(i) else 0)

    return int(65536 * numerator / denominator)

자카드 유사도를 계산하기위해 전처리 과정이 필요하다.

두개의 문자열에서 두 글자씩 끊어서 몇번씩 나오는지 확인을 해야한다. set과 dictionary 를 사용해서 각각 저장한다.

set 은 합집합과 곱집합을 구하기 쉽기 때문에 사용했고, dictionary는 중복되는 값이 몇번 나오는지 계산하기 위해 사용했다.

set1, set2가 모두 공집합 인경우엔 자카드 유사도에서 1로 처리하라고 되어있으므로 return으로 끝낸다.

그 이후에는 자카드 유사도의 계산 방법을 통해서 구한다.

이때 dictionary에서 get을 쓰면 none type이 들어오는데 이 값을 0으로 처리하기 위해 삼항 연산자를 사용했다.


 

re.findall('[^a-zA-Z]+', str1[i:i+2])

정규 표현식을 사용하려고 했으나 어떻게 사용할지 몰랐는데 타인의 코드에 바로 나와있었다.

알파벳이 아닌 값이 나오면 넘어가는 코드로 구현한듯하다.