[프로그래머스] 2018 KAKAO - [1차] 뉴스 클러스터링
https://programmers.co.kr/learn/courses/30/lessons/17677
코딩테스트 연습 - [1차] 뉴스 클러스터링
뉴스 클러스터링 여러 언론사에서 쏟아지는 뉴스, 특히 속보성 뉴스를 보면 비슷비슷한 제목의 기사가 많아 정작 필요한 기사를 찾기가 어렵다. Daum 뉴스의 개발 업무를 맡게 된 신입사원 튜브
programmers.co.kr
[풀이 과정]
1. str1, str2에서 각각 2글자씩 잘라서 해당 문자열이 모두 알파벳으로만 되어있다면 소문자로 바꾼후 arr1, arr2에 넣는다.
2. arr1, arr2에 대해 Counter함수를 사용해서 각 요소별 개수를 value로 갖는 dict1, dict2를 만든다.
3. dict1, dict2의 key값들을 keys에 넣는다.
4. 교집합 개수를 구하기 위해 keys에 있는 key값들을 하나씩 확인하면서 dict1, dict2 둘 다에 포함된 key값 중에서 min값을 cnt1에 더해준다.
5. 합집합 개수를 구하기 위해 keys에 있는 key값들을 하나씩 확인하면서 dict1, dict2 둘 다에 포함된 key값이면 max값을, 둘 중 하나에 포함된 key값은 해당 value를 cnt2에 더해준다.
6. cnt2가 0이면 주어진 조건에 따라 유사도가 1이므로 65536를 반환한다.
7. cnt2가 0이 아니면 cnt1/cnt2 * 65536을 구한 뒤 int로 타입을 변형해서 return한다.
set타입은 합집합, 교집합 연산을 제공하기 때문에 CODE2처럼 |, &을 활용하면 더 간단하게 문제를 해결할 수 있다.
[소스 코드]
<CODE1>
from collections import Counter
def solution(str1, str2):
answer = 0
arr1 = [str1[i:i+2].lower() for i in range(len(str1)-1) if str1[i:i+2].isalpha()]
arr2 = [str2[i:i+2].lower() for i in range(len(str2)-1) if str2[i:i+2].isalpha()]
dict1 = dict(Counter(arr1))
dict2 = dict(Counter(arr2))
keys = set()
for key in dict1.keys(): keys.add(key)
for key in dict2.keys(): keys.add(key)
cnt1, cnt2 = 0, 0
for key in keys:
if key in dict1.keys() and key in dict2.keys():
cnt1 += min(dict1[key], dict2[key])
for key in keys:
if key in dict1.keys() and key in dict2.keys():
cnt2 += max(dict1[key], dict2[key])
elif key not in dict1.keys():
cnt2 += dict2[key]
elif key not in dict2.keys():
cnt2 += dict1[key]
if cnt2 == 0: answer = 65536
else: answer = int((cnt1/cnt2)*65536)
return answer
<CODE2>
def solution(str1, str2):
arr1 = [str1[i:i+2].lower() for i in range(len(str1)-1) if str1[i:i+2].isalpha()]
arr2 = [str2[i:i+2].lower() for i in range(len(str2)-1) if str2[i:i+2].isalpha()]
i_arr = set(arr1) & set(arr2)
u_arr = set(arr1) | set(arr2)
if len(u_arr) == 0: return 65536
i_cnt = sum([min(arr1.count(i), arr2.count(i)) for i in i_arr])
u_cnt = sum([max(arr1.count(u), arr2.count(u)) for u in u_arr])
return int((i_cnt/u_cnt)*65536)