[Algorithm🧬] 정올 1105 : 수식 계산기2

또상·2022년 10월 17일
0

Algorithm

목록 보기
50/133
post-thumbnail

문제

import sys
from collections import deque

# 스택에 들어갈 때 비교하는 우선순위
def input_priority(str):
	if str == "(":
		return 4
	if str == "*" or str == "/":
		return 3
	elif str == "+" or str == "-":
		return 2
	elif str == "(":
		return 1
	return 0

# 스택에 들어가있는 녀석을 비교하는 우선순위
def output_priority(str):
	if str == "(":
		return 0
	if str == "*" or str == "/":
		return 3
	elif str == "+" or str == "-":
		return 2
	return 0

str_exp = sys.stdin.readline()[:-1]

computes = []
stack = deque()

# 후위표기식으로 변경
for c in str_exp:
	if c.isdecimal():
		computes.append(c)
	else:
		if len(stack) == 0:
			stack.append(c)
		else:
			if output_priority(stack[-1]) < input_priority(c):
				stack.append(c)
			else:
				if c == ')':
					while stack and stack[-1] != '(':
						computes.append(stack.pop())
					stack.pop() # ( 를 삭제.
				else:
					while stack and output_priority(stack[-1]) >= input_priority(c):
						computes.append(stack.pop())
					stack.append(c)

while stack:
	computes.append(stack.pop())

print(computes)

# 후위표기식 계산
for c in computes:
	if c.isdecimal():
		stack.append(c)
	else:
		n2 = int(stack.pop())
		n1 = int(stack.pop())
		if c == "+":
			stack.append(n1 + n2)
		elif c == "-":
			stack.append(n1 - n2)
		elif c == "*":
			stack.append(n1 * n2)
		elif c == "/":
			stack.append(int(n1 / n2))

print(stack[0])

사칙연산만 있는 버젼

import sys
readl = sys.stdin.readline

def priority(c):
    if c == "+" or c == "-":
        return 1
    if c == "*" or c == "/":
        return 2
    return 0

n = int(readl())
exp = readl().split()

post = []
stack = []

# 후위식 변환
for c in exp:
    if c.isdecimal():
        post.append(c)
    else:
        if len(stack) == 0:
            stack.append(c)
        else:
            while stack and priority(stack[-1]) >= priority(c):
                post.append(stack.pop())
            stack.append(c)

while stack:
    post.append(stack.pop())

# print(post)

# 후위식 계산
stack = []

for c in post:
    if c.isdecimal():
        stack.append(int(c))
    else:
        n2 = stack.pop()
        n1 = stack.pop()

        if c == "+":
            stack.append(n1 + n2)
        elif c == "-":
            stack.append(n1 - n2)
        elif c == "*":
            stack.append(n1 * n2)
        elif c == "/":
            stack.append(n1 // n2)

print(stack[-1])
profile
0년차 iOS 개발자입니다.

0개의 댓글