ํ•ด์‹œ, ํˆฌํฌ์ธํ„ฐ, ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•ด์„œ ํ’€์–ด๋ณด๋Š” ๋ฌธ์ œ

 

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));

 

+ Recent posts