2단계 : 뉴스클러터링

차차·2023년 1월 28일
post-thumbnail

코딩테스트 연습 - [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;
}
  1. 문자열을 받아 2개 단위(알파벳 이외는 제외)로 카운팅 해주는 함수 getObj 생성
  2. intersection으로 교집합 개수 카운트
  3. union으로 합집합을 구한 뒤에 Object.values()reduce를 통해 개수 카운트
  4. unionCnt 가 0일 때는 65536 리턴
profile
나는야 프린이

0개의 댓글