개발

[백준] 1918 후위 표기식(파이썬) 본문

알고리즘/문제

[백준] 1918 후위 표기식(파이썬)

쇼팽리스트 2022. 7. 16. 15:59

자료구조 시간에서 후위 표기식은 스택을 이용해서 푼다는게 생각이 났다
풀다보니 스택을 이용해서 깔끔하고 간단하게 푸는 방법을 떠올리지 못해서
그냥 괄호 -> 곱셈/나눗셈 -> 덧셈/뺄셈 순으로 계산하는 하는 방법으로 풀었다.

import sys
input = sys.stdin.readline

inp = list(input().rstrip())
idx = 0

def postfix(arr):
  res = []
  for i in range(len(arr)):
    if arr[i] in "-+*/":
      res = arr[:i] + arr[i+1:] + arr[i:i+1]
      break
  return "".join(res)

def parenthesis(arr):
  stack = []
  for i in range(len(arr)):
    stack.append(arr[i])
    if arr[i] == ")":
      for j in range(len(stack)):
        if stack[j] == "(":
          idx = j
      res = mul_div(stack[idx+1:-1])
      res = plus_minus(res)
      for _ in range(len(stack)-idx):
        stack.pop()
      stack.append("".join(res))
  return stack

def mul_div(arr):
  stack = []
  for i in range(len(arr)):
    stack.append(arr[i])
    if arr[i-1] == "*" or arr[i-1] == "/":
      res = postfix(stack[-3:])
      for _ in range(3):
        stack.pop()
      stack.append(res)
  return stack

def plus_minus(arr):
  stack = []
  for i in range(len(arr)):
    stack.append(arr[i])
    if arr[i-1] == "+" or arr[i-1] == "-":
      res = postfix(stack[-3:])
      for _ in range(3):
        stack.pop()
      stack.append(res)
  return stack

if ")" in inp:
  inp = parenthesis(inp)
inp = mul_div(inp)
inp = plus_minus(inp)
print("".join(inp))