[BOJ] 1935 후위 표기식2 (python)

허치영·2022년 6월 24일
0

BOJ 알고리즘

목록 보기
25/26

문제

후위 표기식과 각 피연산자에 대응하는 값들이 주어져 있을 때, 그 식을 계산하는 프로그램을 작성하시오.

입력

첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이는 100을 넘지 않는다) 그리고 셋째 줄부터 N+2번째 줄까지는 각 피연산자에 대응하는 값이 주어진다. 3번째 줄에는 A에 해당하는 값, 4번째 줄에는 B에 해당하는값 , 5번째 줄에는 C ...이 주어진다, 그리고 피연산자에 대응 하는 값은 100보다 작거나 같은 자연수이다.

후위 표기식을 앞에서부터 계산했을 때, 식의 결과와 중간 결과가 -20억보다 크거나 같고, 20억보다 작거나 같은 입력만 주어진다.

출력

계산 결과를 소숫점 둘째 자리까지 출력한다.

풀이

후위 표기식의 정의는 다른 블로그를 참고했다.
풀이 과정은 우선 입력받은 알파벳들을 각각 숫자로 매핑하고,
만들어둔 stack에 알파벳을 하나씩 매핑한 숫자들로 변환해 넣어준다.
만약 알파벳이 아닌 연산자가 나타난다면 stack 가장 뒤의 두 숫자를 꺼내서 eval()로 연산한 후 결과값을 다시 stack에 넣는다.
입력받은 후위 표기식 전체에 대해서 진행하면 stack에는 결과값만 남게 되므로 결과값을 출력한다.

여기서 eval()을 쓰기위해 str로 숫자를 변환시켜서 입력했다.

import sys
N = int(sys.stdin.readline())
equation = list(map(str, sys.stdin.readline().strip()))
numbers = dict()

for i in range(N):
    numbers[chr(ord('A')+i)] = str(sys.stdin.readline().strip())

stack = [numbers[equation.pop(0)]]
for _ in range(len(equation)):
    n = equation.pop(0)
    if n in numbers.keys():
        stack.append(numbers[n])
    else:
        n2 = stack.pop()
        n1 = stack.pop()
        stack.append(str(eval(n1+n+n2)))
print(f"{float(stack[-1]):.2f}")
profile
NLP를 공부하는 대학생입니다

0개의 댓글

Powered by GraphCDN, the GraphQL CDN