프로그래머스 뉴스 클러스터링 코드 및 해설 (파이썬)

2021. 4. 13. 15:30algorithm

반응형

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

 

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

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

programmers.co.kr

 

💡 Counter를 이용해 중복을 고려한 교집합 및 합집합을 구했습니다 

 

프로그래머스에서 라이브러리를 사용할 수 있는지 확인해보니, 파이썬의 표준 라이브러리는 사용할 수 있다고 한다.

이 코드에 사용된 collections과 math 모두 표준 라이브러리라 다행이었지만, 너무 라이브러리에 의존한 풀이였나, 싶기도 하다... 

 

두 글자씩 끊어 바이그램을 만드는 함수를 만들고, 이때 만들어진 바이그램이 모두 알파벳으로만 이루어져 있는지 isalpha() 함수를 통해 확인했습니다.

 

이후 Counter를 사용해 중복을 포함한 교집합과 합집합을 구했고, 분모인 합집합의 원소의 개수가 0이면 score를 1로, 아니면 교집합의 개수를 합집합의 개수로 나눈 것을 score로 저장했습니다.

 

문제  설명대로 score 값에 65536를 곱한 후,  math 라이브러리를 사용해 소수점 버림을 하여 최종 답을 구했습니다.

 

from collections import Counter
import math

def getBigram(string):
    bigrams = []
    for i in range(len(string)-1):
        # 두 문자씩 bigram 만들기 
        bigram = string[i:i+2]
        # 만들어진 bigram이 알파벳으로만 이루어진 경우 리스트에 추가 
        if bigram.isalpha():
            bigrams.append(bigram)
    return bigrams

def solution(str1, str2):
    # 대소문자를 구별하지 않으므로 소문자로 통일 
    str1 = str1.lower()
    bigram1 = getBigram(str1)
    
    str2 = str2.lower()
    bigram2 = getBigram(str2)
    
    # 중복을 포함한 교집합 
    intersection = list((Counter(bigram1) & Counter(bigram2)).elements())
    # 중복을 포함한 합집합 
    union = list((Counter(bigram1) | Counter(bigram2)).elements())
    
    # 분모가 0인 경우 점수를 1로 
    if len(union) == 0:
        score = 1
    else:
        score = (len(intersection) / len(union)) 

    # 소수점 버림 
    return math.trunc(score * 65536)

 

반응형