const convertToHash = (arr) => {
const result = {};
for (let i = 0; i < arr.length - 1; i++) {
const letter = arr[i] + arr[i + 1];
if (letter.match(/[a-z]{2}/)) {
if (!result.hasOwnProperty(letter)) {
result[letter] = 1;
} else {
result[letter]++;
}
}
}
return result;
};
const intersectionLength = (hash1, hash2) => {
const result = [];
for (const key in hash1) {
if (hash2.hasOwnProperty(key)) {
const limit = Math.min(hash1[key], hash2[key]);
for (let i = 0; i < limit; i++) {
result.push(key);
}
}
}
return result.length;
};
const unionLength = (hash1, hash2) => {
const result = [];
for (const key in hash1) {
if (!hash2.hasOwnProperty(key)) {
for (let i = 0; i < hash1[key]; i++) {
result.push(key);
}
} else {
const limit = Math.max(hash1[key], hash2[key]);
for (let i = 0; i < limit; i++) {
result.push(key);
}
delete hash2[key];
}
}
for (const key in hash2) {
for (let i = 0; i < hash2[key]; i++) {
result.push(key);
}
}
return result.length;
};
const solution = (str1, str2) => {
const loweredStr1 = str1.toLowerCase();
const loweredStr2 = str2.toLowerCase();
const hashOfStr1 = convertToHash(loweredStr1);
const hashOfStr2 = convertToHash(loweredStr2);
if (
Object.keys(hashOfStr1).length == 0 &&
Object.keys(hashOfStr2).length == 0
) {
return 65536;
}
const answer = Math.floor(
(intersectionLength(hashOfStr1, hashOfStr2) /
unionLength(hashOfStr1, hashOfStr2)) *
65536
);
return answer;
};
정규표현식을 공부하긴 해야되겠는게, 여기서 정규표현식을 안쓰면 배열 안에 a부터 z까지 일일이 하드코딩으로 담고 또 includes메소드로 찾아야 함
별로 큰 변화는 아니지만 교집합과 합집합이 어차피 길이만 반환하기 때문에 아래와 같이 재구성해보았다.
const convertToHash = (arr) => {
const result = {};
for (let i = 0; i < arr.length - 1; i++) {
const letter = arr[i] + arr[i + 1];
if (letter.match(/[a-z]{2}/)) {
if (!result.hasOwnProperty(letter)) {
result[letter] = 1;
} else {
result[letter]++;
}
}
}
return result;
};
const intersectionLength = (hash1, hash2) => {
let count = 0;
for (const key in hash1) {
if (hash2.hasOwnProperty(key)) {
const limit = Math.min(hash1[key], hash2[key]);
count += limit;
}
}
return count;
};
const unionLength = (hash1, hash2) => {
let count = 0;
for (const key in hash1) {
if (!hash2.hasOwnProperty(key)) {
count += hash1[key];
} else {
const limit = Math.max(hash1[key], hash2[key]);
count += limit;
delete hash2[key];
}
}
for (const key in hash2) {
count += hash2[key];
}
return count;
};
const solution = (str1, str2) => {
const loweredStr1 = str1.toLowerCase();
const loweredStr2 = str2.toLowerCase();
const hashOfStr1 = convertToHash(loweredStr1);
const hashOfStr2 = convertToHash(loweredStr2);
if (
Object.keys(hashOfStr1).length == 0 &&
Object.keys(hashOfStr2).length == 0
) {
return 65536;
}
const answer = Math.floor(
(intersectionLength(hashOfStr1, hashOfStr2) /
unionLength(hashOfStr1, hashOfStr2)) *
65536
);
return answer;
};