여름의 서재

[SWEA] 4874_Forth 본문

알고리즘/SWEA

[SWEA] 4874_Forth

엉아_ 2021. 8. 24. 18:33
728x90

📕 문제

Forth라는 컴퓨터 언어는 스택 연산을 기반으로 하고 있어 후위 표기법을 사용한다. 예를 들어 3+4는 다음과 같이 표기한다.

3 4 + .

Forth에서는 동작은 다음과 같다.
 

숫자는 스택에 넣는다.

연산자를 만나면 스택의 숫자 두 개를 꺼내 더하고 결과를 다시 스택에 넣는다.

‘.’은 스택에서 숫자를 꺼내 출력한다.

 

Forth 코드의 연산 결과를 출력하는 프로그램을 만드시오. 만약 형식이 잘못되어 연산이 불가능한 경우 ‘error’를 출력한다.

다음은 Forth 연산의 예이다.
 

코드 출력
4 2 / . 2
4 3 - . 1


 

[입력]

첫 줄에 테스트 케이스 개수 T가 주어진다.  1T50

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

 

[출력]

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

 

💡 풀이법

1.  string을 처음부터 돌면서 숫자면 stack에 넣어줌.

2. 연산자를 만나면 stack에서 숫자 두개를 뽑아와서 연산을 해주고 다시 stack에 넣어줌.

(이때, stack의 길이가 2 이상인지 확인해줘야함 아니라면 error를 반환)

3. .을 만나면 이제 stack에 있는 남은 하나의 숫자를 반환.

(이때, stack에 있는 숫자가 한개가 아니라면 이때도 error를 반환)

 

def forth(string):
    stack = []
    for i in string:
        if i == '.':
            if len(stack) == 1:
                return stack.pop()
            else:
                return 'error'

        if i in ['+', '-', '*', '/']:
            if len(stack) < 2:
                return 'error'

            a = stack.pop()
            b = stack.pop()
            if i == '+':
                result = b + a # 여기서 순서 주의! 후에 꺼낸 숫자에서 전에 꺼낸 숫자를 연산
            elif i == '-':
                result = b - a
            elif i == '*':
                result = b * a
            else:
                result = int(b / a)
            stack.append(result)
        else:
            stack.append(int(i))


T = int(input())
for tc in range(1, T + 1):
    string = input().split()
    print('#{} {}'.format(tc, forth(string)))
Comments