SWEA 1223 계산기2
스택을 이용하여 계산기 기능을 구현하는 것이다.
처음 후위표기식을 볼땐 이게 뭐야;; 싶었는데 보면 볼수록 어떻게 이런 생각을 했나 싶다..ㅎㅎ
그리고 그냥 연산하면 되는데 왜 굳이 할까? 라는 의문이 들어 찾아보니 괄호 없이 연산자의 우선 순위를 판단할 수 있다는 장점을 가져 소프트웨어로 구현되는 계산기들은 후위표기법을 사용한다고 한다.
🎈 3가지로 나눠서 구현했다.
1) 우선순위 판별
2) 중위표기식 -> 후위표기식
3) 후위표기식을 계산
# 우선순위
def priority(char):
if char == '*':
return 3
if char == '+':
return 2
else:
return 1
# 중위 -> 후위
def make_postfix():
stack = []
processed = []
for i in range(N):
num = priority(formula[i])
# stack 안의 값과 formula값 비교하며 우선순위 판단 후 우선순위 낮은 거 나올때까지 pop
if num == 3:
while stack :
if priority(stack[-1]) < num:
break
processed.append(stack.pop())
stack.append(formula[i])
elif num == 2:
while stack :
if priority(stack[-1]) < num:
break
processed.append(stack.pop())
stack.append(formula[i])
else:
processed.append(int(formula[i]))
# 다 돌고나서 스택에 남아 있는 거 추가
while stack:
processed.append(stack.pop())
return processed
# 후위표기 - > 계산
def calculate(arr):
stack = []
for i in range(N):
if arr[i] == '+':
B = stack.pop()
A = stack.pop()
stack.append(A + B)
elif arr[i] == '*':
B = stack.pop()
A = stack.pop()
stack.append(A * B)
else:
stack.append(arr[i])
return stack
for tc in range(1, 11):
N = int(input())
formula = input()
print('#{} {}'.format(tc, *calculate(make_postfix())))
'알고리즘 문제 풀기 > SWEA' 카테고리의 다른 글
[SWEA 1949] 등산로 - DFS, 파이썬 (0) | 2021.03.14 |
---|---|
SWEA 1216. 회문 2 - 파이썬 (0) | 2021.03.06 |
SWEA 4861. 회문 - 파이썬 (0) | 2021.02.19 |
SWEA 4836. 색칠하기 2차원 배열(파이썬) (0) | 2021.02.16 |
SWEA 4839. 이진탐색 알고리즘 - 파이썬 (0) | 2021.02.16 |