문자열조작 팰린드롬

のの·2021년 1월 11일
0

주어진 문자열이 팰린드롬인지 확인하라.
대소문자를 구분하지 않으며, 영문자와 숫자만을 대상으로 한다.

from collections import deque
import re


def isPalindrome(s: str) -> bool:
    str_list = list(s)
    strs = [s.lower() for s in str_list if s.isalnum()]

    # 양쪽에서 pop을 하여 두 문자가 일치하는지 여부를 파악
    while len(strs) > 1:
        if strs.pop(0) != strs.pop():
            return False

    return True


def isPalindrome_deque(s: str) -> bool:
    # 자료형 데크로 선언
    strs = deque([char.lower() for char in s if char.isalnum()])

    while len(strs) > 1:
        if strs.popleft() != strs.pop():
            return False

    return True


def isPalindrome_slicing(s: str) -> bool:
    s = s.lower()
    s = re.sub('[^a-z0-9]','',s)
    return s == s[::-1]


if __name__ == '__main__':
    print(isPalindrome('A man, a plan, a canal: Panama'))
    print(isPalindrome_deque("race a car"))
    print(isPalindrome_slicing("A man, a plan, a canal: Panama"))```

문자열 슬라이싱

내부적으로 매우 빠르게 동작. 위치를 지정하면 해당 위치의 배열 포인터를 얻게 되며 이를 통해 연결된 객체를 찾아 실제 값을 찾아내는데, 이 과정은 매우 빠르게 진행되므로 문자열을 조작할 때는 항상 슬라이싱을 우선으로 사용하는 편이 속도 개선에 유리하다.

문자열을 별도로 리스트로 매핑하는 등의 처리는 데이터 구조를 다루는 입장에서는 좋은 방법이지만, 별도 자료형으로 매핑하는 과정에서 상당한 연산 비용이 필요하므로 전체적인 속도에서는 오히려 손해를 볼 수 있다. 대부분의 문자열 작업은 슬라이싱으로 처리하는 편이 가장 빠르다.

profile
wannabe developer

0개의 댓글