문제 링크: https://www.acmicpc.net/problem/17609

이 문제는 주어진 문자열이 회문인지 유사회문인지 둘 다 해당이 안되는지 분류할 수 있는지에 대해 물어보는 문제이다.
이때 중요한 점은 '유사회문'을 판단하는 방법을 생각하는 것이다. 바꿔서 말하면 유사회문을 판단하는 효율적인 방법만 알면 쉽게 풀 수 있는 문제이다.
회문인지 검사할 때는 양 끝 쪽에 포인터를 잡고 start_idx 증가, end_idx를 감소하며 해당 idx에 대한 글자를 비교한느 방식을 사용한다.
문제를 풀기위해 세운 흐름도를 설명하면...
1. 입력 받기
2. 회문인지 검사.
2-1. 회문이라면 0을 출력.
2-2. 회문이 아니라면 유사회문인지 검사.((start_idx += 1 인 상태로 유사회문인지 검사) or (end_idx -= 1 인 상태로 유사회문인지 검사))
2-2-1. 유사회문이라면 1를 출력.
2-2-2. 유사회문이 아니라면 2를 출력.
def checkPseudo(text: str, start_idx: int, end_idx: int) -> bool:
while start_idx < end_idx:
if text[start_idx] != text[end_idx]:
return False
start_idx += 1
end_idx -= 1
return True
def isPalindrome(text: str) -> int:
start_idx, end_idx = 0, len(text) - 1
while start_idx < end_idx:
if text[start_idx] != text[end_idx]:
break
start_idx += 1
end_idx -= 1
if start_idx >= end_idx:
return 0
else:
if checkPseudo(text, start_idx + 1, end_idx) or checkPseudo(text, start_idx, end_idx - 1):
return 1
else:
return 2
def solution():
n = int(input())
answer = list()
for _ in range(n):
answer.append(isPalindrome(input()))
print('\n'.join(map(str, answer)))
solution()