https://programmers.co.kr/learn/courses/30/lessons/12904#
앞뒤를 뒤집어도 똑같은 문자열을 팰린드롬(palindrome)이라고 합니다.
문자열 s가 주어질 때, s의 부분문자열(Substring)중 가장 긴 팰린드롬의 길이를 return 하는 solution 함수를 완성해 주세요.
예를들면, 문자열 s가 abcdcba이면 7을 return하고 abacde이면 3을 return합니다.
제한사항
문자열 s의 길이 : 2,500 이하의 자연수
문자열 s는 알파벳 소문자로만 구성
level3 도전하다가 첫번째로 막힌 문제입니다. 문제를 처음에 보았을 때, 문제 유형을 판단하기 어려웠습니다. 차근차근 시뮬레이션 돌려보자는 마음으로 2중 for문을 이용하여 모든 단어를 조사하였고, 기본 테스트 케이스는 통과하였습니다. 하지만 이 후의 채점에서 몇개의 테스트케이스와 효율성체크에서 실패하였습니다.
function solution(s) // 실패한코드
{
var answer = 0;
var min=-1
for(var t=0; t<s.length ; t++ ){
for(var i=0;i<=t; i++){
if(min!=-1){ break }
var r=s.slice(i,s.length-t+i).split("").reverse().join("");
if(s.includes(r)) { //테스트케이스 실패 원인
min=t
break
}
}
}
answer= s.length-min
return answer;
}
이후에는 효율성 부분에서 막히게 되었습니다. 효율성 부분을 해결하기 위해서는 s.includes(r)로 전체를 비교하는 것이아닌 for문을 통해 하나하나 비교하는 것이 일 때, 효율성 측면에서 좋습니다.
함수가 더 스파게티코드가 되는 것을 방지하여 _ 함수를 따로 정의하여 가독성을 조금 더 높혔습니다.
function solution(s) {
var len = s.length
var answer = -1
for (var i = 0; i < len; i++) {
if (answer > -1) break
for (var t = 0; t <= i; t++) {
if (s[t]===s[len-i+t-1]&&is_palindrome(s.slice(t, len - i + t))) {
answer = len - i
break
}
}
}
return answer;
}
function is_palindrome(s) {
var chk = true
for (var i = 1; i < s.length; i++) {
if (s[i] != s[s.length - 1 - i]) {
chk = false
break
}
}
return chk
}
이 방식으로 효율성을 해결하였습니다.