본문 바로가기

코딩 테스트(Coding test)/Lv. 3

[프로그래머스/C++] 가장 긴 팰린드롬

미숙한 블로그 주인이 코딩테스트 문제를 풀어가는 과정을 담은 글입니다. 이 풀이가 효율적인 풀이가 아닐 수 있으며, 부정확한 정보가 많이 있을 수 있습니다. 보완해야할 점이 있다면 댓글로 남겨주세요!

 

https://school.programmers.co.kr/learn/courses/30/lessons/12904

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

가장 긴 팰린드롬

문제

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

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

 

제한사항

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

 

풀이

입출력 예시

 

풀이

두 부분을 나눠서 생각해줘야한다.

 

팰린드롬의 길이가 홀수라면 자신의 앞 뒤가 일치하는지를 체크,

팰린드롬의 길이가 짝수라면 자신과 앞이 일치하는지를 체크해줘야한다.

 

#include <string>

using namespace std;

int solution(string s) {
    int answer = 0;
    s += "0";
    int s_len = s.length();

    for (int i = 1; i < s_len; i++) {
        int left = i - 1;
        int right = i + 1;
        int count_1 = 1;
        int count_2 = 0;
        bool check_1 = false;
        bool check_2 = false;
        
        while (left >= 0 && right < s_len) {
            if (s[left] == s[right]) {
                count_1 += 2;
            }
            else {
                check_1 = true;
            }
        
            if (s[left] == s[right - 1]) {
                count_2 += 2;
            }
            else {
                check_2 = true;
            }
        
            if (check_1 && check_2) {
                break;
            }
            
            left--;
            right++;
        }
        
        answer = max(answer, max(count_1, count_2));
    }

    return answer;
}