◈ 오류 정정 및 피드백 환영
코딩테스트 연습 - [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)
'Algorithm > Python' 카테고리의 다른 글
[Python] 프로그래머스 - 실패율 (0) | 2022.03.08 |
---|---|
[Python] 프로그래머스 - [1차] 비밀지도(재귀) (0) | 2022.03.06 |
[Python] 프로그래머스 - [1차] 추석 트래픽(Greedy) (0) | 2022.03.04 |
[Python] 백준 - 10799번 쇠막대기(Stack) (0) | 2022.03.03 |
[Python] 백준 - 1918번 후위 표기식(Stack) (0) | 2022.03.02 |
댓글