https://programmers.co.kr/learn/courses/30/lessons/17677#
function makeArr(str){
const arr=[];
for(let i=0; i<str.length-1; i++){
const tmp=str.substr(i, 2);
if (tmp.match(/[A-Za-z]{2}/)) {
arr.push(tmp.toLowerCase());
}
}
return arr;
}
function solution(str1, str2) {
//각각의 집합
const arr1=makeArr(str1);
const arr2=makeArr(str2);
const set=new Set([...arr1, ...arr2]);
let union=0, inter=0;
set.forEach(item => {
const arr1Cnt=arr1.filter(v=>v===item).length;
const arr2Cnt=arr2.filter(v=>v===item).length;
inter+=Math.min(arr1Cnt, arr2Cnt);
union+=Math.max(arr1Cnt, arr2Cnt);
});
return union===0? 65536:parseInt(inter/union*65536);
}
와... 이문제는 만만하게 봤다가 큰코닥친 문제다. 엄청 쉬울것같았는데, 계속해서 막혔다.
각각집합 구하는건 쉬웠는데, 교집합은 min으로 처리해줘야하고 합집합은 max로 처리해주는거에서 막혔다.
교집합, 합집합 겨우 구현했더니 처음에 쉽다고 구현해낸 집합처리가 제대로 안됐나보다. 테스트케이스가 잘 작동하지 않았다.
난 처음부터 str1, str2에서 영어가 아닌걸 모두 제외하고 소문자로 모두 바꾼 후 시작했는데, 이렇게 하면 안됐다. (str1=str1.replace(/[^a-z]/g, '').toLowerCase()
처럼)
이렇게 하면 '기타 공백이나 숫자, 특수 문자가 들어있는 경우는 그 글자 쌍을 버린다.'의 조건을 만족하지 못한다.
예를들어 E=M*C^2의 사례에서 위처럼 모두 제외한 후에 집합을 만들면 emce->{em,mc,ce}이지만 사실상 조건에 따라 두개씩 짝지었을 때 기호에 모두 걸리기때문에 집합은 {}, 즉 공집합이 된다.
'집합 A와 집합 B가 모두 공집합일 경우에는 나눗셈이 정의되지 않으니 따로 J(A, B) = 1로 정의한다.'을 만족하기 위해 합집합이 0일때(즉, 두집합이 공집합일때) 1(자카드유사도)*65536을 리턴해준다.
쉽다고 만만하게 보면 안된다! 풀면서 키보드 부수고 싶은 문제였지만🤣 이문제를 통해 많이 배운 것 같다.
🔥문제를 풀기전에 문제 파악부터 제대로 하자!
🔥제한사항을 잘 읽자!