본문 바로가기
코딩테스트/프로그래머스

프로그래머스 :: 2018 KAKAO BLIND RECRUITMENT :: 뉴스 클러스터링

by Godgil 2021. 9. 16.

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

 

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

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

programmers.co.kr

문제 해석

두 개의 스트링이 주어졌을 때, 자카드 유사도를 구하는 문제. 자세한 조건은 위 링크에서 확인하자.

 

간단하게, 스트링을 두 단어씩 나눈 뒤, 문자인경우만 계산해서 유사도를 구하면 쉽게 풀 수 있다.

 

1. 스트링을 두 글자씩 묶어서 반환 해 줄 함수를 하나 작성한다.

1-1. 문제 조건에 특수문자, 숫자인 경우는 제외한다고 나와있으므로, 이는 정규식을 활용한다.

 

2. 함수에서 반환된 배열을 통해 유사도를 계산한다.

2-1. 계산할 때는 두 스트링을 묶은 배열을 합친 뒤, Set으로 변경 해 중복을 제거하고, 순회하면서 min과 max를 찾아서 각자의 배열에 넣어준다.

 

 

코드

// 두 글자씩 묶어서 배열로 반환해주는 함수
function wordSplice(str){
    
    let wordArray = []
    let isAlpha = /[a-z]{2}/
    for( let i = 1 ; i < str.length ; i++){
        let word = (str[i-1] + str[i]).toLowerCase()
        if(isAlpha.test(word)){
            wordArray.push( word )
        }
    }
    return wordArray;
}

//메인, 반환된 배열을 통해 유사도를 계산하는 함수
function solution(str1, str2) {
    var answer = 0;
    str1 = wordSplice(str1)
    str2 = wordSplice(str2)
    
    let strSet = new Set([...str1, ...str2])
    let lastList = Array.from(strSet)
    
    let intersection = []
    let union = []
    lastList.forEach(ele => {
        let countStr1 = str1.filter(item => ele === item).length
        let countStr2 = str2.filter(item => ele === item).length
        let many = Math.max(countStr1, countStr2)
        for (let i = 0 ; i < many ; i++){
            union.push(ele)
        }
        let aLittle = Math.min(countStr1, countStr2)
        for (let i = 0 ; i < aLittle ; i++){
            intersection.push(ele)
        }
    })
    if( union.length === 0 && intersection.length === 0){
        answer = 1*65536
    }else{
        
    answer = parseInt((intersection.length/union.length)*65536)
    
    }
    return answer;
}

 

회고

제일 처음 문제를 잘못 읽어서, 문자가 아닌경우는 지우고 반환받은 문자열로 해결하려했는데, 3번 테스트케이스에서 에러가 나 다시 찬찬히 읽어보니, 특문과 숫자를 제외하고 스트링을 사용하는게 아닌, 그냥 그 스트링에 하나라도 있으면 사용하지 않는 것이었다. 문제를 똑바로 읽도록 하자.

 

정규식에 익숙하지 않아 아직은 찾아보면서 해야하는데, 빨리 익숙해졌으면 좋겠다.

댓글