Post

[백준] 17609 파이썬

문제


  • 백준 17609 (골드 5)

백준 17609

n개의 단어가 주어질 때, 각각의 단어가 회문인지, 혹은 한 문자를 삭제했을 때 회문인지, 혹은 일반 단어인지 구분하는 문제였다.
단어는 최대 30개까지 주어진다.

image

내 코드


문자열의 특성과 투포인터를 활용하면 풀 수 있을 것같아서 구현해보았다.
우선은 문자열을 뒤집어서 원래 문자열과 같다면 회문이므로 0을 반환해 주었다.
다음으로는 각각 왼쪽, 오른쪽 포인터를 한 단계씩 이동하면서 문자를 하나 제외해주고, 해당 단어가 회문이 되는지 확인해 주었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import sys
input = sys.stdin.readline

t = int(input())

def ispseudo(arr, left, right):
    while left < right:
        if arr[left] == arr[right]:
            left += 1
            right -= 1
        else:
            return False
    return True

def ispalindrome(arr):
    left, right = 0, len(arr)-1
    
    if arr == arr[::-1]:
        return 0
    else:
        while left < right:
            if arr[left] != arr[right]:
                check_left = ispseudo(arr, left + 1, right)
                check_right = ispseudo(arr, left, right - 1)

                if check_left or check_right:
                    return 1
                else:
                    return 2
            else:
                left += 1
                right -= 1

for _ in range(t):
    arr = input().strip()
    print(ispalindrome(arr))

image

투포인터는 문제를 보고 쉽게 떠올리기 쉽지 않아서 많이 연습해보아야 겠다는 생각이 들었다.

This post is licensed under CC BY 4.0 by the author.