본문 바로가기
Algorithm/Python

[Python] 프로그래머스 - [1차] 뉴스 클러스터링(정규식)

by 힘팽 2022. 3. 5.

◈ 오류 정정 및 피드백 환영

 

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

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

programmers.co.kr


🔎문제 분석

영문자 글자 쌍만 추출하기 위해서는 정규식으로 접근하면 된다. 

문자열을 2개씩 자른 뒤에 대문자 알파벳 2개로만 이루어진 문자열만 필터링해 chunk를 생성한다.

def get_chunk(str1):
    chunk = [str1[i:i+2].upper() for i in range(0,len(str1))]
    p = re.compile('[A-Z]{2}')
    return list(filter(lambda x: p.match(x), chunk))
    
chunk1 = get_chunk(str1)
chunk2 = get_chunk(str2)

교집합 자체를 구하는 것은 간단하지만 교집합 원소의 개수를 셀 때는 조심해야 한다.

2개 chunk 중에서 해당 원소가 더 적게 들어있는 쪽의 개수를 세야 하기 때문이다.

예컨대 한쪽은 ['AA', 'AA', 'CB']이고 다른 한쪽은 ['AA', 'AA', 'AA', 'BC']라면 교집합은 {'AA', 'AA', 'AA'}가 아닌 {'AA', 'AA'}이기 때문에 첫 번째 chunk의 개수를 세야 한다.

inter = set(chunk1) & set(chunk2)
len_inter = 0
for i in inter:
    len_inter += min(chunk1.count(i), chunk2.count(i))

합집합의 경우 전체 chunk에서 교집합 개수만 제외하면 된다.

🤦‍♀️유의 사항

ZeroDivisionError를 피하기 위해 조건문을 추가해야 한다.


import re
def get_chunk(str1):
    chunk = [str1[i:i+2].upper() for i in range(0,len(str1))]
    p = re.compile('[A-Z]{2}')
    return list(filter(lambda x: p.match(x), chunk))

def solution(str1, str2):
    chunk1 = get_chunk(str1)
    chunk2 = get_chunk(str2)
    
    inter = set(chunk1) & set(chunk2)
    len_inter = 0
    for i in inter:
        len_inter += min(chunk1.count(i), chunk2.count(i))
    
    len_uni = len(chunk1)+len(chunk2)-len_inter
    
    if len_uni == 0 :
        return 65536

    return int((len_inter/len_uni)*65536)

 

댓글