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