Algorithm/1일 1코테

[🥰 leetcode] 1328. Break a Palindrome

대인보우 2022. 10. 18. 11:28
반응형

 

https://leetcode.com/problems/break-a-palindrome/

 

Break a Palindrome - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

팰린드롬 문자열을 단 한가지의 문자만 바꾸어

팰린드롬이 아니면서 && 사전식 순서에서 가장 작은 값으로 만드는 문제

 

예를 들어

abccba => aaccba

 

나의 풀이

class Solution:
    def breakPalindrome(self, palindrome: str) -> str:
        
        # 팰린드롬인지 체크하는 함수
        def isPalindrome(p):
            return p == p[::-1]
		
        # 길이가 1이면 팰린드롬이 아닐 수 없기 때문에 공백 리턴
        if len(palindrome) == 1:
            return ""
        
        p_list = list(palindrome)
        for i, a in enumerate(p_list):
        	# 'a'일 경우에는 원래는 그냥 넘어감 (이미 최솟값)
            if a == 'a' :
            	# 근데 a가 마지막 값인 경우 'aaa'에는 마지막 값을 b로 바꿔주어야 함
                if len(p_list)-1 == i:
                    p_list[i] = 'b'
                    return ''.join(p_list)
                continue
           	# 'a'가 아니라면 'a'로 바꿔줌 (가장 작은 값)
            p_list[i] = 'a'
            
            # 팰린드롬인지 확인
            if isPalindrome(''.join(p_list)) == False:
                return ''.join(p_list)
            else:
                p_list[i] = a
        
        return ""

 

다른 사람 풀이

class Solution:
    def breakPalindrome(self, s: str) -> str:
    	# 길이 계산 
        n = len(s)
        
        # n을 반으로 나누어서 앞의 반 부분만 변경(팰린드롬 이니까????)
        # 'a'가 아닐 경우 a로 바꿔줌
        for i in range(n//2):
            if (s[i]!='a'):
                return s[:i]+'a'+s[i+1:]
        
        # 아무것도 a로 바뀌어지지 않았을 경우에는 마지막에 b로 바꿔줌
        # 단 길이가 1보다 작으면 ''
        return s[:-1]+'b' if n>1 else ''
반응형