Algorithm/์ธํ”„๋Ÿฐ(inflearn)

[JavaScript/section 5] 08 - ๋ชจ๋“  ์•„๋‚˜๊ทธ๋žจ ์ฐพ๊ธฐ

_์„ฑํ˜ธ_ 2022. 9. 22. 13:47
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ“Œ 08 - ๋ชจ๋“  ์•„๋‚˜๊ทธ๋žจ ์ฐพ๊ธฐ(ํ•ด์‰ฌ, ํˆฌํฌ์ธํ„ฐ, ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ)

S๋ฌธ์ž์—ด์—์„œ T๋ฌธ์ž์—ด๊ณผ ์•„๋‚˜๊ทธ๋žจ์ด ๋˜๋Š” S์˜ ๋ถ€๋ถ„๋ฌธ์ž์—ด์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ž์ด๋‹ค.

๋‚˜์˜ ํ’€์ด ๋ฐฉ๋ฒ•

์•„๋‚˜๊ทธ๋žจ์ด ๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ํ•ด์‰ฌ์˜ ํŠน์ง•์„ ์‚ฌ์šฉํ–ˆ๊ณ , ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ๋ฐฉ์‹๊ณผ slice() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค. ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ๋‚˜์„œ ์ž˜ ํ’€์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ.. ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ๋ณด๋‹ˆ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ๊ตฌํ•˜๋Š” ๋ถ€๋ถ„์— ์žˆ์–ด์„œ ์ด์ค‘ for ๋ฌธ์„ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํšจ์œจ์„ฑ(์‹œ๊ฐ„ ๋ณต์žก๋„) ์ธก๋ฉด์—์„œ๋Š” ์ข‹์ง€ ์•Š๋‹ค๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

  • for ๋ฌธ์„ ๋Œ๊ธฐ ์ „์— t์˜ ํ•ด์‰ฌ ๊ฐ’์„ ๊ตฌํ•œ๋‹ค.
  • for ๋ฌธ์„ ๋Œ๋ฉด์„œ s๋ฌธ์ž์—ด์— slice() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ i ๋ฒˆ์งธ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ t๋ฌธ์ž์—ด ๊ธธ์ด + i ์ „๊นŒ์ง€๋ฅผ ์ž˜๋ผ์ค€ ํ›„ str ๋ณ€์ˆ˜์— ์ €์žฅํ•œ๋‹ค. (๋ถ€๋ถ„ ๋ฌธ์ž์—ด์„ ๊ตฌํ•˜๋Š” ๊ณผ์ •)
  •  str์˜ ํ•ด์‰ฌ ๊ฐ’์„ ๊ตฌํ•œ๋‹ค.
  • compareMaps ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด t๋ฌธ์ž์—ด๊ณผ s์˜ ๋ถ€๋ถ„๋ฌธ์ž์—ด์ด anagram์ด ๋งž๋Š”์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค.
  • sH๋ฅผ clear() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์ดˆ๊ธฐํ™” ํ•ด์ค€๋‹ค. 

๐Ÿ‘ ๊ฐ•์‚ฌ๋‹˜ ํ’€์ด ๋ฐฉ๋ฒ•

๋ถ€๋ถ„ ๋ฌธ์ž์—ด ๊ตฌํ•˜๋Š” ๋ฐฉ์‹์—์„œ ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ์™€ ํˆฌ ํฌ์ธํ„ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ’€์ด ํ•ด์ฃผ์…จ๋‹ค.๐Ÿ˜€

์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(N)์ด๊ธฐ ๋•Œ๋ฌธ์— slice() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ–ˆ์„ ๋•Œ๋ณด๋‹ค ํšจ์œจ์„ฑ ์ธก๋ฉด์—์„œ ๋” ์ข‹์€ ํ’€์ด ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

  • ์ดˆ๊ธฐ์— ์œˆ๋„์šฐ๋ฅผ ์„ธํŒ…ํ•˜๊ธฐ ์œ„ํ•ด์„œ 0๋ถ€ํ„ฐ t๋ฌธ์ž์—ด ๊ธธ์ด - 1๊นŒ์ง€ s์˜ ๋ถ€๋ถ„๋ฌธ์ž์—ด์˜ ํ•ด์‰ฌ ๊ฐ’์„ ๊ตฌํ•œ๋‹ค.
  • ํฌ์ธํ„ฐ rt๋Š” t๋ฌธ์ž์—ด์˜ ๊ธธ์ด -1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๋๊นŒ์ง€ for ๋ฌธ์„ ๋Œ๋ฉด ๋œ๋‹ค. t๋ฌธ์ž์—ด์˜ ๊ธธ์ด -1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ์ด์œ ๋Š” ์œ„์—์„œ ์œˆ๋„์šฐ๋ฅผ ๋ฏธ๋ฆฌ ์„ธํŒ…ํ•ด๋†จ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ํฌ์ธํ„ฐ rt๊ฐ€ ํ•œ ์นธ์”ฉ ์ด๋™ํ•˜๋ฉด์„œ ํ˜„์žฌ ํ•ด์‰ฌ ๊ฐ’์„ ๊ตฌํ•œ๋‹ค. 
  • compareMaps ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด t๋ฌธ์ž์—ด๊ณผ s์˜ ๋ถ€๋ถ„๋ฌธ์ž์—ด์ด anagram์ด ๋งž๋Š”์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค.
  • ๊ฒ€์‚ฌ๊ฐ€ ๋๋‚˜๋ฉด ํฌ์ธํ„ฐ lt์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์˜ value๋ฅผ -1 ํ•ด์ค€๋‹ค. ์ด ๋•Œ value๊ฐ€ 0์ด๋ผ๋ฉด delete()ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด Map ๊ฐ์ฒด์—์„œ ์‚ญ์ œํ•œ๋‹ค.
  • ํฌ์ธํ„ฐ lt๋ฅผ 1 ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

 

๐Ÿ“ ํ’€์ด

// ๋‚˜์˜ ํ’€์ด ๋ฐฉ๋ฒ•
function compareMaps(map1, map2) {
  if (map1.size !== map2.size) return false;
  for (let [key, value] of map1) {
    if (!map2.has(key) || map2.get(key) !== value) return false;
  }
  return true;
}

function solution(s, t) {
  let answer = 0;
  let sH = new Map();
  let tH = new Map();

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

  let str = '';
  let tlen = t.length;
  let slen = s.length;

  for (let i = 0; i < slen - 2; i++) {
    sH.clear();
    str = s.slice(i, i + tlen);

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

    if (compareMaps(sH, tH)) answer++;
  }

  return answer;
}

let a = 'bacaAacba';
let b = 'abc';
console.log(solution(a, b));
// ๊ฐ•์‚ฌ๋‹˜ ํ’€์ด ๋ฐฉ๋ฒ•
function compareMaps(map1, map2) {
  if (map1.size !== map2.size) return false;
  for (let [key, value] of map1) {
    if (!map2.has(key) || map2.get(key) !== value) return false;
  }
  return true;
}

function solution(s, t) {
  let answer = 0;
  let sH = new Map();
  let tH = new Map();

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

  let len = t.length - 1;
  for (let i = 0; i < len; i++) {
    if (sH.has(s[i])) sH.set(s[i], sH.get(s[i]) + 1);
    else sH.set(s[i], 1);
  }

  let lt = 0;
  for (let rt = len; rt < s.length; rt++) {
    if (sH.has(s[rt])) sH.set(s[rt], sH.get(s[rt]) + 1);
    else sH.set(s[rt], 1);

    if (compareMaps(sH, tH)) answer++;
    sH.set(s[lt], sH.get(s[lt]) - 1);
    if (sH.get(s[lt]) === 0) sH.delete(s[lt]);
    lt++;
  }

  return answer;
}

let a = 'bacaAacba';
let b = 'abc';
console.log(solution(a, b));