백준 1935

jeonghens·2023년 8월 2일

알고리즘: BOJ

목록 보기
11/125

문제

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

코드

import sys

N = int(sys.stdin.readline())
expr = sys.stdin.readline().rstrip()

operand = []
for i in range(N):
    operand.append(int(sys.stdin.readline()))

stack = []

for e in expr:
    if e >= 'A' and e <= 'Z':
        stack.append(operand[ord(e) - ord('A')])
    else:
        if e == "+":
            stack.append(stack.pop(-2) + stack.pop())
        elif e == "-":
            stack.append(stack.pop(-2) - stack.pop())
        elif e == "*":
            stack.append(stack.pop(-2) * stack.pop())
        elif e == "/":
            stack.append(stack.pop(-2) / stack.pop())
    
print("%.2f" % stack[0])

피연산자는 무조건 A, B, C, ..와 같이 알파벳 순서로 주어진다! 따라서 ord(e) - ord('A')를 통해 주어진 몇 번째 operand인지 알 수 있다.

후위 표기식은 operator가 나왔을 때, 무조건 뒤에서 두 번째 operand가 첫 번째 인자가 되고 뒤에서 첫 번째 operand가 두 번째 인자가 된다. 따라서 operand가 저장된 stack에서 pop() 메서드를 쓸 때 첫 번째 인자는 pop(-2)를 통해 가져와야 한다.

소수점 2자리까지 출력해야 하므로, print("%.2f" % stack[0])과 같은 포맷을 이용해야 한다.

기타

생각보다 오래 고민했는데 쉽게 풀지 못했다.

기본 수준에선 고민하는 것만큼 다양한 문제를 접하면서 익숙해지는 것도 중요한 것 같다.

profile
알고리즘이나 SQL 문제 풀이를 올리고 있습니다. 피드백 환영합니다!

0개의 댓글