공부 기록장

[백준 - Python] 17609. 회문 본문

코딩 테스트/백준 문제 풀이

[백준 - Python] 17609. 회문

빛나무 2024. 8. 9. 17:08

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

 

코드

n = int(input())

for _ in range(n):
    st = input()
    left, right = 0, len(st) - 1
    answer = 0

    while left <= right:
        if st[left] == st[right]:
            left += 1
            right -= 1
        else:
            # 왼쪽 문자를 제거한 경우 회문인지 확인
            if st[left + 1:right + 1] == st[left + 1:right + 1][::-1]:
                answer = 1
            # 오른쪽 문자를 제거한 경우 회문인지 확인
            elif st[left:right] == st[left:right][::-1]:
                answer = 1
            else:
                answer = 2
            break

    print(answer)

'''
앞 뒤 방향으로 볼 때 같은 순서의 문자로 구성된 문자열 : 회문
한 문자를 삭제해서 회문이 될 수 있는 문자열 : 유사회문

회문 0, 유사회문 1, 그 외 2
'''

 

접근 방식

1. 양 끝에서 포인터로 이동하면서 같으면 계속 이동

2. 다르면 양쪽을 각각 이동시켜본 후 회문이지 확인

3. 한 쪽 문자만 제거하고 회문이면 유사회문

4. 한 쪽 문자를 제거하고도 회문이 아니면 회문 아님

5. else 문에 안걸리면 일반 회문

 

배운 점

1. 문자열에서는 슬라이싱이 유용하게 사용된다

2.

st[left:right][::-1]

 

위와 같이 슬라이싱으로 잘라낸 후, 다시 해당 잘라낸 문자열을 뒤집기도 가능하다