[프로그래머스] 레벨3 (level3)가장긴팰린드롬

2020년 06월 20일, 21:15

가장 긴 팰린드롬

문제설명

앞뒤를 뒤집어도 똑같은 문자열을 팰린드롬(palindrome)이라고 합니다. 문자열 s가 주어질 때, s의 부분문자열(Substring)중 가장 긴 팰린드롬의 길이를 return 하는 solution 함수를 완성해 주세요.

예를들면, 문자열 s가 abcdcba이면 7을 return하고 abacde이면 3을 return합니다.

제한사항

  • 문자열 s의 길이 : 2,500 이하의 자연수
  • 문자열 s는 알파벳 소문자로만 구성

입출력 예

s answer
abcdcba 7
abacde 3

입출력 예 설명

입출력 예 #1
4번째자리 'd'를 기준으로 문자열 s 전체가 팰린드롬이 되므로 7을 return합니다.

입출력 예 #2
2번째자리 'b'를 기준으로 aba가 팰린드롬이 되므로 3을 return합니다.

문제풀이

  1. 전체 길이부터 조사.(가장 긴 팰린드롬을 찾으니까 전체 부터 내려오는게 좋음.)
  2. 연속되는 길이를 조사하기 위한 check를 선언.
  3. i+j만큼 돌림.(i+j를 하는 이유는 abcdef의 경우, 6가지는 한가지경우, 5가지는 abcde,bcdef를 보기 위해서다.)
  4. k는 당연히 i/2여서 반을 조사해야한다.
  5. 그래서 연속되는 값이 아니라면 check를 false로 바꾸고 break를 걸어서 계속 진행할 수 있게한다.
  6. 연속되는 값이라면 i를 반환하면 된다.(가장 긴 길이부터 조사했으므로, 바로 반환 가능)
function solution(s) {
  var answer = 1;

  for (let i = s.length; i > 1; i--) {
    for (let j = 0; i + j <= s.length; j++) {
      let check = true;
      for (let k = 0; k < i / 2; k++) {
        if (s[j + k] !== s[i + j - k - 1]) {
          check = false;
          break;
        }
      }
      if (check) return i;
    }
  }

  return answer;
}

아쉬운 점 || 느낀 점

효율성을 통과하지 못해서 진짜 엄청 여러번 시도를 했고,
시도를 해도 효율성 1번은 풀지못했다. 그래서 구글링을 했고, i+j에 대한 힌트를 얻었다.
i+j를 채택해서 푸니까, 복잡도가 많이 줄었고, 통과를 했다.
레벨3부터는 몇몇 문제 빼고는 항상 힌트를 찾아서 풀었는데, 아직 진짜 멀었다..