리트코드 알고리즘/리트코드 easy
(간단한 코드)리트코드 125. Valid Palindrome
문학적 딥러닝
2024. 12. 16. 23:21
우선 Palindrome의 뜻은 다음과 같다.
"영문을 전부 소문자로 바꾸고, 특수기호와 공백을 제거 한 후에 나온 결과물이, 앞뒤 대칭이면 palindrome이다"
여기서 주의 해야 할 점은, 저 문자열에는 "숫자"도 포함이라는 것이다.
우선 공백과 특수기호들을 없애줘야 하는데, 굳이 특별한 함수를 쓸 필요없이 for문을 사용하면 간단하다.
ans = ''
for char in s:
if char.isaplha(): #char이 문자인지 확인
ans += char.lower() #소문자로 바꿔서 ans에 더하기
elif char.isdigit(): #char이 숫자인지 확인
ans += char
여기서 ans는 알고리즘에서 자주 사용되는 answer의 약어이고, char는 character = 문자의 약어이다.
그리고 이를 더 간단하게 하는 방법도 있다.
ans = ''
for char in s:
if char.isalnum(): #숫자 혹은 문자인지 확인
ans += char.lower() #숫자는 lower을 해도 영향을 받지 않는다
이런 식으로 더 간단하게 바꾸는 방법도 있다.
그리고 이렇게 한번 주어진 문자열을 우리가 원하는 형태로 잘 바꾸었다면, 다음 단계로 가면된다.
여기서는 two pointer(투 포인터)라는 방법을 쓸 것인데, 간단하게 반복문을 사용하는데, 한개씩이 아닌 두개씩 확인하는 것이다.
l, r = 0, len(ans)-1 #l은 첫번째 인덱스, r은 마지막 인덱스를 가리킨다
while l < r:
if ans[l] == ans[r]:
l += 1
r -= 1
else:
return Fasle # 대칭이 아니면 False 반환
이렇게 앞뒤로 확인을 하는 이유는 전체 데이터를 절반 횟수 만큼 확인하면 되기 때문이다.
간단하게 생각하면, 프린트물을 왼쪽 끝과 오른쪽 끝 양쪽에서 나눠주기 시작하면, 훨씬 효율적으로 시간을 절약할 수 있다는 것이다.
완성된 코드는 다음과 같다.
class Solution:
def isPalindrome(self, s: str) -> bool:
if s == '': return True
ans = ''
for char in s:
if char.isalpha():
ans += char.lower()
elif char.isdigit():
ans += char
l, r = 0, len(ans)-1
while l < r:
if ans[l] == ans[r]:
l += 1
r -= 1
else:
return False
return True