728x90
문제
https://school.programmers.co.kr/learn/courses/30/lessons/17677
코드
function solution(str1, str2) {
str1 = str1.toUpperCase();
str2 = str2.toUpperCase();
const strToSet = (str) => {
let set = [];
for (let i = 1; i < str.length; i++) {
if (/^[a-z|A-Z]+$/.test(str[i - 1]) && /^[a-z|A-Z]+$/.test(str[i])) {
set.push(str[i - 1] + str[i]);
}
}
return set;
};
const jaccard = (arr1, arr2) => {
let similarity = 0;
// arr1, arr2 모두 공집합이면 J(A, B) = 1
if (arr1.length === 0 && arr2.length === 0) similarity = 1;
else {
let union = []; // 합집합
let intersection = []; // 교집합
for (let i = 0; i < arr2.length; i++) {
// arr2의 각 요소에 대해 arr1에도 존재한다면
if (arr1.indexOf(arr2[i]) >= 0) {
// 교집합에 해당 요소 넣고 arr1에서 해당 요소 삭제
intersection.push(arr1.splice(arr1.indexOf(arr2[i]), 1));
}
// 합집합에 arr2의 요소 모두 넣기
union.push(arr2[i]);
}
// 합집합에 교집합에서 삭제된 요소 외의 arr1의 요소 모두 넣기
for (let i = 0; i < arr1.length; i++) {
union.push(arr1[i]);
}
similarity = intersection.length / union.length;
}
return similarity;
};
let set1 = strToSet(str1);
let set2 = strToSet(str2);
let answer = jaccard(set1, set2);
return parseInt(answer * 65536);
}
후기
- 입력으로 받는 문자열을 집합으로 묶는 함수와, 자카드 유사도를 return하는 함수 두개를 만들어 코드를 짰다. 다른 부분은 쉽게 코드를 짰지만 다중집합에서의 합집합, 교집합을 구하는 데는 생각의 시간이 조금 필요했다.
잘못된 내용이나 수정이 필요한 내용이 있으면 언제든 댓글 달아주세요 감사합니다 😀
'알고리즘 > Programmers' 카테고리의 다른 글
[Programmers] 튜플 / JavaScript (0) | 2022.07.10 |
---|---|
[Programmers] 메뉴 리뉴얼 / JavaScript (0) | 2022.06.28 |
[Programmers] 멀쩡한 사각형 / JavaScript (0) | 2022.06.28 |
[Programmers] 비밀지도 / JavaScript (0) | 2022.02.10 |
[Programmers] 신고 결과 받기 / JavaScript (0) | 2022.02.10 |