Palindrome은 회문이라고도 하는데 문자열 순서를 거꾸로 바꾸어도 똑같은 문자열이다.
주어진 문자열이 회문인지 Python3으로 확인해보자.
알파벳은 대문자(Upper)와 소문자(Lower)가 있으니까 이를 한 종류로 통일해서 확인하는게 좋다.
그 후, 문자열의 처음과 끝문자가 서로 같은지 확인하고
만약 같다면 그다음 문자들을 반복해서 확인한다.
이 원리를 다양한 방법으로 구현해보자.
def isPalindrome(self, s: str) -> bool: s = s.lower() word = list(s) # 양쪽에서 비교 while len(word) > 1: if word.pop(0) != word.pop(): return False return True
문자열을 대문자나 소문자로 통일한 후, 리스트로 변환한다.
그리고 위에서 설명한 대로 반복문을 통해 확인한다. 중간에 회문 조건을 만족하지 않다면 False를 반환한다.
Deque는 collections를 import해야 사용할 수 있는 자료구조로 성능을 더 높일 수 있다.
그런데, 그냥 성능 높이기만 하면 심심하니까 조건을 추가해보자.
이번에는 알파벳뿐만 아니라 다른 문자도 포함되어 있지만 이를 알파벳만 있는 문자열로 변환한 후 회문 판단을 해보는 것이다.
예를 들어 P!o!Op!2 는 알파벳만 보면 PoOp이므로 회문이다.(대소문자는 구별하지 않는다)
또한, C~N@N은 알파벳만 보면 CNN이므로 회문이 아니다.
def isPalindrome(self, s: str) -> bool: deq = collections.deque() # 문자열에서 알파벳이 아닌 것 빼버리기 for char in s: if char.isalpha(): deq.append(char.lower()) # 양쪽에서 비교 while len(deq)>1: if deq.popleft() != deq.pop(): return False return True
즉, 반복문으로 char.isalpha로 알파벳이 아닌 문자를 제거해서 Deque에 문자를 저장한다. 회문을 판단하는 원리는 (1)과 동일하다.
정규표현식으로 표현하면 코드가 상당히 많이 줄어들어 깔끔해보인다. 아울러 파이썬다운 문법을 이용해서 더 깔끔하게 써보자.
def isPalindrome(self, s: str) -> bool: s = re.sub('[^A-Za-z]','',s) s = s.lower() return s == s[::-1]
sub함수로 알파벳이 아닌 문자는 전부 ''로 대체한다. 그리고 s == s[::-1]를 통해 회문 판단을 실행한다. s[::-1]은 문자열을 거꾸로한 것이다. 또한, 실행 속도도 빠르기 때문에 사용하기 좋다.