❗ -> ❓❗ 모든 아나그램 : Hash Map, Sliding Window, Two Pointers

frenchkebab·2021년 8월 24일
0
post-thumbnail

내 풀이

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(); // s의 부분문자열 map
  let map2 = new Map(); // t의 전체문자열 map

  // t를 map으로 변환
  for (let x of t) {
    if (!map2.has(x)) map2.set(x, 1);
    else map2.set(x, map2.get(x) + 1);
  }

  // s의 앞 k개를 map으로
  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 비교 함수 구현
profile
Blockchain Dev Journey

0개의 댓글