[프로그래머스] Lv2 - [1차] 뉴스 클러스팅

제리·2021년 1월 11일
0

프로그래머스

목록 보기
20/25

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

function toMultipleSet(str){
    const s = []
    let bfr = str[0]
    for(let i = 1; i < str.length; i++){
        let t = (bfr+str[i]).toLowerCase()
        if(/[^a-z]/.test(t) == false){
            s.push(t)
        }
        bfr = str[i]
    }
    return s
}

function solution(str1, str2) {
    var answer = 0;
    const A = toMultipleSet(str1)
    const B = toMultipleSet(str2)
    
    if(A.length == 0 && B.length == 0) return 65536
    
    const BCnt = {}
    for(const part of B){
        if(BCnt[part]) BCnt[part]++
        else BCnt[part] = 1
    }
    
    let gCnt = 0
    
    for(const part of A){
        if(BCnt[part]){
            BCnt[part]--
            gCnt++
        }
    }
    
    
    let hCnt = A.length + B.length - gCnt
    
    
    return parseInt(gCnt/hCnt*65536);
}

문자열을 2개씩 끊어서 다중집합을 생성하는 toMultipleSet함수를 구현하였다. 2문자를 합쳐서 소문자로 변환한다음 정규표현식을 사용하여 소문자가 아닌 값이 있는 경우에는 배열에 넣지 않았다.
예외사항으로 A와 B모두 공집합일경우 바로 값을 반환하였다.
효율적으로 교집합을 구하기 위해 B배열안에 있는 값을 객체안에 각 문자열의 갯수를 표시하도록 변환하였다.
교집합을 체크하고 합집합은 A와B의 길이의 합에서 교집합을 빼서 구했다.

profile
흐릿한 잉크가 뚜렷한 기억보다 낫다

0개의 댓글