Post

[SWEA] 4579. 세상의 모든 팰린드롬 2(python)

📌문제

Alt text



💪아이디어

  1. 팰린드롬 확인
    이중포인터(left,right)를 사용하여 앞에서 뒤의 문자를 확인한다. left와 right가 같을 때까지 while문이 돌면 팰린드롬이라 하였다.

  2. 와일드카드 ‘*’ 처리
    와일드카드는 0이상의 어떠한 알파벳이므로 두 가지로 처리할 수 있다.

    • 와일드카드가 0개이상
      와일드카드가 left에 있을 경우 list [ left+1:right ], right에 있을 경우 list [ left:right+1 ]이 팰린드롬이 되는지 확인해야하므로 재귀함수를 사용하였다.

    • 와일드카드가 1개 이상
      left와 right의 문자가 다를 때
      left에 있을 경우 right 인덱스의 알파벳과 같다고 판단하고 right를 옮기고. right에 있을 경우 left 인덱스의 알파벳과 같다고 판단하고 left를 옮겼다.
      left와 right의 문자가 같은 때
      그 문자가 ‘*‘이면 left를 옮겨줬고(right를 옮겨도 상관없음) 그 문자가 알파벳이면 left,right를 모두 옮겨줬다

🥂코드

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
def palindrome_with_wildcard(string):
    left,right=0,len(string)-1
    while left<right:
        if string[left]!=string[right]:
            if string[left]=='*':
                if not palindrome_with_wildcard(string[left+1:right+1]):
                    right-=1
                else:
                    return True
            elif string[right]=='*': 
                if not palindrome_with_wildcard(string[left:right]):
                    left+=1
                else: 
                    return True
            else:
                if string[left]=='*':
                    left+=1
                elif string[right]=='*':
                    right-=1
                else:
                    return False
        else:
            if string[left]!='*' and string[left]!='*': 
                left+=1
                right-=1
            else:
                left+=1
    else: return True

T=int(input())
for tc in range(1,T+1):
    in_string=list(input())
    answer='Exist'
    if not palindrome_with_wildcard(in_string):
        answer='Not exist'
    print('#{} {}'.format(tc,answer))
This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.