[LeetCode] 125. Valid Palindrome 파이썬 풀이

헬리코박도·2021년 12월 1일
0
post-thumbnail

https://leetcode.com/problems/valid-palindrome/

문제 설명

팰린드롬 Palindrome, 회문(回文)은 거꾸로해도 동일한 문자열을 가리킨다.
예를 들어 "abccba"의 경우 거꾸로 뒤집어도 "abccba"니까 팰린드롬이다.

이 문제는 주어진 문자열이 회문인지 여부를 판별하여 boolean으로 리턴하는 문제이다.

이 때 조건이 주어지는데 대문자는 모두 소문자로 바꾸고 알파벳이나 숫자가 아닌 문자는 제거했을 때 팰린드롬인 것을 찾아야 한다.

코드 구현

핵심적인 부분을 정리하자면

  • 소문자로 바꾸기
  • 숫자나 알파벳이 아닌 거 제거하기
  • 회문인지 검사하기

이 세 가지를 각각 나눠서 생각할 수 있을 것이다.

소문자로 바꾸는 건 파이썬에서 문자열이나 문자에 lower() 메소드를 내장하고 있어서 이를 사용해주면 해당 객체를 소문자로 변환한 값을 리턴해준다.

마찬가지로 isalnum()이라는 메소드도 있어서 해당 객체가 숫자나 알파벳인지를 bool 타입으로 반환해준다.

만약 내가 문자열을 다루는 함수를 쓰지 않는다면 유니코드 값을 구해서 대문자인 것은 소문자 범위로 빼줄 거고 숫자와 소문자 범위 내에 있지 않은 것은 제거해주도록 짤 것이다.

회문인지 검사하는 부분은 인덱싱과 반복문을 통해 앞뒤를 비교하거나 deque에 넣고 양쪽을 pop하면서 비교할 수 있을 것이다.

근데 파이썬은 문자열에도 비교 연산자를 지원하니까 그냥 간단하게 뒤집어서 원래 문자열이랑 비교해주면 된다.

내 풀이: 리스트 내포와 슬라이싱 활용

책에서 했던 정규표현식과 슬라이싱을 활용하는 방식이 떠올랐는데 정규표현식쓰는 법을 까먹어서 일단 리스트 컴프리헨션으로 소문자로 만들고 알파벳이나 숫자인 것만 가져온 다음 슬라이싱으로 뒤집은 것과 뒤집지 않은 것을 비교하여 T or F를 반환하게 만들었다.

class Solution:
    def isPalindrome(self, s: str) -> bool:
        new = [c for c in s.lower() if c.isalnum()]
        return new == new[::-1]

보통 슬라이싱은 [start:end]로 많이 사용하는데 사실 :를 하나 더 붙이고 뒤에 몇 개씩 넘어갈지 쓸 수 있다. 예를 들어 0:5:2라고 쓰면 인덱스 0부터 4까지 2개씩 넘어가며 슬라이싱될 것이다. -1을 넣어주었으니 여기서는 역순으로 가져온다는 것이다.

정규표현식과 슬라이싱 활용

정규표현식과 슬라이싱을 사용한 풀이이다.
정규표현식은 re 라이브러리를 import하여 다룰 수 있다. 리트코드에서는 기본적으로 re 라이브러리를 import되어 있으므로 따로 import re를 추가할 필요 없이 바로 쓰면 된다.

class Solution:
  def isPalindrome(self, s: str) -> bool:
      s = s.lower()
      s = re.sub('[^a-z0-9]', '', s)

      return s == s[::-1]

sub는 패턴에 해당하는 문자를 입력한 문자로 대체시켜준다. [^a-z0-9]패턴은 "숫자와 알파벳 소문자가 아닌 것"을 의미하므로 이것들이 "" 공백으로 바뀐다. 즉, 제거된다.

profile
Data Engineer

0개의 댓글