상세 컨텐츠

본문 제목

복잡한 isPalindrome / 정규표현식 re.sub() or isalnum() / leetcode 125번

소프트웨어/자료구조 + 알고리즘

by moonionn 2021. 3. 6. 22:49

본문

leetcode.com/problems/valid-palindrome/

 

Valid Palindrome - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

Palindrome(회문)

Palindrome은 앞뒤가 똑같은 단어나 문장을 뜻합니다.

(내 이름은 이효리 거꾸로 해도 이효리)

tenet, level, rotator 등이 대표적인 예입니다.

 

주어진 예문이 단순 단어라면 편하겠지만

만약 아래와 같은 특수기호를 포함한 문장이 주어진다면

특수기호를 어떤 방식으로 걸러내야 할까요?

string = '여보게 저기! 저게 보여?'

 

1. .isalnum()

.isalnum() 메소드는 영문자, 숫자만을 걸러주는 기능을 합니다.

따라서 물음표 따옴표 등 특수기호는 걸러집니다.

def isPalindrome(string: str) -> bool:
    string = list(filter(lambda x: x.isalnum(), string.lower()))
    return string == string[::-1]
    
# leetcode 사이트 런타임 시간: 36ms

 

2. 정규표현식 ( re.sub() )

정규표현식으로도 필터링을 할 수 있습니다.

re 모듈을 사용하면 re.sub() 이라는 메소드를 사용할 수 있습니다.

개인적으로 filter와 람다식을 쓰는 방식보다

re.sub() 가 훨씬 가독성이 좋은 것 같습니다.

import re

def isPalindrome(string: str) -> bool:
    string = re.sub('\W', '', string.lower()) #숫자나 문자가 아닌 것을 지우는 코드
    return string == string[::-1]
    
# leetcode 사이트 런타임 시간: 24ms

 

2. re.sub( ) 이란?

re.sub()은 주어진 문자열에 첫번째 인자인 교체 패턴을 적용시켜 값을 replace 시킵니다.

 

2-1. 형식

re.sub(교체 패턴, 대상 문자열, 교체수(count=0), 플래그(flags=0))

 

2-1-1. 교체 패턴

정말 수많은 교체 패턴이 존재하지만...

여기 팰린드롬을 판별을 위해서 쓸 수 있는 몇 가지만 언급하자면 아래와 같습니다.

 

  • \W : 문자+숫자가 아닌 문자와 매치
  • \D : 숫자가 아닌 것과 매치
  • \S : whitespace 문자가 아닌 것과 매치
  • 그리고 각 W,D,S 를 소문자로 쓰면 해당 타입과 동일한 것과 매치합니다.
  • (ex: \w 는 문자+숫자인 것과 매치 )

 

문자 클래스

그리고 원래 기본적으로 문자 클래스는 [] 로 표기합니다.

[] 안에 들어간 규칙이 포함된 문자열이 교체대상이 됩니다.

예를 들면 아래와 같습니다.

string = 'Hahahaha'
string = re.sub('[a]', 'i', string)	#모든 a를 i로 변경
print(string)

# 결과: Hihihihi

 

[a-z]는 소문자 a부터 z까지를 뜻합니다.

[0-9]는 모든 숫자를 뜻합니다.

그리고 문자 클래스 앞에 ^가 붙으면 반대의 뜻을 가지게 됩니다.

예시로 이해해봅시다.

 

  • \W 는 [^a-zA-Z0-9_] 와 같다.
  • \d 는 [0-9] 와 같다.

 

2-1-2. 교체 수 설정

기본값은 0으로, 패턴에 해당되는 모든 값을 변경합니다.

count값을 설정해주면 설정해준 값만큼만 값이 변경됩니다.

string = 'Hahahaha'
string = re.sub('[a]', 'i', string, count=2)
print(string)

# 결과: Hihihaha

 

관련글 더보기

댓글 영역