
내 풀이
function map_comp(map1, map2) {
if (map1.size !== map2.size) return false;
for (let [key, val] of map2) {
if (map1.get(key) !== map2.get(key)) return false;
}
return true;
}
function solution(s, t) {
let answer = 0;
let len = t.length;
let map1 = new Map();
let map2 = new Map();
for (let x of t) {
if (!map2.has(x)) map2.set(x, 1);
else map2.set(x, map2.get(x) + 1);
}
for (let i = 0; i < len; i++) {
if (!map1.has(s[i])) map1.set(s[i], 1);
else map1.set(s[i], map1.get(s[i]) + 1);
}
if (map_comp(map1, map2)) answer++;
for (let i = len; i < s.length; i++) {
if (map1.get(s[i - len]) === 1) map1.delete(s[i - len]);
else map1.set(s[i - len], map1.get(s[i - len]) - 1);
if (!map1.has(s[i])) map1.set(s[i], 1);
else map1.set(s[i], map1.get(s[i]) + 1);
console.log(map1, map2);
if (map_comp(map1, map2)) answer++;
}
return answer;
}
let a = 'bacaAacba';
let b = 'abc';
console.log(solution(a, b));
- for 문 안에서 한번에 싹 처리를 못하나 고민하다가 그 위에 첫 번째는 따로 빼줬다.
- map 비교 알고리즘에서 조건이 하나 빠진 것 같다..
solution 풀이
function compareMaps(map1, map2) {
if (map1.size !== map2.size) return false;
for (let [key, val] of map1) {
if (!map2.has(key) || map2.get(key) !== val) return false;
}
return true;
}
function solution(s, t) {
let answer = 0;
let map1 = new Map();
let map2 = new Map();
for (let x of t) {
if (map2.has(x)) map2.set(x, map2.get(x) + 1);
else map2.set(x, 1);
}
let len = t.length - 1;
console.log(len);
for (let i = 0; i < len; i++) {
if (map1.has(s[i])) map1.set(s[i], map1.get(s[i]) + 1);
else map1.set(s[i], 1);
}
console.log(map1);
let l = 0;
for (let r = len; r < s.length; r++) {
if (map1.has(s[r])) map1.set(s[r], map1.get(s[r]) + 1);
else map1.set(s[r], 1);
if (compareMaps(map1, map2)) answer++;
map1.set(s[l], map1.get(s[l]) - 1);
if (map1.get(s[l]) === 0) map1.delete(s[l]);
l++;
}
return answer;
}
let a = 'bacaAacba';
let b = 'abc';
console.log(solution(a, b));
- 2개만 넣어주고 빼고 -> for문 돌리고 넣어주고 ... 이런 식으로
내 방식처럼 for문 위에 첫 번째를 따로 안돌려 주어도 됨
- 굳이 Two Pointers를 해줘야 하는건 아닌 것 같다.
배운 점
- Sliding Window 넣고 빼는 순서
map
비교 함수 구현