Forth라는 컴퓨터 언어는 스택 연산을 기반으로 하고 있어 후위 표기법을 사용한다. 예를 들어 3+4는 다음과 같이 표기한다.
3 4 + .
Forth에서는 동작은 다음과 같다.
숫자는 스택에 넣는다.
연산자를 만나면 스택의 숫자 두 개를 꺼내 더하고 결과를 다시 스택에 넣는다.
‘.’은 스택에서 숫자를 꺼내 출력한다.
Forth 코드의 연산 결과를 출력하는 프로그램을 만드시오. 만약 형식이 잘못되어 연산이 불가능한 경우 ‘error’를 출력한다.
다음은 Forth 연산의 예이다.
코드 출력 4 2 / . 2 4 3 - . 1 [입력]
첫 줄에 테스트 케이스 개수 T가 주어진다. 1≤T≤50
다음 줄부터 테스트 케이스의 별로 정수와 연산자가 256자 이내의 연산코드가 주어진다. 피연산자와 연산자는 여백으로 구분되어 있으며, 코드는 ‘.’로 끝난다.
나눗셈의 경우 항상 나누어 떨어진다.3 10 2 + 3 4 + * . 5 3 * + . 1 5 8 10 3 4 + + 3 + * 2 + + + .
[출력]
#과 1번부터인 테스트케이스 번호, 빈칸에 이어 계산결과를 정수로 출력하거나 또는 ‘error’를 출력한다.
#1 84 #2 error #3 168
예외 처리 때문에 조금 까다로운 문제였다. 밑에 오류코드는 첫 번째로 작성한 코드인데 testcase를 10개중 3개 밖에 통과하지 못했다.
동시에 런타임에러도 발생했는데 이는 tsetcase에 0으로 나누기를 시도하는 경우가 있어서 발생한 것 같다.
수정한 사항은
try except
문을 이용해 모든 예외 사항(0을 나눌경우, 연산자가 부족한경우 등등)을 묶어서 처리해 주었다.또한 오류코드에 고려하지 않은 나눗셈은 항상 나누어 떨어져야 한다는 조건을 만족하도록
”/” 입력받아 //으로 처리를 해 나누어 떨어지도록 처리하였다.stack에 문자열로 계속 변환 할 필요없이
isdigit()
함수로 숫자를 판별한 후 int형으로 형>변환 하여 stack 삽입해주었다.
"""
Forth라는 컴퓨터 언어는 스택 연산을 기반으로 하여 후위 표기법을 사용
"""
T = int(input())
for test_case in range(1, T+1):
postfix = input().split()
stack = []
for i in postfix:
if i == ".":
if len(stack) == 0:
print("#{} error".format(test_case))
break
else:
print("#{} {}" .format(test_case, stack[0]))
break
elif i.isdigit() == True:
stack.append(i)
else: # 연산자 만날 경우
if len(stack) < 2:
print("#{} error".format(test_case))
break
else:
back_num = int(stack.pop())
front_num = int(stack.pop())
if i == "+":
stack.append(str(front_num + back_num))
elif i == "-":
stack.append(str(front_num - back1_num))
elif i == "*":
stack.append(str(front_num * back_num))
elif i == "/":
stack.append(str(front_num / back_num))
T = int(input())
for test_case in range(1, T+1):
postfix = input().split()
stack = []
for i in postfix:
# 종료 포인트(.) 만날 경우
if i == ".":
if len(stack) == 1:
print("#{} {}".format(test_case, stack[0]))
break
else:
print("#{} error".format(test_case))
break
# 숫자 만날 경우
elif i.isdigit() == True:
stack.append(int(i))
else: # 연산자 만날 경우
try: # 예외 처리(0을 나눌 경우, 연산자가 부족한경우 등등)
back_num = stack.pop()
front_num = stack.pop()
if i == "+":
tmp = front_num + back_num
stack.append(tmp)
elif i == "-":
tmp = front_num - back_num
stack.append(tmp)
elif i == "*":
tmp = front_num * back_num
stack.append(tmp)
elif i == "/":
tmp = front_num // back_num
stack.append(tmp)
except: # 숫자도 연산자도 아닌경우
print("#{} error".format(test_case))
break