알고리즘 문제 풀기/SWEA

[SWEA 1223] 계산기2 - 스택을 이용한 후위표기식

hibscus 2021. 2. 25. 01:16

 

SWEA 1223 계산기2

 

 

 

 

 

 

 

 

 

 

스택을 이용하여 계산기 기능을 구현하는 것이다.

 

처음 후위표기식을 볼땐 이게 뭐야;; 싶었는데 보면 볼수록 어떻게 이런 생각을 했나 싶다..ㅎㅎ

 

그리고 그냥 연산하면 되는데 왜 굳이 할까? 라는 의문이 들어 찾아보니 괄호 없이 연산자의 우선 순위를 판단할 수 있다는 장점을 가져 소프트웨어로 구현되는 계산기들은 후위표기법을 사용한다고 한다.

 

 

 

 

 

 

🎈 3가지로 나눠서 구현했다.

 

1) 우선순위 판별 

 

2) 중위표기식 -> 후위표기식

 

3) 후위표기식을 계산

 

 

 

 

 

 

 

# 우선순위
def priority(char):
    if char == '*':
        return 3
    if char == '+':
        return 2
    else:
        return 1

# 중위 -> 후위
def make_postfix():
    stack = []
    processed = []
    for i in range(N):
        num = priority(formula[i])
        # stack 안의 값과 formula값 비교하며 우선순위 판단 후 우선순위 낮은 거 나올때까지 pop
        if num == 3:
            while stack :
                if priority(stack[-1]) < num:
                    break
                processed.append(stack.pop())
            stack.append(formula[i])
        elif num == 2:
            while stack :
                if priority(stack[-1]) < num:
                    break
                processed.append(stack.pop())
            stack.append(formula[i])
        else:
            processed.append(int(formula[i]))

    # 다 돌고나서 스택에 남아 있는 거 추가
    while stack:
        processed.append(stack.pop())
    return processed

# 후위표기 - > 계산
def calculate(arr):
    stack = []
    for i in range(N):
        if arr[i] == '+':
            B = stack.pop()
            A = stack.pop()
            stack.append(A + B)
        elif arr[i] == '*':
            B = stack.pop()
            A = stack.pop()
            stack.append(A * B)
        else:
            stack.append(arr[i])
    return stack




for tc in range(1, 11):
    N = int(input())
    formula = input()
    print('#{} {}'.format(tc, *calculate(make_postfix())))



swexpertacademy.com/

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com