๐Ÿ“ algorithm

[๋ฐฑ์ค€] ๋ฌธ์ž์—ด ๊ฒŒ์ž„ 2 - JavaScript ํ’€์ด

c0zi 2025. 2. 14. 15:59

๐Ÿ’™ ๋ฌธ์ œ ์„ค๋ช…

 

์ž‘๋…„์— ์ด์–ด ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด ๊ฒŒ์ž„์ด ์žˆ๋‹ค. ๊ฒŒ์ž„์˜ ์ง„ํ–‰ ๋ฐฉ์‹์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  1. ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฌธ์ž์—ด W๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
  2. ์–‘์˜ ์ •์ˆ˜ K๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
  3. ์–ด๋–ค ๋ฌธ์ž๋ฅผ ์ •ํ™•ํžˆ K๊ฐœ๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฐ€์žฅ ์งง์€ ์—ฐ์† ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•œ๋‹ค.
  4. ์–ด๋–ค ๋ฌธ์ž๋ฅผ ์ •ํ™•ํžˆ K๊ฐœ๋ฅผ ํฌํ•จํ•˜๊ณ , ๋ฌธ์ž์—ด์˜ ์ฒซ ๋ฒˆ์งธ์™€ ๋งˆ์ง€๋ง‰ ๊ธ€์ž๊ฐ€ ํ•ด๋‹น ๋ฌธ์ž๋กœ ๊ฐ™์€ ๊ฐ€์žฅ ๊ธด ์—ฐ์† ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•œ๋‹ค.

์œ„์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๊ฒŒ์ž„์„ TํšŒ ์ง„ํ–‰ํ•œ๋‹ค.

 

๐Ÿ’› ์ž…๋ ฅ

 

๋ฌธ์ž์—ด ๊ฒŒ์ž„์˜ ์ˆ˜ T๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ T ≤ 100)

๋‹ค์Œ ์ค„๋ถ€ํ„ฐ 2๊ฐœ์˜ ์ค„ ๋™์•ˆ ๋ฌธ์ž์—ด W์™€ ์ •์ˆ˜ K๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (1 ≤ K ≤ |W| ≤ 10,000) 

 

๐Ÿ’š ์ถœ๋ ฅ

 

T๊ฐœ์˜ ์ค„ ๋™์•ˆ ๋ฌธ์ž์—ด ๊ฒŒ์ž„์˜ 3๋ฒˆ๊ณผ 4๋ฒˆ์—์„œ ๊ตฌํ•œ ์—ฐ์† ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋ฅผ ๊ณต๋ฐฑ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ถœ๋ ฅํ•œ๋‹ค.

๋งŒ์•ฝ ๋งŒ์กฑํ•˜๋Š” ์—ฐ์† ๋ฌธ์ž์—ด์ด ์—†์„ ์‹œ -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

๐Ÿšซ ์ œํ•œ์‚ฌํ•ญ

  • 1 ≤ T ≤ 100
  • 1 ≤ K ≤ |W| ≤ 10,000
  • ์‹œ๊ฐ„์ œํ•œ : 1 s

โค๏ธ ๋ฌธ์ œ ํ’€์ด ๋ฐฉ๋ฒ•

 

์—ฌ๋Ÿฌ์ฐจ๋ก€์˜ ์‹œ๋„ ๋์— ๋งž์•˜๋‹ค..

 

์‚ฝ์งˆ 1 : ์ฒ˜์Œ์—๋Š” ๋ฌธ์ž์—ด ์ œํ•œ ์‚ฌํ•ญ์„ ์ž˜ ๋ชป ๋ณด๊ณ  ๋‹จ์ˆœ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋ ค๋‹ค๊ฐ€ ์ ˆ๋Œ€ ์•ˆ๋œ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๋‹ค.

์‚ฝ์งˆ 2 : ๋‹ค๋ฅธ ๋ถ„๋“ค์˜ ํ’€์ด๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ๋ฌธ์ž์—ด index๋ฅผ ์ €์žฅํ•˜๋ฉด ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋๋Š”๋ฐ, Object์— ์ €์žฅํ•  ๋•Œ ์•„๋ž˜์ฒ˜๋Ÿผ ์ ์—ˆ๋‹ค๊ฐ€ ๊ณ„์† ์—๋Ÿฌ๊ฐ€ ๋‚ฌ๋‹ค.

strObj[char] = strObj[char] ? strObj[char].push(j) : [j];

 

์™œ ์ด๋ ‡๊ฒŒ ์ ์—ˆ๋Š”์ง€ ์ง€๋‚˜๊ณ  ๋‚˜๋‹ˆ๊นŒ ์ดํ•ด๊ฐ€ ์•ˆ๋œ๋‹ค ใ…‹ใ…‹ใ…‹ ์•”ํŠผ ์ด๊ฑฐ ๋•Œ๋ฌธ์— ์˜ค๋ž˜ ๊ฑธ๋ ธ๋‹ค.

 

1๏ธโƒฃ ์ธ๋ฑ์Šค ์ €์žฅ ํ›„ ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ

 

์šฐ์„  ๋ฌธ์ž์—ด ๊ธธ์ด๊ฐ€ ์ตœ๋Œ€ 1๋งŒ์ด๋‹ˆ๊นŒ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๋‘๋ฒˆ์ด์ƒ ๋Œ๋ฉด ์•ˆ๋œ๋‹ค๋Š” ์ ์— ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค. => ์ง์ ‘ ๋Œ๋ฉด์„œ ๋น„๊ต ๋ถˆ๊ฐ€ !!!

๊ทธ๋Ÿฌ๋ฉด ์–ด๋–ป๊ฒŒ ๊ฐ™์€ ๋ฌธ์ž์—ด๋“ค์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์„๊นŒ ??

 

๊ฐ์ฒด ํƒ€์ž…์„ ํ™œ์šฉํ•ด์„œ ๋ฌธ์ž์—ด๋งˆ๋‹ค ๋“ฑ์žฅํ•˜๋Š” ์ธ๋ฑ์Šค๋ฅผ ์ €์žฅํ•ด๋‘”๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ•œ๋ฒˆ์˜ ๋ฐ˜๋ณต๋ฌธ ์‚ฌ์šฉ์œผ๋กœ ๋ฌธ์ž๋“ค์˜ ์œ„์น˜๋ฅผ ๋ชจ๋‘ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

์ด ๊ฐ์ฒด๋ฅผ ํ™œ์šฉํ•ด์„œ, ํšŸ์ˆ˜ k๋ฒˆ ๋“ฑ์žฅ ๊ธฐ์ค€ ๊ฐ€์žฅ ์ž‘๊ฑฐ๋‚˜ ํฐ ๊ธธ์ด๋ฅผ ํ™•์ธํ•˜๋ฉด ๋œ๋‹ค.

 

const fs = require("fs");
const input = fs.readFileSync("test.txt", "utf-8").trim().split("\n");

function solution() {
  const t = Number(input[0]);
  const rest = input.slice(1);
  const strArr = rest.filter((_, idx) => idx % 2 === 0).map((v) => v.trim());
  const k = rest.filter((_, idx) => idx % 2 === 1).map(Number);

  for (let i = 0; i < strArr.length; i++) {
    let strObj = {};
    for (let j = 0; j < strArr[i].length; j++) {
      let char = strArr[i][j];
      if (!strObj[char]) {
        strObj[char] = [];
      }
      strObj[char].push(j);
    }

    let minLen = Number.MAX_SAFE_INTEGER;
    let maxLen = 0;

    for (let char in strObj) {
      if (strObj[char].length < k[i]) continue;
      for (let d = 0; d < strObj[char].length - k[i] + 1; d++) {
        let diff = strObj[char][d + k[i] - 1] - strObj[char][d] + 1;

        if (minLen > diff) minLen = diff;
        if (maxLen < diff) maxLen = diff;
      }
    }

    console.log(maxLen === 0 ? "-1" : minLen + " " + maxLen + "");
  }
}

solution();