FrontEnd/프로그래머스

[JS] 뉴스 클러스터링

728x90

처음엔 set자료형을 활용해서 교집합,합집합을 구해보려고 했는데 집합이 다중집합이었다.

 

 

따라서 조금 다르게 해결해보았다.

 

 

 

1. 연속된 알파벳이 담겨있는 다중집합 만들기.

 

두 문자열을 getSet함수를 활용해서 다중집합으로 만들어주었다.

 

 

2. 교집합 만들기

문제에서 원하는 것은 교집합과 합집합의 크기이다. 교집합만 구한다면 합집합의 크기는 각 집합의 크기의 합에서 교집합을 빼면 손쉽게 구해줄 수 있다.

 

다중집합에서 교집합을 만들어야 했는데 Map자료형을 활용해서 구해보았다. 2번째 집합의 값들을 map자료형에 넣고, filter를 활용해서 map에 데이터가 있는지 없는지 유무를 확인했다. 만약 있다면 개수를 1씩 빼주어서 다중집합에서 교집합이 구현되도록 하였다.

 

 

3. 합집합의 크기가 0 이어서 계산할 수 없는 경우만 예외처리를 해주었다.

 

 

 

function solution(str1, str2) {
    
    const getSet = (str) => {
        const ret = []
        str = str.toLowerCase()
        for (let i = 0 ; i < str.length-1 ; i++) {
            const st = str[i]+str[i+1]
            if (/[a-z][a-z]/.test(st)) ret.push(st)
        }
        return ret
    }
    
    const set1 = getSet(str1)
    const set2 = getSet(str2)
    
    const map = new Map()
    for (const el of set2) {
        if (map.get(el)) map.set(el,map.get(el)+1)
        else map.set(el,1)
    }
    
    const union = set1.filter(el => {
        if (map.get(el)) {
            map.set(el,map.get(el)-1)
            return true
        }
        return false
    })
    
    
    const unionSize = union.length
    const intersectionSize = set1.length + set2.length - union.length
    
    if (!intersectionSize) return 65536
    return ~~(unionSize/intersectionSize * 65536)
   
    
    
    
}
728x90

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

[JS] 영어 끝말잇기  (0) 2023.07.14
[JS] 예상대진표  (0) 2023.07.14
[JS] 캐시  (0) 2023.07.14
[JS] 방금 그곡  (0) 2023.07.14
[JS] 압축  (0) 2023.07.13