Palindrome String 처리

Urchinode·2021년 9월 12일
0

알고리즘

목록 보기
1/2
post-custom-banner

Palindrome?

Palindrome은 회문이라고도 하는데 문자열 순서를 거꾸로 바꾸어도 똑같은 문자열이다.

주어진 문자열이 회문인지 Python3으로 확인해보자.

Palindrome String인지 확인하는 방법

알파벳만 오는 경우

알파벳은 대문자(Upper)와 소문자(Lower)가 있으니까 이를 한 종류로 통일해서 확인하는게 좋다.

그 후, 문자열의 처음과 끝문자가 서로 같은지 확인하고
만약 같다면 그다음 문자들을 반복해서 확인한다.

이 원리를 다양한 방법으로 구현해보자.

(1). 리스트로 구현

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를 반환한다.

(2). Deque로 구현

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)과 동일하다.

(3). 정규표현식

정규표현식으로 표현하면 코드가 상당히 많이 줄어들어 깔끔해보인다. 아울러 파이썬다운 문법을 이용해서 더 깔끔하게 써보자.

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]은 문자열을 거꾸로한 것이다. 또한, 실행 속도도 빠르기 때문에 사용하기 좋다.

profile
Road to..
post-custom-banner

0개의 댓글