https://programmers.co.kr/learn/courses/30/lessons/17677
나는 실제로 합집합과 교집합을 만든다음 갯수를 세서 풀었는데, 다른 사람의 풀이를 보고 굳이 그렇게 안해도 됨을 깨달았다. set 를 만들어서 각 두 문자열의 원소를 넣은 다음, min 과 max 를 써서 각각의 교집합, 합집합 변수에 더해주면 되는 일이었다.
function solution(str1, str2) {
function expand(str){
let arr = [];
str = str.toUpperCase();
for (let i = 0; i < str.length-1; i++){
let el = str[i]+str[i+1];
if (/[^A-Z]/g.test(el)) continue;
arr.push(el)
}
return arr;
}
let arr1 = expand(str1)
let arr2 = expand(str2)
let intersect = 0, union = 0;
let set = new Set([...arr1, ...arr2])
for (let x of set){
let count1 = arr1.filter(e => e === x).length;
let count2 = arr2.filter(e => e === x).length;
intersect += Math.min(count1, count2); // 작은건 교집합
union += Math.max(count1, count2); // 큰건 합집합
}
//console.log(intersect, union)
if (!intersect && !union) return 65536
return Math.floor((intersect / union) * 65536)
}