일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 백준 #파이썬 #bfs #백트래킹 #1697 #숨바꼭질
- leetcode #python #dfs #재귀
- 파이썬 #zip
- 다익스트라 #dijkstra #leetcode #파이썬 #python #algorithm #787
- leetcode #subsets #dfs #itertools #python
- AsyncTask #doinbackground #스레드 #thread #android #안드로이드
- 아스테리스크 #Asterisk #파이썬
- Python #leetcode #dfs #그래프 #백트래킹
- dfs #bfs #트리구조 #이진트리 #leetcode #python #파이썬
- python #백준 #2580 #스도쿠 #dfs #백트래킹
- gcd #최대공약수 #백준 #2981 #검문
- exoplayer #mediaplayer #엑소플레이어 #안드로이드 #android
- dfs #bfs #leetcode #python
- context #android #getApplicationContext #activity #생명주기 #lifecycle
- handler #looper #thread #runnable #핸들러 #루퍼 #스레드 #러너블
- dfs #bfs #트리구조 #이진트리 #leetcode #파이썬 #python
- dfs #leetcode #python
- python #백준 #9375 #패션왕 #신해빈
- dfs #python #leetcode #combination
- 2004 #조합 0의 개수 #백준
- 해시테이블 #heapq #파이썬 #리트코드 #알고리즘
- 리트코드 #팰린드롬 #파이썬
- dfs #leetcode #python #graph #그래프
- 다익스트라 #알고리즘 #bfs #그리디 #다이나믹프로그래밍 #leetcode #python
- dfs #그래프 #graph #python #leetcode #course #schedule
- dfs #이진트리 #트리구조 #직렬화 #역직렬화 #파이썬 #리트코드 #leetcode #python
- final #java #자바 #안드로이드
- 코틀린 #Do it #깡샘 #안드로이드
- dfs #python #leetcode
- dfs #bfs #이진트리 #파이썬 #리트코드
- Today
- Total
멋진 개발자가 되고 싶다
[125번]유효한 팰린드롬(Valid-palindrome) 본문
'팰린드롬'이란 앞뒤가 똑같은 단어나 문장을 말한다. 예를 들어, 기러기나 AOA 같은?? 예가 안 떠오른다. 아무튼.
내가 직접 작성한 코드
|
해설:
''.join(s)는 s의 요소들을 하나의 문자열로 묶는다.
여기서 s가 꼭 리스트일 필요는 없다.
(위의 경우 filter(str.isalnum, s)는 filter 객체)
filter(조건 함수, 순회 가능한 데이터)는 순회 가능한 데이터 s가
조건 함수인 isalnum에 하나씩 들어가면서 조건 여부를 판별한다.
isalnum()은 문자열이 영어, 한글, 숫자일 경우 True, 그렇지 않으면 False를 리턴한다.
그 후 반복문을 이용하여 앞뒤 문자를 비교하였다.
RunTime : 36ms
** 다양한 풀이 **
1. 리스트로 변환
|
cs |
해설:
s의 문자를 하나씩 isalnum() 함수로 영어,한글,숫자 여부를 체크하여
True면 만들어둔 리스트 strs에 소문자로 입력.
이후 팰린드롬 판별 과정에서 리스트의 pop()을 이용하여 리스트 맨 앞과 맨 뒤를 비교하는 식으로 진행한다.
RunTime : 280ms
2. 데크(Deque) 자료형을 이용한 최적화
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class Solution:
def isPalindrome(self, s: str) -> bool:
# 자료형을 deque로 선언
strs = collections.deque()
# 문자열 with 특수문자 -> 리스트 without 특수문자
for char in s:
if char.isalnum():
strs.append(char.lower())
# 팰린드롬 여부 판별
while (len(strs) > 1):
if strs.popleft() != strs.pop():
return False
return True
|
cs |
해설:
1번 풀이에서 자료형을 리스트가 아닌 deque로 선언해주고
팰린드롬 여부 판별에서 strs.pop(0)이 아닌 strs.popleft()를 사용하였다.
하지만 런타임은 6배 정도의 차이를 보였다.
그 이유는 리스트는 que인데 pop(0)이 O(n)인데 반해, deque는 popleft()가 O(1)이기 때문이다.
각각 n번씩 반복하면 O(n^2), O(n)으로 성능 차이가 크다.
RunTime : 48ms
3. 슬라이싱 사용
1
2
3
4
5
6
7
|
class Solution:
def isPalindrome(self, s: str) -> bool:
s = s.lower()
# 정규식으로 불필요한 문자 필터링
s = re.sub('[^a-z0-9]', '',s)
return s == s[::-1] # 슬라이싱
|
cs |
해설:
문자열 s에서 대문자를 소문자로 바꿔준 다음
정규표현식으로 불필요한 문자를 필터링하였고
마지막으로 s와 뒤집은 s를 비교한 결과를 리턴하였다.
※ 정규표현식:
특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어.
a-z는 a, b, c,,, z를 의미하고 0-9는 0,1,2,,,9를 의미한다.
[]는 '대괄호 안에 포함된 문자들 중 하나와 매치'를 뜻한다.
[] 안에 있는 ^는 '반대'의 의미를 담고 있다.
따라서 [^a-z0-9]를 해석하면 나'a~z, 0~9가 아닌 문자들 중 하나'이다.
즉, s = re.sub('[^a-z0-9]', '', s)는
문자열 s에서 문자마다 특수문자이면 ''으로 대체하겠다는 의미이다.
출처 : 파이썬 알고리즘 인터뷰 (글 : 박상길 그림 : 정진호) [책만]
'Algorithm Study > leetcode' 카테고리의 다른 글
[LeetCode] 5. 가장 긴 팰린드롬 부분 문자열(Longest Palindrom Substring) (0) | 2021.06.26 |
---|---|
[LeetCode] 49. 그룹 애너그램(Group Anagrams) (0) | 2021.06.26 |
[LeetCode] 819. 가장 흔한 단어(Most Common Word) (0) | 2021.06.25 |
[LeetCode] 937. 로그 파일 재정렬(Reorder Log Files) (0) | 2021.06.25 |
[LeetCode] 344. 문자열 뒤집기( Reverse String) (0) | 2021.06.24 |