m1ndy5's coding blog

[자료구조] 백준 1935번 후위 표기식2 with python 본문

알고리즘 with python/자료구조

[자료구조] 백준 1935번 후위 표기식2 with python

정민됴 2023. 3. 22. 10:34

https://www.acmicpc.net/problem/1935

이 문제는 먼저 코드를 보기전에 후위 표기식이란 무엇인지를 알아야한다.
예를 들어 (A+B) * 2 + B/C 라는 식을 트리 형식으로 나타내보자.


이런 형식이 될 것이고
후위 표기식은 left => right => center 순으로 읽으면 된다.
따라서 위 식을 후위 표기식으로 표현하면 A B + 2 * B C / + 가 된다.
반대로 후위 표기식으로 표현된 식을 계산하는 방법은
숫자일 때는 스택에 push하고 연산자가 나오면 숫자 두개를 pop해 연산을 진행한 후 다시 스택에 push하는 것이다.
이 때 중요한 것이 +나 * 는 상관없지만 -나 / 같은 경우 뒤의 숫자가 먼저 나오므로 순서에 유의하여 문제를 풀어야한다.

import sys

alphabet = ['A', 'B', 'C', 'D', 'E', 'F', 'G' ,'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
dic = {}
stack = []

n = int(sys.stdin.readline().rstrip())

expression = sys.stdin.readline().rstrip()

for i in range(n):
    k = int(sys.stdin.readline().rstrip())
    dic[alphabet[i]] = k

for ele in expression:
    if ele in alphabet:
        stack.append(dic[ele])
    else :
        a = stack.pop()
        b = stack.pop()
        if ele == '+' :
            c = a+b
        elif ele == '-':
            c = b-a
        elif ele == '*':
            c = a*b
        else :
            c = b/a
        stack.append(c)

print('%.2f'%stack.pop())