-
[Python] 백준 17609 회문알고리즘/문제풀이 2021. 8. 14. 17:45728x90
1. 문제 링크
https://www.acmicpc.net/problem/17609
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. 결론
- 투포인터를 이용해서 회문 체크를 한다 + 문자열 잘 다루면 쉬운 문제!
'알고리즘 > 문제풀이' 카테고리의 다른 글
[Python] 백준 1956 운동 (0) 2021.08.14 [Python] Programmers 로또의 최고 순위와 최저 순위 (0) 2021.08.14 [Python] 백준 17182 우주 탐사선 (0) 2021.08.07 [Python] 백준 14719 빗물 (0) 2021.08.07 [Python] 백준 16234 인구 이동 (0) 2021.08.07