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()해주는 연산이 코드를 많이 줄이는 연산이 됐다.

반응형
목차(index)