문제
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 |