티스토리 뷰

알고리즘/Leetcode

[Leetcode] 131. Palindrome Partitioning

응애~ 개발자 2024. 3. 13. 08:08
728x90
반응형

문제 요약

문제풀이

 이번 문제에는 백트레킹 관련 문제이다. 백트레킹 관련 자세한 내용은 아래 글에서 참고 하면된다.

https://jih3508.tistory.com/84

 

[알고리즘 이론] 백트래킹(Backtracking)

이론 이번에 볼 알고리즘은 백트래킹이다. 백트래킹을 알아두면 대부분 해를 찾는데 도움이 될것이다. 백트레킹은 탐색하는 도중 중복되거나 해를 찾는 방향이 맞지 안 맞으면 그 부분을 탐색

jih3508.tistory.com

문제 접근방법

  Palindrome은 문자열뒤집었을때 같은 문자열을 말한다. 예를 들어 '기러기', '토마토' 같은 문자열이다. 이번 문제에서는 부분 문자열 슬라이싱하고 문자열 뒤집기만 하면 문제푸는데에 크게 지장이 없다. 구현 순서는 아래와 같이 하면 된다.

  1. 파라미터는 정수 N과 리스트로 한다. 그리고 N은 0부터 시작한다.
  2. N부터 해서 문자열 길이까지 반목문 i로 돌린다.
  3. N부터 i까지 문자열을 추출하고 거꾸로 뒤집어서 같으면 리스트에 추가하고 i+1로 그 다음을 진행한다.
  4. N이 문자열 길이가 같으면 목록을 추가한다.

Code

Python

class Solution:

    def partition(self, s: str) :
        self.s = s
        self.length = len(s)
        self.result = []
        self.backtracking(0)
        return self.result

    def backtracking(self, n , p = []):
        if(n == self.length):
            self.result.append(p)

        for i in range(n + 1, self.length + 1):
            string = self.s[n : i]
            # 문자열 같으면 리스트에 저장 하고 그 다음을 진행한다.
            if string == string[::-1]:
                self.backtracking(i, p + [string])


solution = Solution()
s = "aab"
print(solution.partition(s))
s = "a"
print(solution.partition(s))
  • string[::-1]: [::-1]은 리스트또는 문자열을 거꾸로 한다.

Java

import java.util.ArrayList;
import java.util.List;

class Solution {
    List<List<String>> result;
	String s;
	int length;
	
	public List<List<String>> partition(String s) {
		this.s = s;
		this.length = s.length();
		this.result = new ArrayList<>();
		backtracking(0, new ArrayList<String>());
		
		return result;
    }
	
	public void backtracking(int n, ArrayList<String> p) {
		
		if (n == length) {
			List<String> add = new ArrayList<>();
			result.add(p);
		}
		
		String string;
		StringBuilder sb;
		for(int i = n + 1; i <= length; i++) {
			string = this.s.substring(n, i);
			sb = new StringBuilder(string);
            // 문자열 뒤집어서 같으면 추가 하고 그 다음 진행 한다.
			if(string.equals(sb.reverse().toString())) {
				p.add(string);
				backtracking(i,(ArrayList<String>) p.clone());
				p.remove(p.lastIndexOf(string));
			}
		}	
	}
}
  • StringBuilder(String): 문자열 연결할때 쓰는 Class이다. 그리고 .reverse() 문자열 뒤집는 메소드도 제공해준다.
  • (ArrayList<String>) p.clone(): CallByValue로 인하여 .clone을 사용한다. 안 그러면 목록안에 리스트도 값에 영향을 준다.
  • p.remove(p.lastIndexOf(string)): 탐색이 끝나면 리시트의 마지막 인덱스를 지워 줘야 한다.
728x90
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
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
글 보관함