https://programmers.co.kr/learn/courses/30/lessons/17677
// 1) str1과 str2를 먼저 두글자씩 끊어서 다중집합의 원소로 만들고 해당 원소들을 배열에 담아둔다.
// 1-1) map을 활용해 n+1인덱스를 더하도록 한다.
// 2) 두 배열에서 특수문자가 포함된 경우들을 모두 제외하고, 모두 소문자로 만든다.
// 3) 합집합과 교집합을 계산해, 유사도를 출력한다.
// 3-1) 두 배열을 모두 객체로 변환한다. 교집합은 공통된 것들을 모으고, 합집합은 전체를 다 모으고!
// 이 때 공통된 것들은 교집합의 경우 더 작은 수, 합집합은 큰 수로!
function solution(str1, str2) {
let alpha = "abcdefghijklmnopqrstuvwxyz"
let str1Arr = str1.split("").map(letter => letter.toLowerCase());
let str2Arr = str2.split("").map(letter => letter.toLowerCase());
let str1MultiSets = str1Arr.map((letter, index) => letter + str1Arr[index + 1]).slice(0, str1Arr.length - 1).filter(el => el.split("").every(el => alpha.includes(el)));
let str2MultiSets = str2Arr.map((letter, index) => letter + str2Arr[index + 1]).slice(0, str2Arr.length - 1).filter(el => el.split("").every(el => alpha.includes(el)));
let str1Obj = {};
let str2Obj = {};
str1MultiSets.forEach(el => str1Obj[el] ? str1Obj[el]++ : str1Obj[el] = 1);
str2MultiSets.forEach(el => str2Obj[el] ? str2Obj[el]++ : str2Obj[el] = 1);
let intersection = {};
let union = JSON.parse(JSON.stringify(str2Obj));
Object.keys(str1Obj).forEach(el => {
if(str2Obj[el]){
intersection[el] = Math.min(str1Obj[el], str2Obj[el]);
union[el] = Math.max(str1Obj[el], str2Obj[el])
} else {
union[el] = str1Obj[el];
}
})
let intersectionNum = 0;
let unionNum = 0;
Object.keys(intersection).forEach(key => intersectionNum += intersection[key])
Object.keys(union).forEach(key => unionNum += union[key])
if(unionNum === 0) return 65536;
return Math.floor(intersectionNum / unionNum * 65536);
}
function solution (str1, str2) {
function explode(text) {
const result = [];
for (let i = 0; i < text.length - 1; i++) {
const node = text.substr(i, 2);
if (node.match(/[A-Za-z]{2}/)) {
result.push(node.toLowerCase());
}
}
return result;
}
const arr1 = explode(str1);
const arr2 = explode(str2);
const set = new Set([...arr1, ...arr2]);
let union = 0;
let intersection = 0;
set.forEach(item => {
const has1 = arr1.filter(x => x === item).length;
const has2 = arr2.filter(x => x === item).length;
union += Math.max(has1, has2);
intersection += Math.min(has1, has2);
})
return union === 0 ? 65536 : Math.floor(intersection / union * 65536);
}
if (node.match(/[A-Za-z]{2}/))
정규표현식을 학습하자!(+Match 함수!)new Set([...arr1, ...arr2]);
set 객체! 배열의 중복 요소 삭제 가능!