즐거운 PS 👩‍💻🥰

[백준-파이썬] 15927: 회문은 회문아니야!

dalin❤️ 2021. 12. 28. 21:48

문제 보러 가기!

오.. 문제가 생각보다 쉽게? 직관적으로? 풀려서 신기하다...

문자열이 주어졌을 때, 회문이 아닌 가장 긴 부분 문자열의 길이를 구하는 문제이다!
그런 부분 문자열이 없으면 -1을 출력하라고 했다. 일단 -1을 출력해야 하는 경우를 생각해봤다. 단어가 한 글자인 경우(어떻게 봐도 회문이 되니까!), 맨 처음에 쭉~ 봐서 모두 같은 알파벳으로 이뤄진 경우에는 -1를 출력하고 끝냈다.
그게 아닌 경우는 bfs처럼 봤다. 일단 전체 문자열을 넣어주고 시작한다.
popleft한 것이 회문인지 본다. 회문이 아니면, 그 문자열 길이를 리턴한다. 그게 젤 긴 문자열일테니까 정답!
회문이라면 그 문자열에서 맨 앞 한글자를 뺀 단어, 맨 뒤 한글자를 뺀 단어를 큐에 넣는다. -이걸 한 글자가 될 때 그만두게 한다. (맨 앞에서 한글자 빼거나, 뒤에서 한 글자 빼거나 하면 아무것도 없게 되니까)

회문 판단하는 것은 파이썬 문자열의 특징을 이용하면 쉽게 할 수 있다.
word == word[::-1] 로 했다.

import sys
from collections import deque

input = sys.stdin.readline

MIISS = lambda: map(int, input().strip().split())


def sol():
    q = deque([word])
    while q:
        tmp = q.popleft()
        if tmp != tmp[::-1]:  # 팬린드롬이 아니면
            return len(tmp)
        elif len(tmp) == 1:  # 한글자이면 그만 두게
            return 1

        q.append(tmp[1:])
        q.append(tmp[:-1])

    return -1


word = input().strip()

flag = False  # 답이 존재하지 않지 -않는다.
if len(word) == 1:
    flag = True  # 답이 존재하지 않는다.

first_string = word[0]
for i in range(1, len(word)):
    if word[i] != first_string:
        break
else:
    flag = True  # 답이 존재하지 않는다.

if flag == True:
    print(-1)

else:
    print(sol())
728x90