๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Algorithm

[Algorithm] ๊ฐ€์žฅ ๊ธด ํŒฐ๋ฆฐ๋“œ๋กฌ

๐Ÿ“‹ ๋ฌธ์ œ 

์•ž๋’ค๋ฅผ ๋’ค์ง‘์–ด๋„ ๋˜‘๊ฐ™์€ ๋ฌธ์ž์—ด์„ ํŒฐ๋ฆฐ๋“œ๋กฌ(palindrome)์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
๋ฌธ์ž์—ด s๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ, s์˜ ๋ถ€๋ถ„๋ฌธ์ž์—ด(Substring)์ค‘ ๊ฐ€์žฅ ๊ธด ํŒฐ๋ฆฐ๋“œ๋กฌ์˜ ๊ธธ์ด๋ฅผ return ํ•˜๋Š” solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด ์ฃผ์„ธ์š”.

์˜ˆ๋ฅผ๋“ค๋ฉด, ๋ฌธ์ž์—ด s๊ฐ€ "abcdcba"์ด๋ฉด 7์„ returnํ•˜๊ณ  "abacde"์ด๋ฉด 3์„ returnํ•ฉ๋‹ˆ๋‹ค.

 

์ œํ•œ์‚ฌํ•ญ

  • ๋ฌธ์ž์—ด s์˜ ๊ธธ์ด : 2,500 ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜
  • ๋ฌธ์ž์—ด s๋Š” ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž๋กœ๋งŒ ๊ตฌ์„ฑ

 

์ž…์ถœ๋ ฅ ์˜ˆ

"abcdcba" 7
"abacde" 3

 

โœ๏ธ ํ’€์ด

์–ด๋–ค ์‹์œผ๋กœ ํ’€์–ด์•ผํ• ์ง€ ์ •๋ง ๊ณ ๋ฏผ์„ ๋งŽ์ด ํ–ˆ๋‹ค. ์ฒ˜์Œ ์„ ํƒํ•œ ๋ฐฉ๋ฒ•์€ ์ด์ค‘ for๋ฌธ์„ ๋Œ๋ ค์„œ ์•ŒํŒŒ๋ฒณ์ด ๊ฐ™์€์ง€ ์ด์ฐจ์› ๋ฐฐ์—ด์— ํ‘œ์‹œํ•˜๊ณ  i๋Š” ์ž‘์•„์ง€๋Š” ๋ฐฉํ–ฅ์œผ๋กœ, j๋Š” ์ปค์ง€๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฆฌ๋ฉด์„œ ์ฒดํฌํ•˜๋ฉฐ ๋”ํ•ด๊ฐ€๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์ ‘๊ทผํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ๋ฐฉ์‹์„ ์„ ํƒํ–ˆ์„ ๋•Œ 'aacbaa'์ฒ˜๋Ÿผ ๊ฐ€์šด๋ฐ ๋ฌธ์ž๋Š” ํŒฐ๋ฆฐ๋“œ๋กฌ์˜ ์กฐ๊ฑด์„ ์ถฉ์กฑ์‹œํ‚ค์ง€ ๋ชปํ•˜์ง€๋งŒ ์‚ฌ์ด๋“œ์˜ aa๊ฐ€ ํŒฐ๋ฆฐ๋“œ๋กฌ์œผ๋กœ ๊ณ„์‚ฐ๋˜์–ด 4๋ผ๋Š” ๋‹ต์ด ๋„์ถœ๋ฌ๋‹ค.

 

๋‹ค์Œ์œผ๋กœ๋Š” i๋Š” ์ž‘์•„์ง€๋Š” ๋ฐฉํ–ฅ์œผ๋กœ, j๋Š” ์ปค์ง€๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ์ด์ค‘ for๋ฌธ์„ ํ•œ๋ฒˆ๋งŒ ๋Œ๋ฆฌ๋ฉด์„œ i, j์ธ๋ฑ์Šค๊ฐ€ ๊ฐ™๋‹ค๋ฉด 1์„ ํ• ๋‹นํ•˜๊ณ  i, j์˜ ์ธ๋ฑ์Šค ์ฐจ์ด๊ฐ€ 1์ผ๋•Œ ๊ฐ™๋‹ค๋ฉด 2๋ฅผ ํ• ๋‹น, ๋งŒ์•ฝ i+1, j-1์— ๊ฐ’์ด ์žˆ๋‹ค๋ฉด check[i+1][j-1]์˜ ๊ฐ’์— 2๋ฅผ ๋”ํ•ด์„œ ํ• ๋‹นํ–ˆ๋‹ค. check[i+1][j-1]์˜ ๊ฐ’์„ ํ™•์ธํ•˜๋Š” ์ด์œ ๋Š” ์ด์ฐจ์› ๋ฐฐ์—ด์— ํ‘œ์‹œํ• ๋•Œ i๋Š” ํฐ๊ฐ’์—์„œ ์ž‘์€ ๊ฐ’์œผ๋กœ, j๋Š” ์ž‘์€ ๊ฐ’์—์„œ ํฐ ๊ฐ’์œผ๋กœ ๋„๋Š”๋ฐ ๊ฐ’์ด ์žˆ๋‹ค๋ฉด ๋” ์ž‘์€ ๋‹จ์œ„์˜ ํŒฐ๋ฆฐ๋“œ๋กฌ์ด ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.  i+1, j-1๋ฅผ ํ™•์ธํ•  ๋•Œ ํ˜„์žฌ i, j์˜ ์ธ๋ฑ์Šค์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์ด ๊ฐ™๋‹ค๋ฉด ๊ทธ ์ž‘์€ ๋‹จ์œ„์˜ ํŒฐ๋ฆฐ๋“œ๋กฌ์˜ ์–‘ ์‚ฌ์ด๋“œ๊ฐ€ ๊ฐ’์Œ์„ ์˜๋ฏธํ•œ๋‹ค.

 

โŒจ๏ธ ์ฝ”๋“œ

function solution(s) {
  var answer = 0;

  const len = s.length;
  const check = [...Array(len)].map(_ => new Array(len).fill(0));

  for (let i = len; i >= 0; i--) {
    for (let j = i; j < len; j++) {
      if (i === j) check[i][j] = 1;
      else if (s[i] === s[j]) {
        if (i + 1 < len && j - 1 >= 0 && check[i + 1][j - 1]) {
          check[i][j] += check[i + 1][j - 1] + 2;
        } else if (j - i === 1) {
          check[i][j] = 2;
        }
      }

      answer = answer = Math.max(answer, check[i][j]);
    }
  }

  return answer;
}