[프로그래머스] 뉴스 클러스터링, 파이썬

YuJangHoon·2022년 7월 1일
0
post-thumbnail

[프로그래머스] 뉴스 클러스터링, 파이썬

💡 문제 해결 아이디어

내가 생각한 아이디어

  • 일단 2글자씩 잘라가면서, 정규표현식을 이용해 알파벳으로만 이루어져 있는지 확인한다
  • lower(또는 upper)함수를 적용하여, 소문자로 변경하여 대문자와 소문자의 차이를 제거한다
  • set()를 이용해서 교집합과 합집합을 계산한다
  • set()를 이용할 경우, 중복되는 원소는 하나만 남게 되므로, 중복되는 원소의 개수는 list의 count 함수를 통해 계산!
  • 교집합의 경우 count 값 중 더 작은 값을, 합집합의 경우에는 더 큰 값을 선택한다.

💻 작성된 코드(수정)

import re
def solution(str1, str2):
	# 2글자씩 잘라가면서, 알파벳으로만 이루어져 있는 경우만 lower 적용해서 리스트에 추가
    ls1 = [str1[i:i+2].lower() for i in range(len(str1)-1) if bool(re.match('[A-Za-z]{2}', str1[i:i+2]))]
    ls2 = [str2[i:i+2].lower() for i in range(len(str2)-1) if bool(re.match('[A-Za-z]{2}', str2[i:i+2])) ]
    # 교집합과 합집합
    intersec, union = set(ls1).intersection(set(ls2)), set(ls1).union(set(ls2))
    # 분자는 교집합 원소들의 count 중 더 작은 값들의 합
    up = sum([min(ls1.count(word), ls2.count(word)) for word in list(intersec)])
    # 분모는 합집합 원소들의 count 중 더 큰 값들의 합
    down = sum([max(ls1.count(word), ls2.count(word)) for word in list(union)])
    # 혹시나 분모가 0인 경우, 제시한 대로 분자와 분모를 1로 설정
    if not down:
        up, down = 1, 1
    return int(up/down * 65536)
profile
HYU DataScience, ML Engineer - 산업기능요원(4급)

0개의 댓글