프로그래머스 Lv.2: 뉴스 클러스터링

Steve·2021년 11월 25일
0

https://programmers.co.kr/learn/courses/30/lessons/17677

나는 실제로 합집합과 교집합을 만든다음 갯수를 세서 풀었는데, 다른 사람의 풀이를 보고 굳이 그렇게 안해도 됨을 깨달았다. set 를 만들어서 각 두 문자열의 원소를 넣은 다음, min 과 max 를 써서 각각의 교집합, 합집합 변수에 더해주면 되는 일이었다.

function solution(str1, str2) {

    function expand(str){
        let arr = [];
        str = str.toUpperCase();
        for (let i = 0; i < str.length-1; i++){
            let el = str[i]+str[i+1];
            if (/[^A-Z]/g.test(el)) continue;
            arr.push(el)
        }
        return arr;
    }
    
    let arr1 = expand(str1)
    let arr2 = expand(str2)
    
    let intersect = 0, union = 0;
    
    let set = new Set([...arr1, ...arr2])
    
    for (let x of set){
        let count1 = arr1.filter(e => e === x).length;
        let count2 = arr2.filter(e => e === x).length;
        intersect += Math.min(count1, count2); // 작은건 교집합
        union += Math.max(count1, count2); // 큰건 합집합
    }
    //console.log(intersect, union)
    if (!intersect && !union) return 65536
    return Math.floor((intersect / union) * 65536)
}
profile
게임과 프론트엔드에 관심이 많습니다.

0개의 댓글