리트코드 알고리즘/리트코드 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