Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 

README.md

📌 BOJ GOLD LEVEL

17609. 회문 (link)

회문(回文) 또는 팰린드롬(palindrome)은 앞 뒤 방향으로 볼 때 같은 순서의 문자로 구성된 문자열을 말한다. 예를 들어 ‘abba’ ‘kayak’, ‘reviver’, ‘madam’은 모두 회문이다. 만일 그 자체는 회문이 아니지만 한 문자를 삭제하여 회문으로 만들 수 있는 문자열이라면 우리는 이런 문자열을 “유사회문”(pseudo palindrome)이라고 부른다. 예를 들어 ‘summuus’는 5번째나 혹은 6번째 문자 ‘u’를 제거하여 ‘summus’인 회문이 되므로 유사회문이다.

여러분은 제시된 문자열을 분석하여 그것이 그 자체로 회문인지, 또는 한 문자를 삭제하면 회문이 되는 “유사회문”인지, 아니면 회문이나 유사회문도 아닌 일반 문자열인지를 판단해야 한다. 만일 문자열 그 자체로 회문이면 0, 유사회문이면 1, 그 외는 2를 출력해야 한다.

입력 :: 입력의 첫 줄에는 주어지는 문자열의 개수를 나타내는 정수 T(1 ≤ T ≤ 30)가 주어진다. 다음 줄부터 T개의 줄에 걸쳐 한 줄에 하나의 문자열이 입력으로 주어진다. 주어지는 문자열의 길이는 3 이상 100,000 이하이고, 영문 알파벳 소문자로만 이루어져 있다.

출력 :: 각 문자열이 회문인지, 유사 회문인지, 둘 모두 해당되지 않는지를 판단하여 회문이면 0, 유사 회문이면 1, 둘 모두 아니면 2를 순서대로 한 줄에 하나씩 출력한다.

import sys
sys.stdin = open("17609.txt")

'''
input_ 리스트가
회문(return 0), 유사회문(return 1),
혹은 둘다 아닌지(return 2) ver 함수로 검증
'''

def ver(input_, cnt):
    rev_input_ = list(reversed(input_))
    n = len(input_)
    if input_ == rev_input_:
        return 0
    else:
        # 유사회문인지 검증
        if cnt < 1:
            go = 0
            back = n-1

            while go < back:
                # 좌우 대칭문자가 동일하면, 계속해서 좌측 += 1, 우측 -= 1
                if input_[go] == input_[back]:
                    go += 1
                    back -= 1
                # 좌우 대칭문자가 동일하지 않으면, cnt += 1
                else:
                    cnt += 1
                    # 좌측부터 문자 하나씩 지울 때 ver 함수의 return 값을 left 객체에 저장
                    left = ver(input_[go+1:back+1], cnt)
                    # 우측부터 문자 하나씩 지울 때 ver 함수의 return 값을 right 객체에 저장
                    right = ver(input_[go:back], cnt)

                    # 좌우 대칭문자 동일하지 않으면서,
                    # 좌측이나 우측 문자 하나 지울 때 return 0 나오면 == 유사회문(return 1)
                    if min(left, right) == 0:
                        return 1
                    # 좌우 대칭문자 동일하지 않으면서,
                    # 좌측이나 우측 문자 하나 지울 때 return 0 안나오면 == 유사회문도 아님(return 2)
                    else:
                        return 2
        else:
            return 2    # cnt >= 1 인 경우, 즉 두 개 이상 문자를 지울 때

t = int(input())
for i in range(t):
    input_ = list(input())
    res = ver(input_, 0)
    print(res)