https://leetcode.com/problems/palindrome-partitioning/description/
문제 분석
주어진 문자열 s를 파티셔닝할 때 파티셔닝한 모든 문자열이 팰린드롬인 경우만 출력합니다.
처음 시도한 답안
class Solution:
def partition(self, s: str) -> List[List[str]]:
answer = []
def dfs(i, path):
if i == len(s):
answer.append(path)
return
for j in range(i, len(s)):
a = s[i:j+1]
if a == a[::-1]:
dfs(j+1, path + [a])
dfs(0, [])
return answer
접근 방법
- DFS를 활용해 풀이합니다.
- dfs 내부에서
- 탐색한 깊이가 주어진 문자열 길이가 된다면 정답에 path를 추가합니다.
주어진 문자열을 모두 사용했다는 의미입니다. - 전달받은 i 부터 문자열 길이까지 반복합니다.
- 대상이 되는 문자열을 파티셔닝 합니다.
- 파티셔닝 된 문자열이 Palindrome 이라면 재귀적으로 dfs를 호출합니다.
- 탐색한 깊이가 주어진 문자열 길이가 된다면 정답에 path를 추가합니다.
DFS 내부의 순회가 동작하는 방식을 더 자세하게 설명하겠습니다.
- 초기 상태에서
- i=0, j=0, a[0:1]=a 인 상황, Palindrome O, path=[]
- i=1, j=1, a[1:1]=a 인 상황, Palindrome O, path=[a]
- i=2, j=2, a[2:3]=b 인 상황, Palindrome O, path=[a,a]
- i=3인 상황, 문자열의 길이와 동일, answer=[[a,a,b]]
- i=2, j=2, a[2:3]=b 인 상황, Palindrome O, path=[a,a]
- i=1, j=2, a[1:3]=ab 인 상황, Palindrome X, 재귀 호출 X
- i=1, j=1, a[1:1]=a 인 상황, Palindrome O, path=[a]
- i=0, j=1, a[0:2]=aa 인 상황, Palindrome O, path=[]
- i=2, j=2, a[2:3]=b 인 상황, Palindrome O, path=[aa]
- i=3인 상황, 문자열의 길이와 동일, answer=[[a,a,b], [aa,b]]
- i=2, j=2, a[2:3]=b 인 상황, Palindrome O, path=[aa]
- i=0, j=2, a[0:3]=aab, Palindrome X, 재귀 호출 X
위와 같은 상황으로 재귀적인 호출이 수행됩니다.
문자열을 반복문을 통해 파티셔닝하고 재귀적으로 호출하는 것을 알아내기에 어려웠던 문제입니다.
728x90
'SW개발 > 코딩테스트' 카테고리의 다른 글
[Leetcode]Implement Trie (Prefix Tree) (0) | 2024.04.23 |
---|---|
[LeetCode]Word Break (0) | 2024.04.22 |
[LeetCode]Edit Distance (1) | 2024.04.20 |
[LeetCode]Unique Paths (0) | 2024.04.19 |
[LeetCode]House Robber II (0) | 2024.04.18 |