1223. 계산기2
문제)
문자열로 이루어진 계산식이 주어질 때, 이 계산식을 후위 표기식으로 바꾸어 계산하는 프로그램을 작성하시오.
예를 들어
“3+4+5*6+7”
라는 문자열로 된 계산식을 후위 표기식으로 바꾸면 다음과 같다.
"34+56*+7+"
변환된 식을 계산하면 44를 얻을 수 있다.
문자열 계산식을 구성하는 연산자는 +, * 두 종류이며 피연산자인 숫자는 0 ~ 9의 정수만 주어진다.
[입력]
각 테스트 케이스의 첫 번째 줄에는 테스트 케이스의 길이가 주어진다. 그 다음 줄에 바로 테스트 케이스가 주어진다.
총 10개의 테스트 케이스가 주어진다.
[출력]
#부호와 함께 테스트 케이스의 번호를 출력하고, 공백 문자 후 답을 출력한다.
풀이)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
def postfix(a): # 후위 표기식 변환
stack = []
operator = {"+" : 2, "*" : 3}
fix = ""
for i in a:
if not stack and i in operator: # 스택이 비어 있으면
stack.append(i)
elif stack and i in operator: # 스택이 비어있지 않고, i가 연산자이면
while stack:
if operator[i] <= operator[stack[-1]]:
fix += stack.pop()
else:
break
stack.append(i)
else:
fix += i
else:
for j in range(len(stack)):
fix += stack.pop()
return fix
def cal(b):
stack = []
operator = ["+", "*"]
for i in b:
if not i in operator: # 피연산자이면 스택에 push
stack.append(i)
else: #연산자이면.
y = int(stack.pop())
x = int(stack.pop())
if i == "+":
stack.append(x + y)
elif i == "*":
stack.append(x * y)
else:
return stack
for _ in range(10):
n = int(input())
sentence = input()
print(f"#{_ + 1}", *cal(postfix(sentence)))
|
cs |
문제 출처 : https://swexpertacademy.com/main/main.do
※ SW Expert 아카데미는 원칙적으로 문제를 무단 복제하는 것을 금지합니다.
학습용으로 문제를 가져왔으나, 문제가 될 시 수정 및 삭제하겠습니다.
'Develop > Python + SWEA' 카테고리의 다른 글
[python] Stack과 DFS (0) | 2022.02.27 |
---|---|
[SW Expert Academy] 1224. 계산기3 (0) | 2022.02.25 |
[SW Expert Academy] 4881. 배열 최소 합 (0) | 2022.02.25 |
[SW Expert Academy] 4880. 토너먼트 카드게임 (0) | 2022.02.25 |
[SW Expert Academy] 4875. 미로 (0) | 2022.02.25 |