풀이 과정
- 주어진 문자열을 2글자씩 잘라서 배열 만들기:
slice()
, push()
이때 영문이 아닌 문자가 섞여 있으면 제외
영문자는 모두 대문자로 변환
- 1의 두 배열을 합해서 중복을 제거한 배열 생성:
concat()
, Set()
이때 결과의 길이가 0이면 유사도는 1 => 결과 리턴
- 2번 배열의 각 요소에 대해 반복
- 현재 요소가 1번의 두 배열에 있는 개수 세기:
filter()
- 두 수 중 작은 수만큼 교집합 문자열에, 큰 수만큼 합집합 문자열에 추가:
Math.min()
, Math.max()
, repeat()
- 결과 구하기:
교집합 길이 / 합집합 길이
코드
const N = 65536;
function solution(str1, str2) {
const arr1 = sliceStr(str1);
const arr2 = sliceStr(str2);
const arr = Array.from(new Set(arr1.concat(arr2)));
if (!arr.length) return N;
let inter = '';
let union = '';
for (const e of arr) {
const cnt1 = countElement(arr1, e);
const cnt2 = countElement(arr2, e);
inter = inter + e.repeat(Math.min(cnt1, cnt2));
union = union + e.repeat(Math.max(cnt1, cnt2));
}
return Math.trunc((inter.length / union.length) * N);
}
function sliceStr(str) {
const arr = [];
for (let i = 0; i < str.length - 1; ++i) {
const tmp = [...str]
.slice(i, i + 2)
.join('')
.toUpperCase();
if (!/^[A-Z]*$/g.test(tmp)) continue;
arr.push(tmp);
}
return arr;
}
function countElement(arr, el) {
return arr.filter((c) => c === el).length;
}