//input
let str1 = "bacaAacba";
let str2 = "abc";
let map1 = new Map();
let map2 = new Map();
let answer = 0;
let lt = 0;
let num = 0;
// 각 char의 개수 구하기
function mapping(map, i) {
if (map.has(i)) map.set(i, map.get(i) + 1);
else map.set(i, 1);
return map;
}
// str2의 map
for (let x of str2) {
map1 = mapping(map1, x);
}
// str1의 map
for (let y of str1) {
map2 = mapping(map2, y);
num++;
if (num === str2.length - 1) break; // str2.length-1 까지만 만들어 다음에 더할때 str2.length와 같게한다.
}
for (let rt = num; rt < str1.length; rt++) {
// map2에 str1[lt]를 넣어줌
let RT = str1[rt];
if (map2.has(RT)) map2.set(RT, map2.get(RT) + 1);
else map2.set(RT, 1);
console.log("map2:", map2);
// map1과 map2를 비교
let tmp = true;
for (let [key, value] of map1) {
if (!map2.has(key) || map2.get(key) !== value) {
tmp = false;
break;
}
}
if (tmp === true) answer++;
// map2에서 str1[lt]를 빼줌
let LT = str1[lt++];
if (map2.get(LT) - 1 === 0) map2.delete(LT);
else map2.set(LT, map2.get(LT) - 1);
}
console.log(answer);
//input
let str1 = "bacaAacba";
let str2 = "abc";
let sH = new Map();
let tH = new Map();
let answer = 0;
let lt = 0;
// 각 char의 개수 구하기
function mapping(map, i) {
if (map.has(i)) map.set(i, map.get(i) + 1);
else map.set(i, 1);
return map;
}
// sH와 tH비교함수
function compareMaps(map1, map2) {
for (let [key, value] of map2) {
if (!map1.has(key)) return false;
if (map1.get(key) !== value) return false;
}
return true;
}
// str2의 map
for (let x of str2) {
tH = mapping(tH, x);
}
// str1의 map
let len = str2.length - 1;
for (let i = 0; i < len; i++) {
sH = mapping(sH, str1[i]);
}
for (let rt = len; rt < str1.length; rt++) {
// map2에 str1[lt]를 넣어줌
sH = mapping(sH, str1[rt]);
// map1과 map2를 비교
if (compareMaps(sH, tH)) answer++;
// map2에서 str1[lt]를 빼줌
let LT = str1[lt++];
sH.set(LT, sH.get(LT) - 1);
if (sH.get(LT) === 0) sH.delete(LT);
}
console.log(answer);
출처: https://velog.io/@proshy/JSSet-Map-Object-정리