"Boldness has genius, power, and magic in it." - Johann Wolfgang von Goethe

SWEA

1224. [파이썬 S/W 문제해결 기본] 6일차 - 계산기3

Toproot 2021. 3. 3. 20:31
728x90
728x90

 

🚛 파이썬 SW 문제해결 기본 - Stack2

  • 주어진 계산식을 1) 후위표기식으로 변경하고 2) 그 표기식을 계산하는 문제입니다.
  • 연산자는 +, * 두 가지이고, 괄호의 유효성여부는 항상 옳은 경우만 주어집니다.

 

 

💡 아이디어

문제 그대로 후위표기식으로 주어진 문자열을 변경하고, 계산해주는 함수를 만들었습니다.
후위표기식 변경 시 숫자는 그대로 append하고 문자는 '(', '+', '*', ')' 에 대한
조건을 각각 만들어 스택에서 연산자 우선순위를 반영하는 코드를 만들었습니다.
후위표기식으로 바꿔서 계산하기, +, *, (,) 괄호는 항상 유효. 피연산자 0~9
+ : 괄호가 없으면 스택에 있는 것들 pop, 괄호있으면 append
* : 괄호가 없으면 스택에 있는 '*' 모두 pop, 괄호있으면 append
(: 무조건 append
): ( 나올때까지 pop

 

🎲 파이썬 코드

※ SW Expert 아카데미의 문제를 무단 복제하는 것을 금지합니다.

# TODO Solving Club 1224 계산기3

# 후위표기법으로 변경..
def change(Arr):
    Stack = []
    Count = []
    for i in range(len(ARR)):
        # 숫자일 때 그냥 append
        if ARR[i].isdigit():
            Count.append(ARR[i])
            continue
        # 괄호가 있는지 체크하고 추가..
        if ARR[i] == '(':
            Stack.append(ARR[i])
            continue
        # 더하기 일때..
        elif ARR[i] == '+':
            while Stack:
                if Stack[-1] == '(': break
                Count.append(Stack.pop())
            Stack.append(ARR[i])
            continue
        elif Arr[i] =='*':
            while Stack[-1] =='*':
                Count.append(Stack.pop())
            Stack.append(ARR[i])
            continue
        elif ARR[i] == ')':
            while Stack:
                if Stack[-1] == '(':
                    Stack.pop()
                    break
                Count.append(Stack.pop())
    return Count
# 후위표기법 계산..
def cal(lst):
    Stack = []
    for i in range(len(lst)):
        # 숫자면 stack에 저장..
        if lst[i].isdigit():
            Stack.append(lst[i])
        # 문자일때 연산후 Stack에 다시 저장..
        else:
            a = int(Stack.pop())
            b = int(Stack.pop())
            if lst[i] == '+': Stack.append(a+b)
            elif lst[i] == '*': Stack.append(b*a)
    return Stack

T = 10

for tc in range(1, T+1):
    N = int(input())
    ARR = list(input())
    print('#{}'.format(tc), end=' ')
    print(*cal(change(ARR)))

* 제 코드가 정답은 아닙니다. 부족한 부분과 더 좋은 아이디어가 있으시면 댓글로 남겨주세요! :)

728x90
728x90