취준/백준
[백준][Python][17609][구현] 회문
puff
2020. 4. 10. 17:33
문제 : https://www.acmicpc.net/problem/17609
구현 문제다.
이 문제는 회문, 한글자만 삭제하면 되는 회문(유사회문), 일반 문자열 이 셋을 구별해야한다.
나는 이런 순서로 풀었다.
- s 가 회문인가 -> palincheck 0출력
- s 가 뒤쪽 문자중에 하나만 지우면 되는 유사회문인가 left-fixed
- l,r 을 각각 0, 문장 맨 끝이라 할때
- l+=1, r-=1 을 하면서 같은지 확인하는데
- 만약 다르면 r-=1만 하고 한번만 지우는지 체크하는 변수에 저장한다 cvtd
- s 가 앞쪽 문자중에 하나만 지우면 되는 유사회문인가 right-fixed
- l,r 을 각각 0, 문장 맨 끝이라 할때
- l+=1, r-=1 을 하면서 같은지 확인하는데
- 만약 다르면 l+=1만 하고 한번만 지우는지 체크하는 변수에 저장한다 cvtd
- 2, 3 둘중에 하나라도 회문이다 -> 유사회문 1출력
- 둘다 회문으로 못만든다 -> 일반 문자열 2출력
import sys
def palincheck(s):
return s == s[::-1]
t = int(sys.stdin.readline())
for _ in range(t):
s = sys.stdin.readline().rstrip()
if palincheck(s):
print(0)
continue
else:
lyes, ryes = True, True
l, r = 0, len(s)-1
cvtd = False
# left-fixed
while l <= r:
if s[l] != s[r]:
if not cvtd:
cvtd = True
r -= 1
else:
lyes = False
break
else:
l += 1
r -= 1
l, r = 0, len(s)-1
cvtd = False
# right-fixed
while l <= r:
if s[l] != s[r]:
if not cvtd:
cvtd = True
l += 1
else:
ryes = False
break
else:
l += 1
r -= 1
if not (lyes | ryes):
print(2)
else:
print(1)