소스코드

https://leetcode.com/problems/longest-palindromic-substring/

문제 코드- Longest Palindrome Substring

class Solution:  
    def longestPalindrome(self, s: str) -> str:  
        # base case 0 , 1개 -> 자기자신  
        if len(s) <= 1:  
            return s  
        else:  
            # recursive step  
            # 양쪽 끝이 같다면!  
            if s[0] == s[-1]:  
                return s[0] + self.longestPalindrome(s[1:-1]) + s[-1]  
            # 양쪽 끝이 다른 경우  
            else: # abcb 라면!  
                # abc를 recursive하게  
                a = self.longestPalindrome(s[:-1])  
                # bcb를 recursive하게  
                b = self.longestPalindrome(s[1:])  
                # recursive하게 한 것 중에서 긴 애를 리턴해!  
                return a if len(a) >= len(b) else b  


solution_instance = Solution()  
s = input()  
ans = solution_instance.longestPalindrome(s)  
print(ans)

문제 접근 방식

Recursive한 방식으로 접근해보면 어떨까! 라는 생각으로
제일 큰 덩어리에서
만약에 양쪽이 같다면 -> return 처음 글자 + 함수(양쪽 뗀거) + 마지막 글자
만약에 양쪽이 다르다면 -> return 함수(처음 글자만 뗀 것), 함수(마지막 글자 뗀 것) 중에서 긴 애를 리턴!

base Case는 길이가 0이랑 1인 경우에는 자기 자신을 리턴해서 "" 또는 자기자신을 리턴하도록 만들었음.

문제 상황

근데 양쪽 끝에서부터 판별하다보니까, 안쪽에서 펠린드롬이 아니면 리턴했을 때 펠린드롬이 성립하지 않는 문제가 있음

예를들어 'aabcaa'의 경우에는 aa 가 나와야하는데, "a ( a( bc )a) a" 이라서 'aabaa'가 나옴

질문 내용

어떤 로직을 고치면 recursive하게 문제를 해결할 수 있을까요?

* 추가 : 왼쪽과 오른쪽 포인터를 이용해서 안쪽에서부터 바깥으로 쌓아가는 알고리즘 밖에 방법이 없을까요..?

답변

겉에서부터 붙이는 알고리즘은 아마 쓰기 힘들 것..
로직이 안쪽부터 판별해야 해서, 바깥에서부터 판별하면 문제가 생길 것.

'항해99 > [항해99] 알고리즘' 카테고리의 다른 글

[항해99] DFS  (0) 2023.12.16
[항해99] HashTable  (0) 2023.12.16
[항해99] Queue  (0) 2023.12.14
[항해99] Stack  (0) 2023.12.14
[항해99] LinkedList  (0) 2023.12.13