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
}
- string들을 소문자로 변환시킨다.
- string을 쪼갠 후 2개씩 붙이고 정규표현식을 이용해 a-z 만 가지고 있는 것들만 return ( arr1, arr2 )
- 각각 string 들을 가지고 있는 배열을 new Set 을 이용해 중복값 제거한, 합친 배열 생성 ( const unique )
- unique 의 각 원소들이 arr1 과 arr2에 각각 몇 개씩 들어가있는지 세기 ( numArr1Has, numArr2Has )
- numArr1Has 와 numArr2Has 중 작은 값은 intersection 집합의 해당 원소개수
- numArr1Has 와 numArr2Has 중 큰 값은 union 집합의 해당 원소개수
분명 맞게 했는데 계속 틀려서 뭔가 했더니 문제를 잘못읽어서 정규표현식에 숫자도 포함되게 했었다...
( /^[a-z0-9]*$/ 이렇게... )
앞으로는 문제를 잘 읽도록 하자...
반응형
'알고리즘 > javascript' 카테고리의 다른 글
[프로그래머스] 코딩테스트연습 > 예상 대진표 (0) | 2021.10.21 |
---|---|
[프로그래머스] 코딩테스트연습 > 크레인 인형뽑기 게임 (0) | 2021.10.11 |
[프로그래머스] 코딩테스트연습 > 키패드 누르기 (0) | 2021.10.11 |
[프로그래머스] 코딩테스트연습 > 숫자 문자열과 영단어 (0) | 2021.09.30 |
[프로그래머스] 코딩테스트연습 > 신규아이디 추천 (0) | 2021.09.29 |