알고리즘

분할 정복 예제 ( 괄호를 삽입하는 여러가지 방법)

jwjwvison 2022. 5. 21. 12:31

https://leetcode.com/problems/different-ways-to-add-parentheses/

 

 

 

 괄호를 어디에 추가하느냐에 따라 다양한 조합이 가능하다. 모든 조합을 계산해야 하는데 이는 다음 그림과 같이 분할 정복으로 가능하다.

 

 *,-,+ 연산자가 등장할 때 좌/우 분할을 하고 각각 계산 결과를 리턴한다. 분할된 값은 compute() 함수로 계산한 결과를 extend()로 확장한다.

 분할 결과를 리턴받으려면 input이 숫자형일 때 리턴하게 한다.

 

 계산하는 부분은 다음과 같다.

 eval() 함수는 문자열을 파싱하고 파이썬 표현식으로 처리해주는 Evaluate 역할을 한다.

class Solution:
    def diffWaysToCompute(self, expression: str) -> List[int]:
        def compute(left,right,op):
            results=[]
            
            for i in left:
                for r in right:
                    results.append(eval(str(i) +op + str(r)))
            return results
        
        results=[]
        print(expression)
        if expression.isdigit():
            return [int(expression)]
        
        
        for index,value in enumerate(expression):
            if value in "-+*":
                left = self.diffWaysToCompute(expression[:index])
                right=self.diffWaysToCompute(expression[index+1:])
                
                
                results.extend(compute(left,right,value))
                
        return results

'알고리즘' 카테고리의 다른 글

백준 1541번 - split() 함수의 활용  (0) 2022.06.23
연속합 - 백준 1912번  (0) 2022.06.17
분할 정복  (0) 2022.05.21
그리디 알고리즘 예제  (0) 2022.05.19
그리디 알고리즘  (0) 2022.05.19