알고리즘/문제풀이
[Python] 백준 17609 회문
정찡이
2021. 8. 14. 17:45
728x90
1. 문제 링크
https://www.acmicpc.net/problem/17609
17609번: 회문
각 문자열이 회문인지, 유사 회문인지, 둘 모두 해당되지 않는지를 판단하여 회문이면 0, 유사 회문이면 1, 둘 모두 아니면 2를 순서대로 한 줄에 하나씩 출력한다.
www.acmicpc.net
2. 문제 요약
- 회문: 0 (앞뒤 동일)
- 유사회문: 1 (한 문자 삭제 시 앞뒤 동일)
- 둘 다 해당 안됨: 2

3. 아이디어 정리
투 포인터를 이용해서 회문을 검사한다.
- left right 문자가 동일한 경우: left + 1, right + 1
- left right 다른 경우: 한 문자열 제거 후 회문 확인
- 오른쪽 문자열 제거한 경우 제거 후 회문이 되는지 확인
- 왼쪽 문자열 제거한 경우 제거 후 회문이되는지 확인
- a, b 과정 중 회문이 없으면 2(둘 다 포함 안됨) 리턴
4. 문제 풀이
4-1. 내 풀이
import sys
def is_palindrome(str_=str()):
"""
투 포인터를 이용한 회문 검사
- 회문: 0 (앞뒤 동일)
- 유사회문: 1 (한 문자 삭제 시 앞뒤 동일)
- 둘다 해당 안됨: 2
:return:
"""
left = 0
right = len(str_) - 1
while left < right:
# 1. left right 문자가 동일한 경우: left + 1, right + 1
if str_[left] == str_[right]:
left += 1
right -= 1
else:
# 2. left right 다른 경우: 한 문자열 제거 후 회문 확인
# 2-1. 오른쪽 문자열 제거한 경우 제거 후 회문이되는지 확인
if left < right - 1:
temp = str_[:right] + str_[right + 1:]
if temp[:] == temp[::-1]:
return 1
# 2-2. 왼쪽 문자열 제거한 경우 제거 후 회문이되는지 확인
if left + 1 < right:
temp = str_[:left] + str_[left + 1:]
if temp[:] == temp[::-1]:
return 1
# # 2-3. 회문이 안된 경우, 2리턴
return 2
for _ in range(int(sys.stdin.readline())):
print(is_palindrome(str(sys.stdin.readline().strip())))
5. 결론
- 투포인터를 이용해서 회문 체크를 한다 + 문자열 잘 다루면 쉬운 문제!
반응형