본문 바로가기
Problem Solving

[Problem Solving] BOJ 17609 : 회문

by __K.Jun__ 2025. 3. 1.

문제 링크 : https://www.acmicpc.net/problem/17609

 

투 포인터를 이용해서 문자열이 회문인지, 유사회문인지, 둘다 아닌지 판별하는 문제이다.

 

left = 0, right = len(s)로 시작해서 left와 right를 각각 오른쪽, 왼쪽으로 이동시킨다.

 

left < right인 동안 계속하여 s[left] == s[right]라면 회문이기 때문에 0을 출력한다.

 

s[left] != s[right]가 된다면,

s[left + 1 : right + 1](s의 left + 1번째 부터, right 번째를 포함하는 substring)가 회문, 또는 s[left : right](s의 left번째 부터, right - 1번째를 포함하는 substring)가 회문이라면 유사회문이므로 1을 출력하고, 둘 다 그렇지 않다면 2를 출력한다.

 

def is_palindrome(s):
    left, right = 0, len(s) - 1
    while left < right:
        if s[left] != s[right]:
            return False
        left += 1
        right -= 1
    return True

def check_palindrome(s):
    left, right = 0, len(s) - 1
    while left < right:
        if s[left] != s[right]:
            if is_palindrome(s[(left + 1):(right + 1)]) or is_palindrome(s[left:right]):
                return 1 
            else:
                return 2
        left += 1
        right -= 1
    return 0

T = int(input())
for _ in range(T):
    s = input().strip()
    print(check_palindrome(s))
728x90