Algorithm/Baekjoon

[Python] 17609. 회문

느낌표 공장장 2022. 9. 22. 23:24

문제

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

 

17609번: 회문

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

www.acmicpc.net

 


풀이 과정

투 포인터 방식으로 풀었다. 두 개의 포인터를 맨 왼쪽과 맨 오른쪽에 놓고 한 칸씩 이동하면서 회문인지 유사회문인지 일반 문자열인지 판별하였다. 

 


코드

# 회문인지 체크하는 함수
def check_palindrome(l, r):
    while l < r:
        if string[l] != string[r]:
            return False
        l += 1
        r -= 1
    return True


t = int(input())
for _ in range(t):
    string = input()
    answer = 0
    l = 0
    r = len(string) - 1
    while l < r:
        if string[l] != string[r]:  # 그 자체로 회문인지
            # 이미 한 글자 제거한 경우
            if answer == 1:
                answer = 2
                break

            # 왼쪽 문자열 삭제 후 회문이 된다면
            if check_palindrome(l+1, r):
                l += 1
                answer = 1
                break

            # 오른쪽 문자열 삭제 후 회문이 된다면
            if check_palindrome(l, r-1):
                r -= 1
                answer = 1

            # 그 자체로 회문도 안되는데 유사회문도 되지 않는 경우 => 일반 문자열
            if answer != 1:
                answer = 2
                break
        
        l += 1
        r -= 1

    print(answer)

'Algorithm > Baekjoon' 카테고리의 다른 글

[Python] 15991. MooTube (Silver)  (0) 2022.10.05
[Python] 13335. 트럭  (2) 2022.10.05
[Python] 24553. 팰린드롬 게임  (0) 2022.09.19
[Python] 3048. 개미  (0) 2022.09.18
[Python] 20057. 마법사 상어와 토네이도  (0) 2022.09.15