프로그래밍/[ Python ]

[문자열 조작] 유효한 팰린드롬

gooooooood 2021. 1. 11. 06:57
반응형

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

 

예제 1

# 입력
"A man, a plan, a canal: Panama"

# 출력
true

 

예제 2

# 입력
"race a car"

# 출력
false

풀이 1. 리스트로 변환

def isPalindrome(self, s: str) -> bool:
    """
    전처리
    """
    strs = []
    for char in s:
        if char.isalnum(): # 영문자, 숫자만을 대상
            strs.append(char.lower()) # 대소문자 구문 없으므로 소문자로 변환

    # -> strs = ['a', 'm', 'a', 'n', 'a', 'p', 'l', 'a', 'n', 'a', 
    #            'c', 'a', 'n', 'a', 'l', 'p', 'a', 'n', 'a', 'm', 'a']

    """
    팰린드롬 판별
    """
    while len(strs) > 1: # 리스트의 모든 원소 비교
        if strs.pop(0) != strs.pop(): # pop() 함수는 인덱스 지정이 가능하여 이처럼 맨앞과 맨뒤를 비교
            return False # 값이 서로 다르면 팰린드롬이 아니기 때문에 False 리턴
    
    return True # 모든 값이 같으면 팰린드롬으로 판단하여 True 리턴
        

 

풀이 2. 데크 자료형을 이용한 최적화

def isPalindrome(self, s: str) -> bool:
	# 데크 자료형으로 선언
    strs: Deque = collections.deque()
    
    for char in s:
    	if char.isalnum():
        	strs.append(char.lower())
            
    # 리스트의 pop(0)은 O(n)인 데 반해, 데크의 popleft는 O(1)이기 때문에 이전 풀이와
    # 성능을 비교했을 때 속도를 훨씬 높일 수 있다.
    while len(strs) > 1:
    	if strs.popleft() != strs.pop():
        	return False
   
    return True

 

풀이 3. 슬라이싱 사용

def isPalindrome(self, s: str) -> bool:
	s = s.lower()
	s = re.sub('[^a-z0-0]', '', s) # 정규식으로 불필요 문자 필터링
    
	# 슬라이싱으로 s[::-1]으로 문자열 리스트를 뒤집을 수 있기 때문에 아래와 같이
	# 간편하게 비교가 가능하다. (슬라이싱은 C로 빠르게 구현되어 훨씬 더 빠르다)
	return s == s[::-1]
반응형

'프로그래밍 > [ Python ]' 카테고리의 다른 글

[문자열 조작] 로그 파일 재정렬  (0) 2021.01.11
[문자열 조작] 문자열 뒤집기  (0) 2021.01.11
[1-2] 파이썬  (0) 2020.11.18
[1-1] 코딩 인터뷰  (0) 2020.11.17
[Python] bisect  (0) 2020.08.24