반응형
https://www.acmicpc.net/problem/1935
내 답안
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()해주는 연산이 코드를 많이 줄이는 연산이 됐다.
반응형
'BOJ > Python' 카테고리의 다른 글
백준 15649번 N과 M (1) 파이썬 (0) | 2022.03.16 |
---|---|
백준 11053번 가장 긴 증가하는 부분 수열 파이썬 (8) | 2022.03.15 |
백준 11866번 요세푸스 문제 0 파이썬 (0) | 2022.03.13 |
백준 1918번 후위 표기식 파이썬 (0) | 2022.03.12 |
백준 2748번 피보나치 수 2 파이썬 (0) | 2022.03.11 |