[백준/BOJ][Python] 17609번 회문

Eunding·2024년 11월 27일

algorithm

목록 보기
58/110

17609번 회문

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


아이디어

1) 회문 확인
2) 유사회문 확인
이거 두 개만 확인하면 문제를 풀 수 있다.

회문인지 확인하는 방법은 문자열을 거꾸로 뒤집었을 때도 같은지 확인하면 된다.

def isSame(s): #회문인지 확인
    if s == s[::-1]:
        return True
    return False

유사회문인지 확인하는 방법은 문자열 맨 앞, 맨 뒤부터 같은지 확인하면서 만약 다른게 있다면 그 문자열을 빼고 회문인지 확인하는 것이다.
ex) 'summeus'맨 앞, 맨 뒤부터 보면 ss, uu는 똑같고 m과 e에서 다르다. 그러면 m을 뺀 문자열(sumeus)과 e를 뺀 문자열(summus)가 각각 회문인지 확인하면 된다. 둘 중 하나라도 회문이면 이 문자열은 유사 회문이다.

def isSimilar(s): # 유사회문인지 확인
    for i in range(len(s)//2):
        start, end = s[i], s[-(i+1)]
        if start != end:
            new_txt = newWord(s, i)
            new_txt2 = newWord(s, len(s)-(i+1))
            if isSame(new_txt) or isSame(new_txt2): # 둘 중 하나라도 회문이면
                return True # 유사회문
            else:
                return False

def newWord(s, idx): # 새로운 문자열 만드는 함수
    newS = s[:idx]+s[idx+1:]
    return newS

코드

# 회문 0, 유사회문 1, 그 외 2
import sys
input = sys.stdin.readline

def isSame(s): #회문인지 확인
    if s == s[::-1]:
        return True
    return False

def isSimilar(s): # 유사회문인지 확인
    for i in range(len(s)//2):
        start, end = s[i], s[-(i+1)]
        if start != end:
            new_txt = newWord(s, i)
            new_txt2 = newWord(s, len(s)-(i+1))
            if isSame(new_txt) or isSame(new_txt2): # 둘 중 하나라도 회문이면
                return True # 유사회문
            else:
                return False

def newWord(s, idx): # 새로운 문자열 만드는 함수
    newS = s[:idx]+s[idx+1:]
    return newS

T = int(input())
for _ in range(T):
    s = input().rstrip()
    if isSame(s): #회문
        print(0)
    elif isSimilar(s): # 유사회문
        print(1)
    else:
        print(2)

1개의 댓글

comment-user-thumbnail
2024년 11월 28일

열심히 살고있구먼 ...

답글 달기