1935번: 후위 표기식2
첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이
www.acmicpc.net
문제
후위 표기식과 각 피연산자에 대응하는 값들이 주어져 있을 때, 그 식을 계산하는 프로그램을 작성하시오.
입력
첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이는 100을 넘지 않는다) 그리고 셋째 줄부터 N+2번째 줄까지는 각 피연산자에 대응하는 값이 주어진다. 3번째 줄에는 A에 해당하는 값, 4번째 줄에는 B에 해당하는값 , 5번째 줄에는 C ...이 주어진다, 그리고 피연산자에 대응 하는 값은 100보다 작거나 같은 자연수이다.
후위 표기식을 앞에서부터 계산했을 때, 식의 결과와 중간 결과가 -20억보다 크거나 같고, 20억보다 작거나 같은 입력만 주어진다.
출력
계산 결과를 소숫점 둘째 자리까지 출력한다.
코드
n = int(input())
postfix = input()
d = dict()
for i in range(65, 65+n):
d[chr(i)] = int(input().strip())
stack = []
for c in postfix:
if c.isalpha():
stack.append(d[c])
else:
b = stack.pop()
a = stack.pop()
if c == "+":
stack.append(a+b)
elif c == "-":
stack.append(a-b)
elif c == "*":
stack.append(a*b)
elif c == "/":
stack.append(a/b)
print("{:.2f}".format(stack[0]))
각 알파벳에 해당하는 숫자들은 딕셔너리를 이용하여 빠르게 찾을 수 있도록 하였다.
chr() 함수는 파라미터로 넣어준 숫자의 아스키코드에 해당하는 문자를 리턴해준다. 이를 이용하여 각 알파벳에 맞는 숫자를 딕셔너리에 저장해주었다가 사용하였다.
후위 표기식을 처리할 때는 스택을 사용하였다. 들어온 문자가 피연산자이면 스택에 push해주고 연산자라면 스택의 top에서 숫자 2개를 pop하여 연산을 하고 다시 스택에 집어넣어주었다.
모든 연산을 처리한 후에는 문제의 요구조건대로 소수점 2번째자리까지 출력하기 위하여 format() 함수를 사용하여 출력하였다.
'문제풀이 > 자료구조' 카테고리의 다른 글
[Python/파이썬] 백준 1874번 스택 수열 (0) | 2023.01.24 |
---|---|
[Python/파이썬] 백준 2346번 풍선 터뜨리기 (0) | 2023.01.23 |
[Python/파이썬] 백준 10866번 덱 (0) | 2023.01.22 |
[Python/파이썬] 백준 2164번 카드2 (0) | 2023.01.22 |
[Python/파이썬] 백준 1158번 요세푸스 문제 (0) | 2023.01.22 |