목차
👀, 🤷♀️ , 📜
이 아이콘들을 누르시면 코드, 개념 부가 설명을 보실 수 있습니다:)
유효한 팰린드롬
난이도 | ★
문제
A phrase is a palindrome if, after converting all uppercase letters into lowercase letters and removing all non-alphanumeric characters, it reads the same forward and backward. Alphanumeric characters include letters and numbers.
Given a string s, return true if it is a palindrome, or false otherwise.
Example 1:
Input: s = "A man, a plan, a canal: Panama"
Output: true
#Explanation: "amanaplanacanalpanama" is a palindrome.
Example 2:
Input: s = "race a car"
Output: false
#Explanation: "raceacar" is not a palindrome.
Example 3:
Input: s = " "
Output: true
#Explanation: s is an empty string "" after removing non-alphanumeric characters.
#Since an empty string reads the same forward and backward, it is a palindrome.
[전제]
* 1 <= s.length <= 2 * 105
* s consists only of printable ASCII characters.
‘팰린드롬’ 이란?
앞뒤가 똑같은 단어나 문장으로, 뒤집어도 같은 말이 되는 단어 또는 문장이다.
우리 말로는 ‘회문’이라고 부른다.
예를 들어,
race a car를 보자. 이 문장에 띄어쓰기를 없애면 raceacar이다.
이 문장은 뒤집어도 race a car이다.
이러한 팰린드롬의 특징을 이용하면 많은 문제들을 만들어 낼 수 있기 때문에 코딩 테스트에 자주 출제되기도 한다.
풀이과정
이 문제는 크게 두가지 과정을 거친다.
1️⃣ 전처리: 모두 소문자로 바꾸고 영문자와 숫자만 골라내기
2️⃣ 골라낸 것들의 팰린드롬 판별하기
1. 전처리
먼저 영문자와 숫자만 골라낸 후,
골라낸 것들을 소문자로 바꿔야 한다.
영문자와 숫자와 골라내는 매서드는 바꿀 것.isalnum()이다.
이건 is+alphabet+number라고 기억해두면 좋다.
생각보다 많이 쓰이니까 기억해두자.
그리고 골라낸 것들을 소문자로 바꾸는 매서드는 바꿀 것.lower()이다.
즉 이를 이용하여 코드를 짜보면
def isPalindrome(self, s: str) -> bool:
str = [] # 소문자인 알파벳과 숫자만 넣을 곳
for i in s: # 하나하나 둘러보자
if i.isalnum(): # 숫자와 골라내는 매서드
str.append(i.lower()) # 소문자로 바꾸는 매서드

📜 과정 자세히 보기
2. 팰린드롬 판별
먼저 넣은 str을 한번씩 봐야된다.
여기에 앞 뒤를 하나씩 꺼내서 보는 것 이다.
앞에 것을 pop(0)을 통해 꺼내고 뒤의 것을 pop()을 통해 꺼낸다.
그리고 이 두개를 비교한다.
그래서 계속 같으면 True 다르면 False를 return하면 된다.
while len(str) > 1:
if str.pop(0) != str.pop():
return False
return True

📜 과정 자세히 보기
PLUS) 데크 자료형을 이용한 최적화
전체 과정을 위와 똑같다
class Solution:
def isPalindrome(self, s: str) -> bool:
str: Deque = collections.deque() # 데크선언
for i in s:
if i.isalnum():
str.append(i.lower())
while len(str) > 1:
if str.popleft() != str.pop():
return False
return True
전체 코드
위를 구현한 전체 코드는 다음과 같다
class Solution:
def isPalindrome(self, s: str) -> bool:
str = []
for i in s:
if i.isalnum():
str.append(i.lower())
while len(str) > 1:
if str.pop(0) != str.pop():
return False
return True