Programmers - 뉴스 클러스터링 (Javascript)

Hyeon·2021년 10월 21일
0
function union(mul1,mul2){
    let idx, ret = [];
    mul1.forEach((m1)=>{
        idx = mul2.findIndex(m2=>m1===m2);
        if(idx!==-1){//포함되어 있으면
            mul2.splice(idx,1);//제거
        }
        ret.push(mul2[idx]);//합집합에 추가하
    })
    
    mul2.forEach((m2)=>{
        ret.push(m2);//mul2에 남아있는 요소 합집합에 추가
    })
    return ret;
}


function intersection(mul1,mul2){
    let mul2Copy, idx, ret = [];
    mul2Copy = [...mul2];
    
    mul1.forEach((m1)=>{
        idx = mul2Copy.findIndex(m2=>m1===m2);
        if(idx!==-1){//포함되어 있으면
            ret.push(mul2[idx]);//교집합에 추가하고
            mul2Copy.splice(idx,1);//제거
        }
    })
    return ret;
}

function makeMultiset(str){//다중집합
    let target, flag, ret=[];
    
    for(let i=0; i<str.length; i++){
        target = str.slice(i,i+2);//2글자씩 끊는다.
        flag = true;
        
        if(target.length!==2) flag= false;//길이가 2가 아닐때
        
        for(let j=0; j<target.length ; j++){
            if("a"> target[j] || "z" <target[j]){//영문자가 아닐때
                flag = false;
            }
        }
        
        if(flag) ret.push(target);//조건에 부합하면 push
    }
    return ret;
}

function solution(str1, str2) {
    let answer = 0;
    
    str1 = str1.toLowerCase();
    str2 = str2.toLowerCase();
    
    const mul1 = makeMultiset(str1);
    const mul2 = makeMultiset(str2);
    
    const iLen = intersection(mul1,mul2).length;
    const uLen = union(mul1,mul2).length;
    
    if(iLen ===0 && uLen===0){
        return 65536;
    }
    
    answer = Math.floor((iLen/uLen)*65536);
    
    return answer;
}

구현문제 였다.

매개변수로 배열을 전달할 때 참조값이 전달된다는 것을 간과해서 문제가 생겼다. splice 함수는 배열을 실제로 변경하기 때문에 전달한 배열을 복사한 뒤 사용해서 원본에 손상이 없도록 했다.

profile
요즘 인터렉티브한 웹에 관심이 많습니다.

0개의 댓글