https://www.acmicpc.net/problem/17609
문장이 그냥 회문이면 0, 글자 하나만 뺐을 때 회문이면 1을, 둘 다 아니면 2를 출력하는 문제이다.
처음에는 한쪽에서부터 올라가면서 절반쯤 도달했을 때 문장 뒤집어서 비교할까 싶다가 하단의 알고리즘 분류에 "투 포인터"라고 되어 있어서 투 포인터로 접근했다.
import sys
input = sys.stdin.readline
n = int(input())
sen = [input().strip() for _ in range(n)]
for s in sen:
l = len(s)
start = 0
end = l - 1
counta = 0
while start <= end:
if counta > 1:
break
if s[start] == s[end]:
start += 1
end -= 1
elif start+1 <= end and s[start+1] == s[end]:
start += 1
counta += 1
elif start <= end - 1 and s[start] == s[end - 1]:
end -= 1
counta += 1
else:
counta = 2
start = 0
end = l - 1
countb = 0
while start <= end:
if countb > 1:
break
if s[start] == s[end]:
start += 1
end -= 1
elif start <= end - 1 and s[start] == s[end - 1]:
end -= 1
countb += 1
elif start+1 <= end and s[start+1] == s[end]:
start += 1
countb += 1
else:
countb = 2
if counta == countb == 2:
print(2)
elif counta * countb == 2 or counta * countb == 1:
print(1)
else:
print(0)
문장 양 끝에서부터 중앙으로 오면서 만약에 둘이 다르다면, 서로 한 칸 앞과 또 비교하면서 한 칸 앞이 같다면 count를 추가하고, 각자의 한 칸 앞도 다르다면 2로 처리했다.
매 반복마다 count가 2 이상이 되면 멈추도록 했다.
처음에 실패했는데, start+1과 end를 먼저 비교했기 때문이었다.
baaba
같은 경우 baab로 유사회문이 되는데, start+1을 먼저 비교해서 aaba로 인식 되는 문제가 있었다.
그래서 start+1먼저일 때 한 번, end-1먼저 일 때 한 번 이렇게 두 번 반복문을 실행했다.
count가 둘 다 2라면 2를, 둘 중 하나 이상이 1이라면 1을, 그것도 아니면 0을 출력했다.