[SWEA] forth [PYTHON]

냐항·2021년 8월 26일
1

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시간 가량을 소요했지만 한 번 이해하니 알겠다. 역쉬 진도는 못 먹는 감이라도 따라는 가야한다

0개의 댓글