https://programmers.co.kr/learn/courses/30/lessons/12904
코딩테스트 연습 - 가장 긴 팰린드롬
앞뒤를 뒤집어도 똑같은 문자열을 팰린드롬(palindrome)이라고 합니다. 문자열 s가 주어질 때, s의 부분문자열(Substring)중 가장 긴 팰린드롬의 길이를 return 하는 solution 함수를 완성해 주세요. 예를들
programmers.co.kr
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int get_pldr_len(const string &s, int left, int right)
{
    int pldr = right - left - 1;
    while (!(left < 0 || right >= s.size()) && s[left] == s[right])
    {
        --left;
        ++right;
        pldr += 2;
    }
    return pldr;
}
int solution(string s)
{
    int N = s.size();
    int answer = 1;
   
    /*
        각 문자를 기준으로 팰린드롬이 만들어지는지 확인하고,
        최대길이를 갱신한다.
    */
    for (int i = 0; i < N - 1; ++i)
    {
        // abba 형태 팰린드롬 : 바로 다음문자부터 대칭 시작
        if (i + 1 < N && s[i] == s[i + 1])
        {
            answer = max(get_pldr_len(s, i, i + 1), answer);
        }
        // abcba 형태 팰린드롬 : 문자 하나를 사이에 두고 그다음부터 대칭 시작
        if (i + 2 < N && s[i] == s[i + 2])
        {
            answer = max(get_pldr_len(s, i, i + 2), answer);
        }
    }
    return answer;
}
전체 문자열을 탐색하면서 i번째 또는 i + 1번째 문자열을 기준으로 팰린드롬이 만들어지는지 확인한다.
팰린드롬의 2가지 형태
1. abba : 가운데 문자 X
2. abcba : 가운데 문자 O
각각의 경우에서 기준이 되는 문자를 정하고,
왼쪽 인덱스는 줄여가고 오른쪽 인덱스는 키워가면서 대칭되는지 확인한다.
그리고 최대값 갱신하기!
'Algorithm > 프로그래머스' 카테고리의 다른 글
| [프로그래머스]2017 카카오코드 예선 : 보행자 천국 (level 3)(c++) (0) | 2020.07.01 | 
|---|---|
| [프로그래머스]연습문제 : 거스름돈 (level 3)(c++) (0) | 2020.07.01 | 
| [프로그래머스]2017 카카오코드 예선 : 브라이언의 고민 (level 3)(c++) (4) | 2020.06.24 | 
| [프로그래머스]2020 KAKAO BLIND RECRUITMENT : 자물쇠와 열쇠 (level 3)(c++) (0) | 2020.06.24 | 
| [프로그래머스]이분탐색 : 입국심사 (level 3)(c++, java) (0) | 2020.06.23 | 
										
									
										
									
댓글