부부의 코딩 성장 일기

LeetCode 125(Valid Palindrome, Python) 본문

Algorithm/LeetCode

LeetCode 125(Valid Palindrome, Python)

제로_콜라 2023. 11. 28. 19:00

1. 문제 링크

 

Valid Palindrome - LeetCode

Can you solve this real interview question? Valid Palindrome - 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 cha

leetcode.com

2. 문제 설명

  • 주어진 문자열이 좌우대칭인 지 확인하여 True, False를 반환
  • 단, 기호는 제외하고 숫자와 알파벳만 대상으로 하며, 대문자 소문자 차이는 무시함
  • 예시) "A man, a plan, a canal: Panama"는 True

3. 처음 풀이

  • str.lower() 이용하여 주어진 문자열에 포함된 대문자를 모두 소문자로 바꾼 후
  • s.isalnum() 이용하여 알파벳이나 숫자인 것만 리스트에 모아준 후
  • .join() 이용하여 리스트를 다시 문자열로 바꾼 후
  • str == str[::-1] 통해 문자열이 그 역순과 일치하는지 확인
class Solution:
    def isPalindrome(self, s: str) -> bool:
        s = s.lower() #대문자를 소문자로
        a = [x for x in s if x.isalnum()] #알파벳과 숫자만 리스트로
        a = ''.join(a) #리스트를 문자열로
        if a == a[::-1]: #뒤집어도 같은지
            return True
        else:
            return False

4. 다른 풀이

  • filter 함수를 이용할 수 있음
  • filter 함수는 두 인자를 받아 iterable한 객체를 반환
  • 첫번째 인수는 참/거짓을 따지는 함수, 두번째 인수는 iterable한 객체
  • filter 이용하여 isalnum(알파벳 또는 숫자인지 확인)이 True 나오는 것을 iterable로 반환하고 이를 다시 join 함수로 엮어준다. 
class Solution:
    def isPalindrome(self, s: str) -> bool:
        s = ''.join(filter(str.isalnum, s)).lower()
        
        return s == s[::-1]

5. 배운 점

  • 문자열 관련 함수
    함수 설명 사용법
    upper() 문자열을 대문자로 변경 st.upper()
    lower() 문자열을 소문자로 변경 st.lower()
    capitalize() 처음단어를 대문자로 변경 나머지단어를 소문자로 변경 st.capitalize()
    split() 문자열의 문자를 나눔 st.splite()
    splitlines() 문자열을 쪼갤때 사용 st.splitlines()
    join() 문자열에 삽입을 지정할때 사용 '체울문자'.join(st)st.join('체울문자')
    center() 칸수를 체울때 사용합니다 st.center(칸수,체울값)
    ljust() 왼쪽부터 칸수확보 st.ljust(칸수,체울값)
    rjust() 오른쪽부터 칸수확보 st.rjust(칸수,체울값)
    zfill() 오른쪽부터 칸수 확보하고 나머지는 0으로 체움 st.zfill(칸수)
    isdigit() 숫자로만 구성되있으면  : True아니면 : False 값 반환 st.isdigit()st[범위:범위].isdigit()
    isalpha() 글자로 구성되어있으면 : True아니면 False 값 반환 st.isalpha()st[범위:범위].isalpha()
    isalnum() 글자 또는 숫자로 구성되어있으면 : True아니면 False 값 반환 st.isalnum()st[범위:범위].isalnum()
    islower() 소문자로 구성되있으면 : True아니면 False 값 반환 st.islower()st[범위:범위].islower()
    isupper() 대문자로 구성되있으면 : True아니면 False 값 반환 st.isupper()st[범위:범위].isupper()
    isspace() 공백으로 이루어져 있으면 : True아니면 False 값 반환 st.isspace()st[범위:범위].isspace()
  • filter 함수
    • filter(function, iterable)은 iterable한 객체 중 funtion이 True가 되는 대상만 모아 iterable한 객체로 반환해줌.
    • 이를 다시 list로 묶거나 join 하여 사용하는 경우가 많다. 
a = 'There are 10 dogs'
c = list(filter(str.isalpha, a)) #iteralbe한 a의 객체 중 str.isalpha가 True인 대상만 모아 iterable 객체 반환
c =''.join(c)

print(c)
# Therearedogs
a = 'There are 10 dogs'
c = str(filter(str.isalpha, a)) #filter를 join해버리면 문자열 

print(c)
# <filter object at 0x030DFE10>
  • '구분자'.join(iterable, 주로 리스트) 이용하여 문자열 합치기
    • join 함수는 매개변수로 들어온 리스트에 있는 요소 하나하나를 합쳐서 하나의 문자열로 바꾸어 반환하는 함수
    • 구분자에 공백 없이 ''.join()하면 그냥 연결되고 구분자에 콤마, 언더바 등을 넣으면 문자 사이 사이에 구분자가 들어감
words = ['Hello', ' ', 'world', '!']
result = ''.join(words)

print(result)
#Hello world!

words = ['apple', 'orange', 'banana']
result_with_comma = ', '.join(words)

print(result_with_comma)
#apple, orange, banana