📍 유효한 팰린드롬
주어진 문자열이 팰린드롬인지 확인하라. 대소문자를 구분하지 않으며, 영문자와 숫자만을 대상으로 한다.
팰린드롬(Palindrome)
: 거꾸로 읽어도 제대로 읽는 것과 같은 문장이나 낱말, 숫자, 문자열 등이다. 보통 낱말 사이에 있는 띄어쓰기나 문장 부호는 무시한다. (위키백과)
⚡️ 나의 풀이
팰린드롬은 위에서 작성한 바와 같이 띄어쓰기나 문장부호를 무시하고 거꾸로 읽어도 동일한 문장을 말한다. 나의 풀이 순서는 다음과 같다.
- 띄어쓰기나 문장부호를 없앤다
- 대소문자를 구분하지 않으므로 대문자 혹은 소문자로 통일시킨다.
- 기존 값과 거꾸로 한 값이 동일한지 확인한다.
방법 1
을 풀기위한 아주 완벽한 함수가 있었다. 바로 isalnum()
인데, 글자 또는 숫자로 구성되어있으면 True
, 아니면 False
값을 반환하는 문자열함수이다. 처음에 split('문장부호')
이런걸 써야하나 했는데, 이런 획기적인 함수가 있다니.. 기본적인 문자열 함수 몇 개 정도 알고 있으면 도움이 될듯하다.
return
값에 and True or False
라고 작성한 코드가 있는데, 프로그래머스를 풀면서 배운 단락평가
연산자이다.
그런데 여기서는 단락 연산자 대신 ==
값만 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]
'Python > 파이썬을 알고리즘 인터뷰' 카테고리의 다른 글
[ 6. 문자열 조작 ] - 그룹 애너그램(Group Anagrams) (0) | 2021.04.06 |
---|---|
[ 6. 문자열 조작 ] - 로그파일 재정렬 (Reorder Log Files) (0) | 2021.04.06 |
[ 6. 문자열 조작 ] - 가장 흔한 단어(Most Common Word) (0) | 2021.04.04 |
[ 6. 문자열 조작 ] - 문자열 뒤집기(Reverse String) (0) | 2021.04.02 |
[ 6. 문자열 조작 ] - 문자열 슬라이싱(String Slicing) (0) | 2021.04.02 |
댓글