본문 바로가기

알고리즘/카카오 EASY

뉴스 클러스터링 (Level 2)

문제

 

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

 

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

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

programmers.co.kr

 

내 풀이

 

먼저 str1과 str2의 다중집합을 만든다. isalpha() 함수로 영문자만 포함하도록 하였다.

Counter를 사용하여 다중집합의 구성을 파악하였다.

교집합은 다중집합 한 개를 선택하고 그 다중집합의 모든 원소를 돌게 하여 구하였다.

합집합은 중졸이면 다 아는 n(A∪B) = n(A) + n(B) - n(A∩B) 공식을 이용하였다.

 

from collections import Counter
import math
def solution(str1, str2):
    answer = 0
    str1_list = [str1[i:i+2].lower() for i in range(len(str1)-1) if str1[i].isalpha() and str1[i+1].isalpha()]
    str2_list = [str2[i:i+2].lower() for i in range(len(str2)-1) if str2[i].isalpha() and str2[i+1].isalpha()]
    if not str1_list and not str2_list:
        return 65536
    
    str1_cnt = Counter(str1_list)
    str2_cnt = Counter(str2_list)
    
    intersect, union = 0, 0
    for k in str1_cnt:
        if str2_cnt[k]: intersect += min(str1_cnt[k], str2_cnt[k])
    union = len(str1_list) + len(str2_list) - intersect
    
    return math.trunc(intersect/union*65536)

 

 

다른 풀이

 

정규식을 이용하였다. 

 

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)

 

총평

풀이가 점점 파이토닉하게 변하고 있다는 것이 느껴진다.

그리고, 정규식을 집중적으로 공부해야 할지 진지하게 고민해야겠다. 그렇지만 머리 아픈걸...

'알고리즘 > 카카오 EASY' 카테고리의 다른 글

수식 최대화 (Level 2)  (0) 2022.07.04
거리두기 확인하기 (Level 2)  (0) 2022.06.30
실패율 (Level 1)  (0) 2022.06.28
괄호 변환 (Level 2)  (0) 2022.06.25
메뉴 리뉴얼 (Level 2)  (0) 2022.06.25