http://boj.kr/17609 

 

 

 
먼저 is_palindrome 은 회문인지 알아보는 함수이다. str[i] == str[길이-i-1] 인지 검사해서 회문인지 알아낸다. i의 범위는 range(0, 스트링 길이의 절반+1) 이다. 스트링 길이의 절반+1인 이유는 직접 해보면 알겠지만 range (a,b) 는 a부터 b-1까지 리턴하기 때문이다.
회문이 아니라면 이제 한번더 기회를 줘서 유사회문인지 알아봐야 한다.
방법이 두가지가 있는데, 양쪽을 비교했는데 서로 다른 문자를 발견하면 1) 왼쪽 문자를 무시하거나 2) 오른쪽 문자를 무시하는 방법이 있다.
왼쪽 문자를 무시하는 방법은 i -> i+1 이고,
오른쪽 문자를 무시하는 방법은 스트링길이-i-1 -> 스트링길이-i-1-1 이다.
두 방법을 모두 시도해본 후에 그렇게 한 문자를 무시하니 회문이 된다면 유사 회문이고,
그랬는데도 서로다른 문자가 나오면 이것도 저것도 아닌 문자열이다.


import sys


# 왼쪽을 +1 해서 탐색, i는 다른 문자가 나온 위치
def can_palindrome_left(str, i, length): 
    for j in range(i, length):
        if str[j+1] != str[-j-1]:
            return 2
    return 1


# 오른쪽을 -1 해서 탐색, i는 다른 문자가 나온 위치
def can_palindrome_right(str, i, length):  
    for j in range(i, length):
        if str[j] != str[-j-1-1]:
            return 2
    return 1


def is_palindrome(str):
    length = (len(str) // 2) + 1
    for i in range(length):
        if str[i] != str[-i-1]:
            if can_palindrome_left(str, i, length) == 2:
                if can_palindrome_right(str, i, length) == 2:
                    return 2
                else:
                    return 1
            else:
                return 1
    return 0


input = sys.stdin.readline
N = int(input())

for _ in range(N):
    print(is_palindrome(list(input()[:-1])))

'알고리즘 > 브루트포스' 카테고리의 다른 글

16637. 괄호 추가하기 (2)  (0) 2020.05.12
16637번. 괄호 추가하기  (0) 2020.05.11
12100번. 2048 (Easy)  (0) 2020.05.04
12100. 2048 (Easy)  (0) 2020.01.07
2231. 분해합  (0) 2019.11.20

+ Recent posts