https://www.acmicpc.net/problem/17609

1) 회문 확인
2) 유사회문 확인
이거 두 개만 확인하면 문제를 풀 수 있다.
회문인지 확인하는 방법은 문자열을 거꾸로 뒤집었을 때도 같은지 확인하면 된다.
def isSame(s): #회문인지 확인
if s == s[::-1]:
return True
return False
유사회문인지 확인하는 방법은 문자열 맨 앞, 맨 뒤부터 같은지 확인하면서 만약 다른게 있다면 그 문자열을 빼고 회문인지 확인하는 것이다.
ex) 'summeus'맨 앞, 맨 뒤부터 보면 ss, uu는 똑같고 m과 e에서 다르다. 그러면 m을 뺀 문자열(sumeus)과 e를 뺀 문자열(summus)가 각각 회문인지 확인하면 된다. 둘 중 하나라도 회문이면 이 문자열은 유사 회문이다.
def isSimilar(s): # 유사회문인지 확인
for i in range(len(s)//2):
start, end = s[i], s[-(i+1)]
if start != end:
new_txt = newWord(s, i)
new_txt2 = newWord(s, len(s)-(i+1))
if isSame(new_txt) or isSame(new_txt2): # 둘 중 하나라도 회문이면
return True # 유사회문
else:
return False
def newWord(s, idx): # 새로운 문자열 만드는 함수
newS = s[:idx]+s[idx+1:]
return newS
# 회문 0, 유사회문 1, 그 외 2
import sys
input = sys.stdin.readline
def isSame(s): #회문인지 확인
if s == s[::-1]:
return True
return False
def isSimilar(s): # 유사회문인지 확인
for i in range(len(s)//2):
start, end = s[i], s[-(i+1)]
if start != end:
new_txt = newWord(s, i)
new_txt2 = newWord(s, len(s)-(i+1))
if isSame(new_txt) or isSame(new_txt2): # 둘 중 하나라도 회문이면
return True # 유사회문
else:
return False
def newWord(s, idx): # 새로운 문자열 만드는 함수
newS = s[:idx]+s[idx+1:]
return newS
T = int(input())
for _ in range(T):
s = input().rstrip()
if isSame(s): #회문
print(0)
elif isSimilar(s): # 유사회문
print(1)
else:
print(2)
열심히 살고있구먼 ...