BOJ/Python

백준 1935번 후위 표기식 2 파이썬

띵지니어 2022. 3. 14. 23:59

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

 

1935번: 후위 표기식2

첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이

www.acmicpc.net

 

내 답안

import sys
input = sys.stdin.readline

N = int(input())
x = input().rstrip()
stack = []  # 피연산자 바로 추가할 리스트 생성

dic = {}  # 딕셔너리 생성
keys = sorted(list(set([i for i in x if i.isalpha()])))  # 후위연산자에서 변수만 뽑아내기
values = [int(input()) for i in [0] * N]

for i in range(N):
    dic[keys[i]] = values[i]  # 딕셔너리 저장

a1 = 0  # stack[-1]
a2 = 0  # stack[-2]

for i in x:  # 후위표기법으로 저장되 있는 리스트의 수만큼 반복
    if i.isalpha():  # 만약 피연산자이면 바로 stack에 추가
        stack.append(dic[i])
    elif i == '+':
        a1 = stack.pop()
        a2 = stack.pop()
        stack.append(a1 + a2)
    elif i == '-':
        a1 = stack.pop()
        a2 = stack.pop()
        stack.append(a2 - a1)
    elif i == '*':
        a1 = stack.pop()
        a2 = stack.pop()
        stack.append(a1 * a2)
    elif i == '/':
        a1 = stack.pop()
        a2 = stack.pop()
        stack.append(a2 / a1)

print(f'{stack[0]:.2f}')

딕셔너리를 이용해서 그런지 풀이가 좀 길다.

하지만 좀 다르게 생각하여 짠다면 좀 더 깔끔하게 정리가 된다.

 

내 답안 2

import sys
input = sys.stdin.readline

N = int(input())
s = input()
stack = []
o = [int(input()) for _ in [0] * N]

for i in s:
    if i == '+':
        stack.append(stack.pop() + stack.pop())
    elif i == '*':
        stack.append(stack.pop() * stack.pop())
    elif i == '-':
        stack.append(-stack.pop() + stack.pop())
    elif i == '/':
        stack.append(1 / stack.pop() * stack.pop())
    else:
        stack.append(o[ord(i) - 65])

print(f'{stack[0]:.2f}')

a1, a2 지정하지 않고 바로 pop()해주는 연산이 코드를 많이 줄이는 연산이 됐다.