๐ 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;
}
๋๊ธ