๐ section05 - 8 - ๋ชจ๋ ์๋๊ทธ๋จ ์ฐพ๊ธฐ
S ๋ฌธ์์ด์์ T๋ฌธ์์ด๊ณผ ์๋๊ทธ๋จ์ด ๋๋ S์ ๋ถ๋ถ ๋ฌธ์์ด์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค. ๋ฌธ์ ๊ฐ ์กฐ๊ธ ์ด๋ ค์ธ ์ ์๋๋ฐ, ์๊ตฌ์ฌํญ์ ํ๋์ฉ ๊ตฌํํ๋ฉด ๋๋ค. ์ด์ ๊น์ง ์๋๊ทธ๋จ ๋ฌธ์ ๋ฅผ ํ ๋๋ hash์ ํน์ง์ ์ฌ์ฉํ๊ณ , ๋ถ๋ถ ๋ฌธ์์ด์ ๊ตฌํ๋ ๋ฐฉ์์ slidingWindow์ ์ด์ฉํ์ฌ ํ์๋ค. ์ฌ๊ธฐ์ ์ธ๋ฑ์ค ๊ด๋ฆฌ๋ฅผ ์ํด twoPointer ๋ฐฉ์๋ง ์ ์ฉํด์ฃผ๋ฉด ๋๋ค.
๋๋ while๋ฌธ์ ์ฌ์ฉํด์ ํ์๋๋ฐ, ์ฌ๋ฐ๋ฅธ ๋ฐฉํฅ์ผ๋ก ํ์๋์ง ๊ถ๊ธํด์ ์ง๋ฌธ์ ๋จ๊ฒผ๋๋ ์ ์๋๊ป์ ์นญ์ฐฌํด์ฃผ์
จ๋ค.( โบ๏ธ โบ๏ธ ) ์ด๊ฒ๋ณด๋ค ๋ ์งง์ ์ฝ๋๋ก ์ง๊ณ ์ถ๋ค๋ ์๊ฐ์ด ๋ค์๋ค.

๋๋ ์ด๋ ๊ฒ ํ์๋ค.
1. ํฌ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํด rt++๊ฐ ๋๋ฉด์ sum์ ๊ตฌํ๋ค.
2. sum์ ๊ธธ์ด๊ฐ m๊ณผ ๋์ผํ๋ฉด ์ฌ๊ธฐ์ hash๊ฐ์ ๊ตฌํ๋ค.
3. sHash๊ฐ๊ณผ t๋ฅผ ๋น๊ตํ์ฌ anagram์ด ๋ง๋์ง ๊ฒ์ฌํ๊ณ flag๋ฅผ ํตํด ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๋ค. true | false
4. flag๊ฐ true๋ฉด cnt++
5. sum์ ๊ธธ์ด๊ฐ t.length๋ณด๋ค ์ปค์ง๋ฉด ๊ทธ๋ lt์ ๊ฐ์ ๋นผ์ค๋ค.(๋นผ์ฃผ๋ ๊ณผ์ ์ slice๋ฅผ ์ด์ฉํจ)
์ฝ๋๋ฅผ ์ง๊ณ ๋ณด๋๊น while๋ฌธ ๋ง๋ค for๋ฌธ์ด ๋ ๋ฒ ๋๊ณ slice๊ณผ์ ๊น์ง ๊ฑฐ์น๋ฏ๋ก ์๊ฐ ๋ณต์ก๋๊ฐ ๊ฝค ๋์ฌ ๊ฒ ๊ฐ์๋ค. ๊ทธ๋ผ, while๋ฌธ ๋ฐ์์ ๋ฏธ๋ฆฌ hash๊ฐ์ ์ ์ธํ๋ฉด ์ด๋จ๊น? ์ ์๋๊ป์๋ ์ด๋ ๊ฒ ํธ์
จ๋ค.
1. for ์ ์ m-1๊น์ง sum์ ๊ตฌํ๋ค.(์ดํ while๋ฌธ์์ sum ๊ฐ์ ๊ตฌํจ)
2. for ์ ์ t์ hash๊ฐ์ ๊ตฌํ๋ค.
3. rt๋ฅผ ๋๋ฉด์ ํ์ฌ hash๊ฐ์ ๊ตฌํ๋ค.
4. compareAnagram ํจ์๋ฅผ ๋๋ฉด์ anagram์ด ๋ง๋์ง ๊ฒ์ฌํ๋ค.
5. ์ดํ lt๊ฐ์ value๋ฅผ 1์ฉ ๋นผ์ฃผ๊ณ , ๋ง์ฝ tH.get(value) === 0์ด๋ฉด, delete(key) ํด์ค๋ค. 0์ด ๋ ๋ key๋ ๋ ์ด์ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค. (ํ์ฌ lt๋ t.length-3๋ฒ์งธ ์์นํ๋ค.)
// ๋ด ์ฝ๋
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;
}
// ๊ฐ์์ฝ๋
let s = "bacaAacba";
let t = "abc"
function compareAnagram(sH, tH) {
if (sH.size !== tH.size) return false;
for (let [key, value] of tH) {
if (!sH.has(key)) return false;
if (sH.get(key) !== value) return false;
}
return true;
}
console.log(solution(s, t));
function solution(s, t) {
let n = s.length;
let m = t.length;
let cnt = lt = 0;
let sH = new Map();
let tH = new Map();
for (let i = 0; i < m - 1; i++) {
if (sH.has(s[i])) sH.set(s[i], sH.get(s[i]) + 1);
else sH.set(s[i], 1);
}
for (let x of t) {
if (tH.has(x)) tH.set(x, tH.get(x) + 1);
else tH.set(x, 1);
}
for (let rt = m - 1; rt < n; rt++) {
if (sH.has(s[rt])) sH.set(s[rt], sH.get(s[rt]) + 1);
else sH.set(s[rt], 1);
if (compareAnagram(sH, tH)) cnt++;
sH.set(s[lt], sH.get(s[lt]) - 1);
if (sH.get(s[lt]) === 0) sH.delete(s[lt]);
lt++;
}
return cnt;
}
๋๊ธ