@@@ 알고리즘/백준 스터디

백준 15927(회문은 회문아니야!!) - 해결

HTG 2021. 12. 28. 20:20
728x90

회문은 회문아니야!!

 

문제

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

같은 의미를 가지는 여러 단어들을 보자.

  • 회문 (한국어)
  • palindrome (영어, 프랑스어, 노르웨이어, 그리스어, 라틴어)
  • 回文 (일본어, 중국어)
  • palindrom (독일어, 덴마크어)
  • palindromi (핀란드어)
  • palíndromo (스페인어, 포르투갈어)
  • palindromo (이탈리아어, 에스페란토어)
  • палиндром (러시아어)
  • قلب مستو (아랍어)

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

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

 

입력

길이가 1 이상 50만 이하인 문자열이 주어진다.

 

출력

팰린드롬이 아닌 가장 긴 부분문자열의 길이를 출력한다. 그런 부분문자열이 없으면 -1을 출력한다.


회문이 아닌 경우를 찾는 문제였다.

그래서 생각한 것이 회문일 경우 하나만 빼도 회문이 아니게 된다는 것을 생각하게 되었고 

안 되는 경우는 모두 다 같은 경우일 때만 이라고 생각하였다.

그래서 크게는 2가지 경우이고 총 3가지 경우로 나누었다.

회문인 경우, 회문이 아닌 경우, 안되는 경우 이렇게 생각하였다.

처음에는 시작과 끝이 다르면 회문이 아니기때문에 총 길이 N

그리고 안되는 경우를 판단하고

회문 판단을 하고 회문이면 N-1, 회문이 아니라면 N 이런 식으로 풀었다.

import sys
input = sys.stdin.readline
word = list(input().strip())
N = len(word)

# 총 3가지 경우가 있다고 생각
def sol():
    # 첫번째, 처음과 끝이 달라 회문이 아닐경우
    # 전체 길이가 가장 긴 회문아닌 경우
    if word[0] != word[-1]:
        return N
    
    # 두번째, 다 같은 경우에만 안되는 경우이기 때문에
    # 다 같으면 -1
    for i in range(1,N):
        if word[0] != word[i]:
            break
    else:
        return -1
    
    # 세번째, 회문 확인 후 회문아닐 때는 첫번째 경우와 같음
    # 회문인 경우 1개만 빼도 회문이 아니게 되기때문에 N-1
    for i in range(N//2):
        if word[i] != word[N-i-1]:
            return N
    else:
        return N-1

print(sol())