[JavaScript] [1차] 뉴스 클러스터링

2022. 8. 1. 15:00Algorithm/프로그래머스

level : 2
문제 링크 : [1차] 뉴스 클러스터링

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

My Solution(1)

function solution(str1, str2) {
    let answer = 0;
    let A = [], B = [];
    const len1 = str1.length, len2 = str2.length;
    for(let i = 0; i < len1-1; i++){
        const temp = str1.slice(i,i+2).toLowerCase();
        const condition = temp.match(/[a-z]/g);
        if(condition!==null && condition.length===2)
            A.push(temp);
    }
        
    for(let j = 0; j < len2-1; j++){
        const temp = str2.slice(j,j+2).toLowerCase();
        const condition = temp.match(/[a-z]/g);
        if(condition!==null && condition.length===2)
            B.push(temp);
    }
    let u = A.concat(B);
    let n = [...new Set(A.filter(x=>B.includes(x)))].map(v=>new Array(Math.min(A.filter(i=>i===v).length,B.filter(j=>j===v).length)).fill(v)).reduce((pre,cur)=>pre.concat(cur),[]);
    answer = parseInt(65536 * (u.length !== 0 ? n.length/(u.length-n.length) : 1));
    return answer;
}

풀이방법(1)
A와 B라는 Array에 2글자씩 끊어서 만든 다중 집합을 만들었다. 그 후 A와 B를 concat이라는 메서드를 이용하여 합쳐서 u라는 Array를 만들었다. u는 얼핏보면 합집합처럼 이해할 수 있으나 A와 B의 합집합에 교집합의 원소가 중복해서 더 들어간 격이다.
이후 n을 A와 B의 교집합을 만들었다. 만들고 보니 집합을 만드는 것이 아닌 교집합과 합집합의 각각의 원소의 개수를 이용하여 유사도를 구하는 일이었다.
굳이 교집합과 합집합을 구하지 않아도 되었었다. 또한 반복적인 작업이 있었으나 이 부분을 함수로 고치지 않았기에 보기에 너무 난잡하고 쪽같은 작업을 계속 만들기에 의미가 없어보였다.

My Solution(2)

function clustering(str){
    const len = str.length;
    let arr = [];
    for(let i = 0; i < len-1; i++){
        const temp = str.slice(i,i+2).toLowerCase();
        const condition = temp.match(/[a-z]/g);
        if(condition!==null && condition.length===2)
            arr.push(temp);
    }
    return arr;
}
function solution(str1, str2) {
    let answer = 0;
    const A = clustering(str1);
    const B = clustering(str2);
    
    let list = [...new Set(A.concat(B))];
    let u = 0, n = 0;
    list.forEach(item=>{
        const a = A.includes(item) ? A.filter(i=>i===item).length : 0;
        const b = B.includes(item) ? B.filter(i=>i===item).length : 0;
        u+=(Math.max(a,b));
        n+=(Math.min(a,b));
    })
    answer = parseInt(65536 * (u !== 0 ? n/u : 1));
    return answer;
}

풀이방법(2)
첫 번째 풀이에서 생각한 반복적인 작업을 clustering이라는 함수를 만들어 처리하였다.
이 후, A와 B의 원소의 개수를 이용하여 교집합과 합집합의 수를 각각 측정하였다.

느낀점
문제를 제대로 읽고 요구조건에 맞춰 만들자!
쓸데 없는 짓을 하지 말자!
반복적인 부분은 함수로 만들어야한다는 것을 잊지말자!

'Algorithm > 프로그래머스' 카테고리의 다른 글

[JavaScript] [1차] 비밀지도  (0) 2022.08.02
[JavaScript] 가장 먼 노드  (0) 2022.08.01
[JavaScript] 부족한 금액 계산하기  (0) 2022.08.01
[JavaScript] 2016년  (0) 2022.07.20
[JavaScript] N으로 표현하기  (0) 2022.07.20