알고리즘/문제풀이

[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. 아이디어 정리

투 포인터를 이용해서 회문을 검사한다.

  1. left right 문자가 동일한 경우: left + 1, right + 1
  2. left right 다른 경우: 한 문자열 제거 후 회문 확인
    1. 오른쪽 문자열 제거한 경우 제거 후 회문이 되는지 확인
    2. 왼쪽 문자열 제거한 경우 제거 후 회문이되는지 확인
    3. 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. 결론

  • 투포인터를 이용해서 회문 체크를 한다 + 문자열 잘 다루면 쉬운 문제!
반응형