코딩테스트 연습 - [1차] 뉴스 클러스터링
function solution(str1, str2) {
let obj1 = getObj(str1.toLowerCase());
let obj2 = getObj(str2.toLowerCase());
let intersection = 0;
let union = {};
Object.keys(obj1).forEach(key =>{
union[key] = obj1[key];
if(obj1[key] && obj2[key]) intersection += Math.min(obj1[key],obj2[key])
});
Object.keys(obj2).forEach(key => {
union[key] = Math.max(union[key] || 0, obj2[key]);
});
let unionCnt = Object.values(union).reduce((a,b) => a+b,0);
if(!unionCnt) return 65536
return (intersection / unionCnt) * 65536 | 0
}
function getObj(str){
let obj = {};
for(let i= 0; i < str.length-1; i++){
let addStr = (str[i]+str[i+1]).replace(/[^a-z]/g,"")
if(addStr.length !== 2) continue;
obj[addStr] = obj[addStr] ? obj[addStr] + 1 : 1;
}
return obj;
}
- 문자열을 받아 2개 단위(알파벳 이외는 제외)로 카운팅 해주는 함수
getObj 생성
intersection으로 교집합 개수 카운트
union으로 합집합을 구한 뒤에 Object.values()와 reduce를 통해 개수 카운트
unionCnt 가 0일 때는 65536 리턴