import string
def BOJ1935() :
n = int(input())
quest = input()
numbers = {}
for i in string.ascii_uppercase[:n] :
numbers[i] = float(input())
stack = []
ord = {'+': 1, '-': 1, '*': 2, '/': 2}
for s in list(quest) :
if s in ord :
second = stack.pop()
first = stack.pop()
temp = 0
if s == '+' :
temp = first + second
elif s == '-' :
temp = first - second
elif s == '*':
temp = first * second
elif s == '/':
temp = first / second
stack.append(temp)
else :
stack.append(numbers[s])
print("{:.2f}".format(stack[-1]))
BOJ1935()
전위 표기식은 +AB와 같이 연산자가 앞으로 이동합니다
중위 표기식은 A+B와 같이 우리에게 익숙한 형태입니다.
후위 표기식은 AB* 와 같이 연산자가 뒤로 빠집니다.
접근방법 :
1. 현재 상태값은 가장 나중에 생성되지만 계속 꺼내와서 연산을 해주어야 합니다(LIFO). 따라서 스택을 이용합니다
Ex) 234*+ = 2 + 3 * 4
12는 가장 나중에 생성이 됩니다. 생성되고 바로 2와 연산을 해주어야 합니다.
아래의 테이블은 스택을 형상화 한 것입니다(이해가 쉽지 않을수 있겠네요)
2. 알파벳을 순서대로 입력값을 넣어주기 위해 파이썬 내장 라이브러리인 string.ascii_uppercase를 사용하였습니다.
해당 라이브러리를 사용하면 아래 이미지와 같은 값을 가져올수 있습니다.
3. key, value로 접근하기 위하여 dict를 사용하였습니다.
4. 연산자들을 담아주는 dict를 선언해주었습니다.
(해당 문제에서는 연산자별 우선순위에 따른 연산을 할 필요가 없어 우선순위를 설정해줄 필요는 없지만 저는 습관적으로 해주었습니다)
5. 입력받은 후위표기식을 순회하면서 연산자에 순회하는 값이 존재하면 계산, 존재하지 않으면 stack에 넣어주었습니다.
장애물이였던것 :
1. stack의 사용 이유에 대해 모르고 그냥 사용했었던것 같습니다.
2. 소수점 표기법에 익숙치 않아 익숙해질 필요가 있습니다.
https://www.acmicpc.net/problem/1935
1935번: 후위 표기식2
첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이
www.acmicpc.net
'알고리즘' 카테고리의 다른 글
LCS2 [백준 9252] - python (0) | 2021.12.25 |
---|---|
사다리 [백준 2022] - python (0) | 2021.12.23 |
다각형의 면적 [백준 2166] - python (0) | 2021.12.21 |
가장 긴 증가하는 부분 수열 4 [백준 14002] - python (0) | 2021.12.20 |
N번째 큰 수[백준 2075번] - python (0) | 2021.12.19 |