1935 후위 표기식2 _python
https://www.acmicpc.net/problem/1935
1935번: 후위 표기식2
첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이
www.acmicpc.net
후위표기식에 대한 설명이 없는 후위표기식 문제다.
후위표기식은 연산자를 피연산자 뒤에써서 괄호를 쓰지않고도 연산을 표현할 수 있도록 하는 방법이다.
중위표기법을 후위표기법으로 바꾸는 예를 들자면
5 * (2 + 5) 을 바꾸자. 괄호를 빼고 +를 우측으로 빼낸다.
5 * 2 5 + 그리고 *을 우측으로 빼낸다.
5 2 5 + * 이렇게 완성
그러면 반대로 5 2 5 + *을 원래대로 돌리려면 첫번째로 나오는 연산자인 +를 바로 앞의 두 수에 적용시킨다.
5 2 + 5 *이다. 그리고 나오는 *연산자를 그앞의 피연산자에 적용시킨다.
5 * (2+5) 이렇게 중위표기법에 맞게 완성
문제 접근
후위표기법을 중위표기법으로 바꾸려면 연산자를 순서대로 읽어서 바로앞의 피연산자 2개에 적용시켜야한다.
그러면 스택으로 접근하기에 가장 편하다.
입력받은 후위표기법을 순차적으로 읽으며 ABCD~~ 각 알파벳에 해당되는 값을 스택에 쌓아둔다.
그리고 연산자를 만나면 스택에서 pop을 2번해서 그값을 연산자에 적용시킨다.
그리고 출력을 소수점2자리까지 출력한다.
코드
import sys
input = sys.stdin.readline
N = int(input())
postfixNotation = input().rstrip()
operand = []
for i in range(N):
operand.append(int(input()))
stack = []
for i in postfixNotation:
if "A" <= i <= "Z":
stack.append(operand[ord(i) - ord("A")])
else:
pop1 = stack.pop()
pop2 = stack.pop()
if i=="+":
stack.append(pop2 + pop1)
elif i=="-":
stack.append(pop2 - pop1)
elif i=="*":
stack.append(pop2 * pop1)
else:
stack.append(pop2 / pop1)
print("%.2f" %stack[0])
문자열을 "A"<=i <="Z"라고 했는데, isalpha와 isupper를 써서 풀어보려했으나 기호까지 읽어버린다.
이유는 아직 모르겠다