[프로그래머스] 코딩테스트연습 > [1차] 뉴스 클러스터링
알고리즘/javascript

[프로그래머스] 코딩테스트연습 > [1차] 뉴스 클러스터링

 

코딩테스트 연습 - [1차] 뉴스 클러스터링

뉴스 클러스터링 여러 언론사에서 쏟아지는 뉴스, 특히 속보성 뉴스를 보면 비슷비슷한 제목의 기사가 많아 정작 필요한 기사를 찾기가 어렵다. Daum 뉴스의 개발 업무를 맡게 된 신입사원 튜브

programmers.co.kr

 

function solution(str1, str2) {
    let arr1 = multipleSets(str1)
    let arr2 = multipleSets(str2)
        
    let intersection = 0;
    let union = 0;

    const unique = new Set([...arr1, ...arr2])
    
    unique.forEach(item => {
        const numArr1Has = arr1.filter(x => x === item).length
        const numArr2Has = arr2.filter(x => x === item).length
        intersection += Math.min(numArr1Has, numArr2Has)
        union += Math.max(numArr1Has, numArr2Has)
    })
    
    if(intersection === 0 & union === 0){
        return 65536
    }
    
    const jaccard = parseInt((intersection / union) * 65536)
    return jaccard
}

function multipleSets(str) {
    const regex = /^[a-z]*$/; 
    const lower = str.toLowerCase()
    let arr = [];
    
    for(let i=0; i<lower.length; i++){
        if(lower[i] && lower[i+1]){
        const twoStrings = lower[i]+lower[i+1]
            if(regex.test(twoStrings)){
                arr.push(twoStrings)
            }
        }
    }
    return arr
}
  1. string들을 소문자로 변환시킨다.
  2. string을 쪼갠 후 2개씩 붙이고 정규표현식을 이용해 a-z 만 가지고 있는 것들만 return ( arr1, arr2 )
  3. 각각 string 들을 가지고 있는 배열을 new Set 을 이용해 중복값 제거한, 합친 배열 생성 ( const unique )
  4. unique 의 각 원소들이 arr1 과 arr2에 각각 몇 개씩 들어가있는지 세기 ( numArr1Has, numArr2Has )
  5. numArr1Has 와 numArr2Has 중 작은 값은 intersection 집합의 해당 원소개수
  6. numArr1Has 와 numArr2Has 중 큰 값은 union 집합의 해당 원소개수

분명 맞게 했는데 계속 틀려서 뭔가 했더니 문제를 잘못읽어서 정규표현식에 숫자도 포함되게 했었다...

(  /^[a-z0-9]*$/  이렇게... )

 

앞으로는 문제를 잘 읽도록 하자...

반응형