프로그래머스 - [1차] 뉴스 클러스터링
part30. [1차] 뉴스 클러스터링
js ver 1.0
function solution(str1, str2) {
const convertArray = (str) => {
str = str.toLowerCase();
const arr = [];
for (let i = 0; i < str.length - 1; i++) {
const [char1, char2] = [str[i], str[i + 1]];
if (isAlphabet(char1) && isAlphabet(char2)) {
arr.push(char1 + char2);
}
}
return arr;
};
const isAlphabet = (char) => {
return char.charCodeAt() >= 97 && char.charCodeAt() <= 122;
};
const [A, B] = [convertArray(str1), convertArray(str2)];
if (!A.length && !B.length) {
return 2 ** 16;
}
let union = 0, intersection = 0;
const findAndRemove = (el) => {
const index = B.indexOf(el);
if (index != -1) {
B.splice(index, 1);
return true;
}
return false;
};
A.forEach(el => {
if (findAndRemove(el)) {
intersection++;
}
});
union = A.length + B.length;
return Math.floor((intersection / union) * (2 ** 16));
}
js ver 1.1
function solution(str1, str2) {
const convertArray = str => [...str.toLowerCase()].map((_, i, arr) =>
isAlphabet(arr[i]) && isAlphabet(arr[i + 1])
? arr[i] + arr[i + 1]
: '')
.filter(Boolean);
const isAlphabet = char => char?.charCodeAt() >= 97 && char?.charCodeAt() <= 122;
const [A, B] = [convertArray(str1), convertArray(str2)];
if (!A.length && !B.length) {
return 65536;
}
const [intersection, union] = [A.filter(el => B.includes(el) && B.splice(B.indexOf(el), 1)).length, A.length + B.length];
return Math.floor((intersection / union) * (65536));
}