본문 바로가기

개발/Algorithm

[리트코드] Valid Palindrome(python)

리트코드, Valid Palindrome_적절한 팰린드롬

 

TL;DR

  • 팰린드롬 : 원본과 원본을 뒤집었을 때가 동일한 경우. 예)"아 많다 많다 많다 많아"
  • 문자열 슬라이싱을 활용 할 수 있는가 

문제 분석

1. 주어진 문자열 s에 대해서 해당 문자열이 팰린드롬인지 아닌지를 판별하라.
2. 문자열은 알파벳 또는 숫자로만 이루어져 있다고 가정한다.

 

- 1 : 해결해야 하는 문제에 대해서 말하고 있다.

- 2 : 문제의 조건에 대해서 소개하고 있다. 주어지는 문자열 s에서 영어 대-소문자와 숫자를 제외한 문자들은 모두 무시해도 된다.

입출력 형태

입출력 예시

 

- 주어진 입력 s가 팰린드롬이라면 True를 아니라면 False를 반환해야 한다.

- 예시 1번에서 주어진 문자열 s에서 알파벳과 숫자로 이루어진 문자는 뒤집어도 동일한 팰린드롬이다. 따라서, True를 반환한다.

- 예시 2번은 뒤집었을 경우 "racaecar"가 되어, 팰린드롬이 아니다.

풀이

class Solution:
    def isPalindrome(self, s: str) -> bool:
    	# 알파벳과 숫자를 제외한 문자들을 걸러낸다. 대-소문자를 동일하게 처리하기 위해 lower로 소문자로 만든다.
        p = re.compile('[a-zA-Z\d]')
        word = ''.join(p.findall(s)).lower()

        return word == word[::-1] # 원본과 뒤집은 문자가 같은지 여부를 반환한다.

 

- `정규식`을 사용하여 알파벳과 숫자 외의 문자들을 걸러낸다.

- `lower()`를 통해 모든 알파벳을 소문자로 변경한다. 대소문자를 따로 비교할 필요가 없어진다.

- 원본 문자열인 `word`와 슬라이싱을 활용하여 뒤집은 문자열 `word[::-1]`을 비교한다.

 

- 문자열 슬라이싱 : [시작 인덱스(이상) : 종료 인덱스(미만) : 단계]

a = "안녕하세요."
a[:] # 안녕하세요. 문자열 전체 인덱스를 슬라이싱한 결과이다.
a[1:3] # 녕하, 1 <= 인덱스 < 3를 슬라이싱한 결과이다.
a[1:-2] # 녕하, - 인덱스로도 슬라이싱 할 수 있다.
a[::-1] # .요세하녕안 전체 인덱스를 -1만큼씩 이동하며 슬라이싱한다.
a[::2] # 안하요 전체 인덱스를 +2만큼씩 이동하며 슬라이싱한다.
반응형