본문 바로가기
Python/파이썬을 알고리즘 인터뷰

[ 6. 문자열 조작 ] - 유효한 팰린드롬(Valid Palindrome)

by YWTechIT 2021. 4. 2.
728x90

📍 유효한 팰린드롬

주어진 문자열이 팰린드롬인지 확인하라. 대소문자를 구분하지 않으며, 영문자와 숫자만을 대상으로 한다.

  • 팰린드롬(Palindrome): 거꾸로 읽어도 제대로 읽는 것과 같은 문장이나 낱말, 숫자, 문자열 등이다. 보통 낱말 사이에 있는 띄어쓰기나 문장 부호는 무시한다. (위키백과)

⚡️ 나의 풀이

팰린드롬은 위에서 작성한 바와 같이 띄어쓰기나 문장부호를 무시하고 거꾸로 읽어도 동일한 문장을 말한다. 나의 풀이 순서는 다음과 같다.

  1. 띄어쓰기나 문장부호를 없앤다
  2. 대소문자를 구분하지 않으므로 대문자 혹은 소문자로 통일시킨다.
  3. 기존 값과 거꾸로 한 값이 동일한지 확인한다.

방법 1을 풀기위한 아주 완벽한 함수가 있었다. 바로 isalnum()인데, 글자 또는 숫자로 구성되어있으면 True, 아니면 False값을 반환하는 문자열함수이다. 처음에 split('문장부호') 이런걸 써야하나 했는데, 이런 획기적인 함수가 있다니.. 기본적인 문자열 함수 몇 개 정도 알고 있으면 도움이 될듯하다.

 

return값에 and True or False라고 작성한 코드가 있는데, 프로그래머스를 풀면서 배운 단락평가 연산자이다.

728x90

그런데 여기서는 단락 연산자 대신 ==값만 return 하면 된다. 왜냐하면 True/False만을 리턴하면 되기때문에.. 나중에 논리연산자 혹은 을 리턴하는 문제에 단락 연산자를 넣도록 하자.

# 나의 첫번째 코드
def solution1(s):
    s_all = [i.lower() for i in s if i.isalnum()]
    if s_all == s_all[::-1]:
        return True
    return False

# 나의 두번째 수정 코드
def solution2(s):
    return [i.lower() for i in s if i.isalnum()] == [i.lower() for i in s if i.isalnum()][::-1] and True or False


# 나의 세번째 수정 코드
def solution3(s):
    return [i.lower() for i in s if i.isalnum()] == [i.lower() for i in s if i.isalnum()][::-1]

책에서는 while문을 이용해 pop() == pop(0)을 비교하는 코드를 작성했는데, 새로운 접근방법이라 신기했다. 그리고 pop을 사용할 때(정확히는 pop(0)) Deque를 사용하면 속도를 높일 수 있다고 설명했다.


리스트의 pop(0)O(N)인 반면, 데크의 popleft()O(1)이기 때문이다. 파이썬의 최적화를 위해서는 혹할만한 module이다. 정규식코드는 불필요한 문자를 필터링하고, 슬라이싱을 사용했는데, 아직까지 완벽하게 숙지하진 못했다. 😅 😅

# 리스트를 사용한 코드
def solution1(s):
    result = [i.lower() for i in s if i.isalnum()]
    while len(result) > 1:
        if result.pop() != result.pop(0):
            return False
    return True

# 데크(deque)를 사용한 코드
def solution2(s):
    result = deque(i.lower() for i in s if i.isalnum())
    while len(result) > 1:
        if result.pop() != result.popleft():
            return False
    return True

# 정규식을 사용한 코드
def solution3(s):
    s = s.lower()
    s = re.sub('[^a-z0-9]', '', s)
    return s == s[::-1]
반응형

댓글