[BOJ/Python] 17609 회문

정회민·2023년 3월 17일

문제

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

해석

이 문제는 주어진 문자열이 회문인지 유사회문인지 둘 다 해당이 안되는지 분류할 수 있는지에 대해 물어보는 문제이다.
이때 중요한 점은 '유사회문'을 판단하는 방법을 생각하는 것이다. 바꿔서 말하면 유사회문을 판단하는 효율적인 방법만 알면 쉽게 풀 수 있는 문제이다.

문제 풀이

회문인지 검사할 때는 양 끝 쪽에 포인터를 잡고 start_idx 증가, end_idx를 감소하며 해당 idx에 대한 글자를 비교한느 방식을 사용한다.

문제를 풀기위해 세운 흐름도를 설명하면...
1. 입력 받기
2. 회문인지 검사.
2-1. 회문이라면 0을 출력.
2-2. 회문이 아니라면 유사회문인지 검사.((start_idx += 1 인 상태로 유사회문인지 검사) or (end_idx -= 1 인 상태로 유사회문인지 검사))
2-2-1. 유사회문이라면 1를 출력.
2-2-2. 유사회문이 아니라면 2를 출력.

코드

def checkPseudo(text: str, start_idx: int, end_idx: int) -> bool:
    while start_idx < end_idx:
        if text[start_idx] != text[end_idx]:
            return False
        start_idx += 1
        end_idx -= 1
    return True


def isPalindrome(text: str) -> int:
    start_idx, end_idx = 0, len(text) - 1
    while start_idx < end_idx:
        if text[start_idx] != text[end_idx]:
            break
        start_idx += 1
        end_idx -= 1
    if start_idx >= end_idx:
        return 0
    else:
        if checkPseudo(text, start_idx + 1, end_idx) or checkPseudo(text, start_idx, end_idx - 1):
            return 1
        else:
            return 2


def solution():
    n = int(input())
    answer = list()
    for _ in range(n):
        answer.append(isPalindrome(input()))

    print('\n'.join(map(str, answer)))


solution()
profile
Nest.js, Delphi 개발자

0개의 댓글