๐ 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));
'Algorithm > ์ธํ๋ฐ(inflearn)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JavaScript/section 6] 02 - ๊ดํธ๋ฌธ์์ ๊ฑฐ (0) | 2022.09.23 |
---|---|
[JavaScript/section 6] 01 - ์ฌ๋ฐ๋ฅธ ๊ดํธ (0) | 2022.09.23 |
[JavaScript/section 5] 07 - ์๋๊ทธ๋จ (0) | 2022.09.21 |
[JavaScript/section 5] 06 - ํ๊ธ ํ์ฅ (0) | 2022.09.21 |
[JavaScript/section 5] 05 - ์ต๋ ๋งค์ถ (0) | 2022.09.20 |