FeelingXD

[백준-17609] 회문 본문

프로그래밍/문제풀이

[백준-17609] 회문

FeelingXD 2024. 2. 20. 23:27

❓ Problem

문제링크

🤔 How

  1. 중요한 포인트는 다음과 같다.
  • 펠린드롬이라면 2 , 유사 펠린드롬이면 1, 둘다 아니라면 0을 반환한다.
  • 유사펠린드롬은 문자 하나를 제거한뒤에 펠린드롬이 되는경우이다.
  1. 투포인터를 이용해 펠린드롬을 탐색하는 방법으로 접근했다. 그후 맞지않는 같은 단어가 아닌걸 발견하게 된다면 해당문자를 지우고 펠린드롬인지 확인하는 방법이다.
  • 이때 좌측문자, 우측문자 두개가 있으므로 둘중 하나를 제거하여 펠린드롬 여부를 확인해야하는데 이때는 각단어 자리를 없에서 만든 새로운 문자가 펠린드롬인지 확인해준다. (slicing 을 이용하여 간단하게 새로운 문자열을 만드는 방법을 사용했다.)

❗ Solve

# 회문
import sys

input = sys.stdin.readline


def check(l, r, word):
    while l < r:
        if word[l] == word[r]:
            l += 1
            r -= 1
        else:
            # 우측 문자 를 제거하는경우
            if (tmp := word[:r] + word[r + 1 :]) and tmp == tmp[::-1]:
                return 1
                pass
            # 좌측 문자를 제거하는경우
            if (tmp := word[:l] + word[l + 1 :]) and tmp == tmp[::-1]:
                return 1
            return 2
    return 0


def solution():
    for _ in range(case := int(input())):
        word = input().strip()
        l, r = 0, len(word) - 1
        print(check(l, r, word))
    pass


if __name__ == "__main__":  # 실행되는 부분
    solution()
    pass

'프로그래밍 > 문제풀이' 카테고리의 다른 글

[백준-1074] Z ✨  (0) 2024.02.28
[백준 -1992] 쿼드트리  (0) 2024.02.26
[백준-20006] 랭킹전 대기열  (0) 2024.02.14
[백준-16946] 벽 부수고 이동하기 4 🧱🔨  (0) 2024.01.30
[백준-1331] 나이트 투어  (0) 2024.01.28