function union(mul1,mul2){
let idx, ret = [];
mul1.forEach((m1)=>{
idx = mul2.findIndex(m2=>m1===m2);
if(idx!==-1){//포함되어 있으면
mul2.splice(idx,1);//제거
}
ret.push(mul2[idx]);//합집합에 추가하
})
mul2.forEach((m2)=>{
ret.push(m2);//mul2에 남아있는 요소 합집합에 추가
})
return ret;
}
function intersection(mul1,mul2){
let mul2Copy, idx, ret = [];
mul2Copy = [...mul2];
mul1.forEach((m1)=>{
idx = mul2Copy.findIndex(m2=>m1===m2);
if(idx!==-1){//포함되어 있으면
ret.push(mul2[idx]);//교집합에 추가하고
mul2Copy.splice(idx,1);//제거
}
})
return ret;
}
function makeMultiset(str){//다중집합
let target, flag, ret=[];
for(let i=0; i<str.length; i++){
target = str.slice(i,i+2);//2글자씩 끊는다.
flag = true;
if(target.length!==2) flag= false;//길이가 2가 아닐때
for(let j=0; j<target.length ; j++){
if("a"> target[j] || "z" <target[j]){//영문자가 아닐때
flag = false;
}
}
if(flag) ret.push(target);//조건에 부합하면 push
}
return ret;
}
function solution(str1, str2) {
let answer = 0;
str1 = str1.toLowerCase();
str2 = str2.toLowerCase();
const mul1 = makeMultiset(str1);
const mul2 = makeMultiset(str2);
const iLen = intersection(mul1,mul2).length;
const uLen = union(mul1,mul2).length;
if(iLen ===0 && uLen===0){
return 65536;
}
answer = Math.floor((iLen/uLen)*65536);
return answer;
}
구현문제 였다.
매개변수로 배열을 전달할 때 참조값이 전달된다는 것을 간과해서 문제가 생겼다. splice 함수는 배열을 실제로 변경하기 때문에 전달한 배열을 복사한 뒤 사용해서 원본에 손상이 없도록 했다.