오.. 문제가 생각보다 쉽게? 직관적으로? 풀려서 신기하다...
문자열이 주어졌을 때, 회문이 아닌 가장 긴 부분 문자열의 길이를 구하는 문제이다!
그런 부분 문자열이 없으면 -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
'즐거운 PS 👩💻🥰' 카테고리의 다른 글
[백준-파이썬] 1874: 스택 수열 (0) | 2021.12.31 |
---|---|
[백준-파이썬] 12851: 숨바꼭질 2 (0) | 2021.12.30 |
[백준-파이썬] 15990: 1,2,3 더하기 5 (0) | 2021.12.26 |
[백준-파이썬] 1932: 정수 삼각형 (0) | 2021.12.26 |
[백준-파이썬] 1501: 영어 읽기 (0) | 2021.12.25 |