SWEA
1224. [파이썬 S/W 문제해결 기본] 6일차 - 계산기3
Toproot
2021. 3. 3. 20:31
728x90
728x90
🚛 파이썬 SW 문제해결 기본 - Stack2
- 주어진 계산식을 1) 후위표기식으로 변경하고 2) 그 표기식을 계산하는 문제입니다.
- 연산자는 +, * 두 가지이고, 괄호의 유효성여부는 항상 옳은 경우만 주어집니다.
💡 아이디어
문제 그대로 후위표기식으로 주어진 문자열을 변경하고, 계산해주는 함수를 만들었습니다.
후위표기식 변경 시 숫자는 그대로 append하고 문자는 '(', '+', '*', ')' 에 대한
조건을 각각 만들어 스택에서 연산자 우선순위를 반영하는 코드를 만들었습니다.
후위표기식으로 바꿔서 계산하기, +, *, (,) 괄호는 항상 유효. 피연산자 0~9
+ : 괄호가 없으면 스택에 있는 것들 pop, 괄호있으면 append
* : 괄호가 없으면 스택에 있는 '*' 모두 pop, 괄호있으면 append
(: 무조건 append
): ( 나올때까지 pop
🎲 파이썬 코드
※ SW Expert 아카데미의 문제를 무단 복제하는 것을 금지합니다.
# TODO Solving Club 1224 계산기3
# 후위표기법으로 변경..
def change(Arr):
Stack = []
Count = []
for i in range(len(ARR)):
# 숫자일 때 그냥 append
if ARR[i].isdigit():
Count.append(ARR[i])
continue
# 괄호가 있는지 체크하고 추가..
if ARR[i] == '(':
Stack.append(ARR[i])
continue
# 더하기 일때..
elif ARR[i] == '+':
while Stack:
if Stack[-1] == '(': break
Count.append(Stack.pop())
Stack.append(ARR[i])
continue
elif Arr[i] =='*':
while Stack[-1] =='*':
Count.append(Stack.pop())
Stack.append(ARR[i])
continue
elif ARR[i] == ')':
while Stack:
if Stack[-1] == '(':
Stack.pop()
break
Count.append(Stack.pop())
return Count
# 후위표기법 계산..
def cal(lst):
Stack = []
for i in range(len(lst)):
# 숫자면 stack에 저장..
if lst[i].isdigit():
Stack.append(lst[i])
# 문자일때 연산후 Stack에 다시 저장..
else:
a = int(Stack.pop())
b = int(Stack.pop())
if lst[i] == '+': Stack.append(a+b)
elif lst[i] == '*': Stack.append(b*a)
return Stack
T = 10
for tc in range(1, T+1):
N = int(input())
ARR = list(input())
print('#{}'.format(tc), end=' ')
print(*cal(change(ARR)))
* 제 코드가 정답은 아닙니다. 부족한 부분과 더 좋은 아이디어가 있으시면 댓글로 남겨주세요! :)
728x90
728x90