백준/문제풀이_python

1935 후위 표기식2 _python

휴대용치즈 2022. 10. 8. 11:10

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를 써서 풀어보려했으나 기호까지 읽어버린다.

이유는 아직 모르겠다