본문 바로가기
알고리즘

후위 표기식 2[백준 1935] - python

by 우보틀 2021. 12. 22.

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