ํด์, ํฌํฌ์ธํฐ, ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํด์ ํ์ด๋ณด๋ ๋ฌธ์
1. ๋ฌธ์
์ฃผ์ด์ง๋ ๋ฌธ์์ด์์ ์๋๊ทธ๋จ์ด ๋๋ ๋ถ๋ถ ๋ฌธ์์ด์ ๊ฐ์ ๊ตฌํ๊ธฐ.
๋ถ๋ถ๋ฌธ์์ด์ ์ฐ์๋ ๋ฌธ์์ด์ด๋ค.
์ ๋ ฅ์์ | ๋ฌธ์์ด bacaAacba, ๋ถ๋ถ ๋ฌธ์์ด abc
์ถ๋ ฅ์์ | 3
2. ์ ๊ทผ๋ฐฉ๋ฒ
์ฃผ์ด์ง ๋ถ๋ถ๋ฌธ์์ด๊ณผ ๋ฌธ์์ด์ ์ผ๋ถ(๋ถ๋ถ๋ฌธ์์ด์ length-1)๋ฅผ ๊ฐ์ฒด๋ก ๋ฐ๊พผ๋ค.
ํฌ์ธํฐ ์ง์ ์ ์ฐ์ด๋๊ณ for๋ฌธ์ผ๋ก ํ์นธ์ฉ ์ด๋ํ๋ฉด์ ๋ถ๋ถ๋ฌธ์์ด์ length๋งํผ์ ์๋ฆฌ๋ฅผ ๋น๊ตํ๋ค.
์๋๊ทธ๋จ์ด ์๋ ๊ฒฝ์ฐ ํฌ์ธํฐ๋ฅผ ๋ค์ ์ธ๋ฑ์ค๋ก ์ด๋์ํค๊ณ ,
์๋๊ทธ๋จ์ผ ๊ฒฝ์ฐ answer๋ฅผ ์นด์ดํ ํ๊ณ ๋ค์์ธ๋ฑ์ค๋ก ์ด๋์ํจ๋ค.
3. ํ์ด๋ฐฉ๋ฒ
1) answer์ ๊ฐ์๋ฅผ ์นด์ดํ ํด์ฃผ๊ธฐ์ํด์ 0์ผ๋ก ์ธํ ํ๋ค.
let answer = 0;
2) ์ฐพ์์ผํ๋ ์๋๊ทธ๋จ์ด ๋๋ ์ฐ์๋ ๋ถ๋ถ๋ฌธ์์ด์ด๊ธฐ ๋๋ฌธ์ ์ฃผ์ด์ง ๋ถ๋ถ๋ฌธ์์ด์ ์ํ๋ฒณ๊ณผ ๊ฐ์ ๊ฐ์ฒดํํ๋ก ๊ฐ์ง๊ณ ์์ด์ผํ๋ค. map ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ค.
let map1 = new Map();
let map2 = new Map();
for (let x of t) {
if (map2.has(x)) {
map2.set(x, map2.get(x) + 1);
} else {
map2.set(x, 1);
}
}
3) ๋ถ๋ถ๋ฌธ์์ด์ ํฌ๊ธฐ๋งํผ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ๊ธฐ๋ณธ ์ธํ ์ ํด์ค๋ค.
let len = t.length -1;
์ฃผ์ด์ง ๋ฌธ์์ด ์ค์์ ๊ฐ์ฅ ์์ 2๊ฐ์ ๋ฌธ์๋ง ๊ฐ์ฒด๋ก ์ธํ ํ๋ค.
length๋ฅผ ๋ถ๋ฌธ๋ถ์์ด์ ํฌ๊ธฐ๋งํผ ํ์ง์๊ณ -1์ ํด์ฃผ๋ ์ด์ ๋
๋ถ๋ถ๋ฌธ์์ด์ ํฌ๊ธฐ๊ฐ 3์ผ๋, 2๋ ๊ณ ์ ์ผ๋ก ๊ณ์ ๋๊ณ ํ์๋ฆฌ๋ง ๋ฐ๊พธ๋ฉด์ ๋น๊ต๋ฅผ ์งํํด์ผํ๊ธฐ ๋๋ฌธ์ด๋ค.
for (let i = 0; i < len; i++) {
if (map1.has(s[i])) {
map1.set(s[i], map1.get(s[i] + 1);
} else {
map1.set(s[i], 1);
}
}
4) for๋ฌธ์ผ๋ก ์ฌ๋ผ์ด๋ฉ ์๋์ฐ๋ก ํ์นธ์ฉ ์ด๋ํ๋ฉด์
1๊ฐ ์ถ๊ฐํด์ 3๊ฐ์ฉ ๋น๊ตํ๊ณ (๋ถ๋ถ๋ฌธ์์ด์ length) ์๋๊ทธ๋จ์ด ์๋ ๊ฒฝ์ฐ ๋นผ์ฃผ๊ณ ๋ฐ๋ณตํ๋ค.
๋น๊ต ์ดํ์ ๋นผ์ฃผ๋ ์์ ์ ํ๊ธฐ์ํด์ ํฌ ํฌ์ธํฐ ๋ณ์ ์์ฑํด์ค๋ค.
let lt = 0;
rt๋ for ๋ฐ๋ณต๋ฌธ ์์ ์ ์ธ
for (let rt = len; rt < s.length; rt++) {
if (map1.has(s[rt])) {
map1.set(s[rt], map1.get(s[rt]) + 1);
} else {
map1.set(s[rt], 1);
}
// ๋น๊ต
if (compareMaps(map1, map2)) {
answer++;
}
// ๋น๊ต ์ดํ์ ์ผ์ชฝ ํฌ์ธํฐ ๋นผ์ฃผ๋ ์์
map1.set(s[lt], map1.get(s[lt]) - 1); // ๊ธฐ์กด ๊ฐ๋ณด๋ค 1์๊ฒ ๊ฐ์ ธ์์ ๋ค์ ์ธํ
if (map1.get(s[lt]) === 0) {
map1.delete(s[lt]);
}
lt++;
}
5) ๋น๊ตํ๋ ํจ์ ์์ฑ
๋ถ๋ถ๋ฌธ์์ด์ ๊ฐ์๊ฐ ๊ฐ์์ง ํ์ธ
key๊ฐ์ด ๊ฐ์์ง, value ๊ฐ์ด ๊ฐ์์ง ํ์ธ
const 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;
}
}
retrun true; // ๋ชจ๋ ์๋๋ฉด ๊ฐ์ ๊ฒ์ผ๋ฏ๋ก true ๋ฐํ
}
4. ์ฝ๋
const solution = (s, t) => {
// ์๋๊ทธ๋จ์ด ๋๋ ์ฐ์๋ ๋ถ๋ถ๋ฌธ์์ด ๊ฐ์
let answer = 0;
let map1 = new Map(); // ๋ฌธ์์ด์ map ๊ฐ์ฒด๋ก
let map2 = new Map(); // ๋ถ๋ถ๋ฌธ์์ด์ map ๊ฐ์ฒด๋ก
// ์ฐพ์์ผํ๋ ์ฐ์๋ ๋ถ๋ถ๋ฌธ์์ด์ map๊ฐ์ฒด๋ก ๋ง๋ฌ
for (let x of t) {
if (map2.has(x)) {
map2.set(x, map2.get(x) + 1);
} else {
map2.set(x, 1);
}
}
// ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ํ ๋ ๊ธธ์ด๊ฐ 3์ด๋ฉด 2๊ฐ๋ฅผ ๋จผ์ ์ธํ
ํด ๋๋ ๊ฒ
let len = t.length - 1;
for (let i = 0; i < len; i++) {
if (map1.has(s[i])) {
map1.set(s[i], map1.get(s[i]) + 1);
} else {
map1.set(s[i], 1);
}
}
let lt = 0;
// ์ฌ๋ผ์ด๋ฉ ์๋์ฐ์ด๊ธฐ ๋๋ฌธ์ rt๋ len๊ธธ์ด๋ฅผ ์์์ ์ผ๋ก ์ธํ
// ์ถ๊ฐํด์ 3๊ฐ๋ก ๋ง์ถฐ์ฃผ๊ณ
for (let rt = len; rt < s.length; rt++) {
if (map1.has(s[rt])) {
map1.set(s[rt], map1.get(s[rt]) + 1);
} else {
map1.set(s[rt], 1);
}
// 3๊ฐ์ด๋๊น ์ด์ ๋น๊ต๊ฐ๋ฅ
if (compareMaps(map1, map2)) {
answer++;
}
// ๋น๊ต ์ดํ์ ์ผ์ชฝ ํฌ์ธํฐ ๋นผ์ฃผ๋ ์์
map1.set(s[lt], map1.get(s[lt]) - 1); // ๊ธฐ์กด ๊ฐ๋ณด๋ค 1์๊ฒ ๊ฐ์ ธ์์ ๋ค์ ์ธํ
if (map1.get(s[lt]) === 0) {
map1.delete(s[lt]);
}
lt++;
}
return answer;
}
const compareMaps = (map1, map2) => {
if (map1.size !== map2.size) { // 1. ๊ฐ์๊ฐ ๊ฐ์์ง ํ์ธ
return false;
}
for (let [key, value] of map1) { // 2. key ๊ฐ์ด ๊ฐ์์ง ํ์ธ
if (!map2.has(key) || map2.get(key) !== value) { // 3. value ๊ฐ์ด ๊ฐ์์ง ํ์ธ
return false;
}
}
return true;
}
const str1 = "bacaAacba";
const str2 = "abc";
console.log(solution(str1, str2));
'๐กAlgorithm > ๋ฌธ์ ํ๊ธฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ๋ก๊ทธ๋๋จธ์ค - ์ต์์ง์ฌ๊ฐํ (0) | 2021.10.21 |
---|---|
ํ๋ก๊ทธ๋๋จธ์ค | ์์ฃผํ์ง ๋ชปํ ์ ์(ํด์) (0) | 2021.09.25 |
ํ๋ก๊ทธ๋๋จธ์ค(Level 1) - 2์ฃผ์ฐจ_์ํธํ๊ฐ (0) | 2021.09.23 |
ํ๋ก๊ทธ๋๋จธ์ค(Level 1) - ์ซ์๋ฌธ์์ด๊ณผ ์๋จ์ด (0) | 2021.09.18 |
JS์๊ณ ๋ฆฌ์ฆ | ํ๋ก๊ทธ๋๋จธ์ค(Level 1) - ํฐ์ผ๋ชฌ (0) | 2021.09.17 |