Programming/SWEA

[SWEA 4874].[파이썬 S/W 문제해결 기본] 5일차 - Forth

토토모에요 2021. 8. 5. 13:53
728x90
반응형

SW Expert Academy에서 학습용으로 문제를 가져왔습니다. 문제가 될 시 수정, 삭제하겠습니다.

https://swexpertacademy.com/main/main.do

문제 :

Forth라는 컴퓨터 언어는 스택 연산을 기반으로 하고 있어 후위 표기법을 사용한다. 예를 들어 3+4는 다음과 같이 표기한다.
3 4 + .
Forth에서는 동작은 다음과 같다.
숫자는 스택에 넣는다.
연산자를 만나면 스택의 숫자 두 개를 꺼내 더하고 결과를 다시 스택에 넣는다.
‘.’은 스택에서 숫자를 꺼내 출력한다.
Forth 코드의 연산 결과를 출력하는 프로그램을 만드시오. 만약 형식이 잘못되어 연산이 불가능한 경우 ‘error’를 출력한다.
다음은 Forth 연산의 예이다.

[입력]

첫 줄에 테스트 케이스 개수 T가 주어진다.  1≤T≤50
다음 줄부터 테스트 케이스의 별로 정수와 연산자가 256자 이내의 연산코드가 주어진다. 피연산자와 연산자는 여백으로 구분되어 있으며, 코드는 ‘.’로 끝난다.
나눗셈의 경우 항상 나누어 떨어진다.

[출력]

#과 1번부터인 테스트케이스 번호, 빈칸에 이어 계산결과를 정수로 출력하거나 또는 ‘error’를 출력한다.

input

3
10 2 + 3 4 + * .
5 3 * + .
1 5 8 10 3 4 + + 3 + * 2 + + + .

output

#1 84
#2 error
#3 168

code

Test_case = int(input())
for t in range(1, Test_case+1):
    cal = input().split()
    stack = []
    operators = {
        '+': lambda x, y: x + y,
        '-': lambda x, y: x - y,
        '*': lambda x, y: x * y,
        '/': lambda x, y: x // y, #기호에 대한 연산자를 만들어둔다.
    }
    for i in cal: #입력받은 식을 돌려서
        if i == '.': #만약 '.'가 나왔을때
            if len(stack) > 1: #stack이 비어있지 않을때
                result = "error"  #error를 도출하고
            else:
                result = int(stack.pop()) #stack이 비어있지 않으면 정수로 변환 후 pop한것을 결과로 받는다.
        elif i in operators.keys():       #'.'가 나오지 않고 연산자가 ex)'+'.'-' 부분들이 나왔을 때
            if len(stack) < 2:           #만약 stack이 계산할 수 없는 상황일때
                result = "error"         #error를 도출
                break
            else:
                a = int(stack.pop())        #a는 pop한 정수
                b = int(stack.pop())        #b는 pop한 정수
                c = operators[i](int(b), int(a)) #연산자의 i번째를 계산
                stack.append(int(c))            #정수로 변환후 stack에 추가
        else :
            stack.append(i)
    print("#{} {}".format(t, result))
반응형