BasicCalculator

Published at 2022-07-16

class Solution:
    def calculate(self, s: str) -> int:
        def calculater(calList):
            res = 0
            while calList:
                val = calList.pop()
                if val == '+':
                    res += int(calList.pop())
                elif val == '-':
                    res -= int(calList.pop())
                else:
                    res += int(val)
            return str(res)
        
        
        ans = 0
        stack = []
        tempNum = ''
        
        for ss in s:
            if ss == ')':
                stack.append(tempNum)  # 닫힌괄호 만나면 임시숫자문자열 먼저 넣음
                tempNum = ''
                
                cals = []  # 숫자와 연산자 담길 배열
                while stack[-1] != '(':
                    cals.append(stack.pop())
                
                stack.pop()  # 앞에 ( 제거
                tempNum = calculater(cals)
                
            elif ss == ' ':
                pass
            elif ss == '(':
                stack.append(ss)
            elif ss in ['+', '-']:  # 연산자 만나면 1.쌓아온 숫자 먼저 넣고, 2.연산자 넣음
                if tempNum == '':  # 맨앞 숫자 음수일경우 대비
                    # tempNum += ss
                    stack.append(ss)
                else:
                    stack.append(tempNum)
                    tempNum = ''
                    stack.append(ss)
            else:
                tempNum += ss  # 숫자 여러자리일 수 있으니 임시 문자열로 저장
                
        # 여기까지 하면 모든 괄호 계산은 완료
        while stack:
            val = stack.pop()
            if val == '+':
                ans += int(tempNum)
                tempNum = 0
            elif val == '-':
                ans -= int(tempNum)
                tempNum = 0
            else:
                tempNum += int(val)
                
        return ans + int(tempNum)  # 인풋이 0인경우 대비해서 int로