모든 아나그램 찾기

minho·2022년 2월 28일
0

문제

나의 코드

//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);

해결과정

  1. str2의 map1을 구한다.
  2. str1의 map2을 구한다.
    • 이때 str2.length -1 만큼만 요소를 map에 집어넣는다.
  3. loop를 통해 str1의 char들을 map2에 넣어준다.
    • map1과 map2를 비교한다.
      만약 map1의 key와 value가 모두 일치하면 tmp = true
      만약 map1의 key와 value가 하나라도 일치하지 않으면 tmp = false 그리고 loop를 탈출한다.
    • map2에서 str1[lt](lt는 0부터)를 빼준다.
      만약 key가 str1[lt]가 있다면 value를 -1해준다.
      이때 value가 0이되면 해당 key를 삭제한다.

수정코드

//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);

map에 대한 자세한 정보(set,map,object)

출처: https://velog.io/@proshy/JSSet-Map-Object-정리

	
profile
Live the way you think

0개의 댓글