취준/백준

[백준][Python][17609][구현] 회문

puff 2020. 4. 10. 17:33

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

 

17609번: 회문

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

www.acmicpc.net

구현 문제다.

이 문제는 회문, 한글자만 삭제하면 되는 회문(유사회문), 일반 문자열 이 셋을 구별해야한다.

 

나는 이런 순서로 풀었다.

  1. s 가 회문인가 -> palincheck 0출력
  2. s 가 뒤쪽 문자중에 하나만 지우면 되는 유사회문인가 left-fixed
    1. l,r 을 각각 0, 문장 맨 끝이라 할때
    2. l+=1, r-=1 을 하면서 같은지 확인하는데
    3. 만약 다르면 r-=1만 하고 한번만 지우는지 체크하는 변수에 저장한다 cvtd
  3. s 가 앞쪽 문자중에 하나만 지우면 되는 유사회문인가 right-fixed
    1. l,r 을 각각 0, 문장 맨 끝이라 할때
    2. l+=1, r-=1 을 하면서 같은지 확인하는데
    3. 만약 다르면 l+=1만 하고 한번만 지우는지 체크하는 변수에 저장한다 cvtd
  4. 2, 3 둘중에 하나라도 회문이다 -> 유사회문 1출력
  5. 둘다 회문으로 못만든다 -> 일반 문자열 2출력
import sys


def palincheck(s):
    return s == s[::-1]


t = int(sys.stdin.readline())


for _ in range(t):
    s = sys.stdin.readline().rstrip()

    if palincheck(s):
        print(0)
        continue
    else:
        lyes, ryes = True, True
        l, r = 0, len(s)-1
        cvtd = False
        # left-fixed
        while l <= r:
            if s[l] != s[r]:
                if not cvtd:
                    cvtd = True
                    r -= 1

                else:
                    lyes = False
                    break
            else:
                l += 1
                r -= 1
        l, r = 0, len(s)-1
        cvtd = False
        # right-fixed
        while l <= r:
            if s[l] != s[r]:
                if not cvtd:
                    cvtd = True
                    l += 1

                else:
                    ryes = False
                    break
            else:
                l += 1
                r -= 1

        if not (lyes | ryes):
            print(2)
        else:
            print(1)