백준 1935 문제

링크 : https://www.acmicpc.net/problem/1935
백준 1935 풀이
요즘 후위 표기식을 배우고 있는데 신기한 것 같다. 왜 이런 걸 배우나 했는데, 컴퓨터가 계산하기 위한 표기 방법이 후위 표기법이었다.
후위 표기법은 어렵게 생각할 건 없다. 2단계만 기억하면 된다. 1단계는 우리가 일반적으로 사용하는 중위 표기법 ex. 5+3 를 53+ 로 바꾸는 것이다. 그리고 2단계는 후위 표기식 AB+를 스택을 사용해서 계산하는 것인데, 이 문제가 바로 2단계를 할 수 있냐를 물어보는 문제였다.
후위 표기식을 계산하는 것은 정말 간단하다. 피연산자(숫자 같은 것들, ex 5나 3)이 나오면 스택에 쌓아둔다. 그리고 연산자(+-*/)를 만나면 스택의 제일 끝에 있는 2개를 꺼내서 연산한 다음 다시 스택에 넣어두면 된다. (ex. 5+3 . => 8을 다시 스택에 넣음). 후위 표기식은 괄호도 어차피 없기 때문에 1단계 중위 표기식을 후위 표기식으로 변경하는 것보다 훨씬 쉽다.
아무튼 이렇게 후위 표기식을 계산하는 방식으로 문제를 풀면 다음과 같다.
# n : 피연산자 개수
n = int(input())
# word 피연산자
word = input()
# 숫자 딕셔너리
num_dict = dict()
for num in range(n):
num_dict[chr(ord('A')+num)] = int(input())
### 후위 표기식 계산 ###
stack = list()
for w in word:
# 연산자라면?
if w in '+-*/':
a = stack.pop()
b = stack.pop()
if w == '+':
stack.append(b+a)
elif w == '-':
stack.append(b-a)
elif w == '*':
stack.append(b*a)
else:
stack.append(b/a)
# 피연산자라면?
else:
# 숫자로 변경해서 스택에 넣기
stack.append(num_dict[w])
# 출력. 소수점 2자리까지
ans = stack.pop()
print(f'{ans:.2f}')
알파벳에 숫자를 연결시키기 위해 딕셔너리를 활용하였고, 소수점 2자리까지 출력하기 위해 f포맷팅을 사용하여 출력하였다.
No Responses