Compy's Blog
497 words
2 minutes
[BOJ] 회문은 회문아니야!!
2024-10-02

회문은 회문아니야!!#

TimeLimitMemoryLimitConditionTAG
2s512MB(1 ≤ N ≤ 500,000)에드혹

팰린드롬이란 앞으로 읽으나 뒤로 읽으나 같은 문자열을 말한다. 팰린드롬의 예시로 POP, ABBA 등이 있고, 팰린드롬이 아닌 것의 예시로 ABCA, PALINDROME 등이 있다.

뭔가 이상한 점이 보이지 않는가? 그 어떤 언어에서도 팰린드롬을 뜻하는 단어는 팰린드롬이 아니다! 많은 사람들이 추구하는 “대칭의 아름다움”은 그저 허상에 불과하다.

알파벳 대문자로 이루어진 문자열이 주어졌을 때, 팰린드롬이 아닌 가장 긴 부분문자열의 길이를 구해 보자. 이때 부분문자열을 이루는 글자는 연속해야 한다. AB는 ABCD의 부분문자열이지만, AC는 아니다.

자 문제에 대해서 생각해보자

도대체 어떤 식으로 접근할까? 아이디어는 간단하다. 우리는 팰린드롬이 아닌 값을 찾아내는 것인데!

제일 긴 값을 찾는 것은 바로 끝과 끝을 비교한다. 그래서 쭉 돌아오면서 팰린드롬인지 확인한다. 만약 팰린드롬이면 마지막에서 -1해서 size -1의 상태에서 다시 팰린드롬인지 확인한다.

그렇다면 바로 이 값을 통해서 모두가 같은 문자열인지 아닌지를 판단한다. 모두가 같은 문자열이면 -1을할 것이고, 아니면 문자열의 size 또는 size -1을 반환하겠다.

정답 코드
#include <iostream>
#include <vector>
#include <numeric>
#include <cstring>

using namespace std;

string n;

int solution(){
    
    // 걍 맞는지만 체크하면 끝이네
    
    int start =0, end = (int) n.size() - 1;
    while(start < end)
        if(n[start++] != n[end--]) return (int) n.size();
    
    end = (int) n.size() - 2;
    start = 0;
    
    while(start < end)
        if(n[start++] != n[end--]) return (int) n.size()-1;
    
    
    return -1;
    
}
int main() {
    cin >> n;
    
    cout << solution();
    return 0;
}
[BOJ] 회문은 회문아니야!!
https://compy07.github.io/Blog/posts/boj/15927/
Author
뒹굴뒹굴 이정훈 공부방
Published at
2024-10-02