Forth라는 컴퓨터 언어는 스택 연산을 기반으로 하고 있어 후위 표기법을 사용한다. 예를 들어 3+4는 다음과 같이 표기한다.
3 4 + .
Forth에서는 동작은 다음과 같다.
숫자는 스택에 넣는다.
연산자를 만나면 스택의 숫자 두 개를 꺼내 더하고 결과를 다시 스택에 넣는다.
‘.’은 스택에서 숫자를 꺼내 출력한다.
Forth 코드의 연산 결과를 출력하는 프로그램을 만드시오. 만약 형식이 잘못되어 연산이 불가능한 경우 ‘error’를 출력한다.
다음은 Forth 연산의 예이다.
[입력]
첫 줄에 테스트 케이스 개수 T가 주어진다. 1≤T≤50
다음 줄부터 테스트 케이스의 별로 정수와 연산자가 256자 이내의 연산코드가 주어진다. 피연산자와 연산자는 여백으로 구분되어 있으며, 코드는 ‘.’로 끝난다.
나눗셈의 경우 항상 나누어 떨어진다.
[출력]
#과 1번부터인 테스트케이스 번호, 빈칸에 이어 계산결과를 정수로 출력하거나 또는 ‘error’를 출력한다.
for tc in range(1, int(input()) + 1):
num = list(input().split())
stack = [] # 빈 스택 만들고 여기다 후위표현식 계산하지요
ans = 1
for i in range(len(num) - 1):
# 숫자라면 부리나케 스택에 푸쉬
if num[i].isdigit():
stack.append(num[i])
else:
# 이 문제의 핵심은 예외처리가 아닐까
try:
# 연산할 숫자 두개 쑥 뽑기
b = int(stack.pop())
a = int(stack.pop())
if num[i] == '+':
stack.append(a + b)
elif num[i] == '-':
stack.append(a - b)
elif num[i] == '*':
stack.append(a * b)
elif num[i] == '/':
stack.append(a // b)
# 예외인 아이라면 false딱지 주기
except:
ans = False
# 예외인 아이이거나 스택에 남은 아이가 하나가 아니라면야 기꺼이 error를 드리겠나이다.
if ans == False or len(stack) != 1:
print(f'#{tc} error')
else:
print(f'#{tc} {stack.pop()}')
이거이거 내가 계산기 과제를 하지 못했었기 때문에 굉장히 어려웠으며 약 2시간 가량을 소요했지만 한 번 이해하니 알겠다. 역쉬 진도는 못 먹는 감이라도 따라는 가야한다