인프런 커뮤니티 질문&답변

안영우1님의 프로필 이미지

작성한 질문수

자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)

8. 모든 아나그램 찾기(Hash & Sliding Window && Two Pointers Algorithm)

`while`문으로 풀어봤습니다.

해결된 질문

21.08.27 09:30 작성

·

175

1

안녕하세요 선생님! 매번 질 좋은 강의 해주셔서 감사합니다. 다름이 아니라 강의 코드와는 다르게 `while`문으로 투포인터를 이용했는데 다음과 같은 코드도 괜찮은 코드인지 여쭤보고 싶습니다!

let s = "bacaAacba";
let t = "abc";

console.log(solution(s, t));

function solution(s, t) {
  let n = s.length;
  let m = t.length;

  let sum = "";
  let lt = rt = cnt = 0;

  while (rt < n) {
    sum += s[rt];

    if (rt - lt + 1 >= m) {
      let sH = new Map();
      let temp = sum;
      let flag = true;

      for (let x of temp) {
        if (sH.has(x)) sH.set(x, sH.get(x) + 1);
        else sH.set(x, 1);
      }

      for (x of t) {
        if (!sH.has(x) || sH.get(x) === 0) flag = false;
        sH.set(x, sH.get(x) - 1);
      }
      if (flag) cnt++;
      sum = sum.slice(1);
      lt++;
    }
    rt++;
  }
  return cnt;
}

답변 1

0

김태원님의 프로필 이미지
김태원
지식공유자

2021. 08. 27. 13:32

안녕하세요^^

스스로 이정도 코드를 짠 것도 대단하신 겁니다.

아래 코드는 O(n)으로 짠 코드이니 분석해보세요. 개선코드영상을 빨리 찍어야 겠네요.

function solution(s, t){
    let answer=0;
    let sH = new Map();
    for(let x of t){
        sH.set(x, (sH.get(x) || 0)-1);
    }
    let len=t.length-1;
    for(let i=0; i<len; i++){
        sH.set(s[i], (sH.get(s[i]) || 0)+1);
        if(sH.get(s[i])===0) sH.delete(s[i]);
    }
    let lt=0;
    for(let rt=len; rt<s.length; rt++){
        sH.set(s[rt], (sH.get(s[rt]) || 0)+1);
        if(sH.get(s[rt])===0) sH.delete(s[rt]);
        if(sH.size===0) answer++;
        sH.set(s[lt], (sH.get(s[lt]) || 0)-1);
        if(sH.get(s[lt])===0) sH.delete(s[lt]);
        lt++;
    }
    return answer;
}
console.log(solution("bacacbcba", "abc"));

안영우1님의 프로필 이미지
안영우1
질문자

2021. 08. 27. 17:54

감사합니다 선생님.