[SWEA] 4874 forth

Yujin Jo·2022년 4월 5일
0

SWEA

목록 보기
19/22
post-thumbnail

문제 출처 : [SWEA] 4874 forth
learn -> course -> programming intermediate -> stack2 -> forth

문제

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

3 4 + .

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

숫자는 스택에 넣는다.

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

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

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

입력

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

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

나눗셈의 경우 항상 나누어 떨어진다.

출력

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

코드

# 후위표기식 계산 함수
def forth(lst):
    stack = []      # 계산 결과를 담을 리스트 초기화

    # 후위표기식을 순회하면서 계산
    for i in range(len(lst)):
        if lst[i] == '.':       # i가 '.'일 때 스택의 길이가 1이면 스택의 값을 return 해줌
            if len(stack) == 1:
                return stack.pop()
            else:               # 그렇지 않을 경우 올바른 식이 아니므로 return error
                return 'error'

        # stack에 숫자가 2개 미만으로 있는 경우 lst[i]가 연산자이면 error 숫자면 append
        elif len(stack) < 2:
            if lst[i] == '+' or lst[i] == '-' or lst[i] == '*' or lst[i] == '/':
                return 'error'
            else:
                stack.append(int(lst[i]))
        else:
            # 연산자 별로 숫자 2개를 pop해서 계산 후 다시 append
            if lst[i] == '+':
                b = stack.pop()
                a = stack.pop()
                stack.append(a + b)
            elif lst[i] == '-':
                b = stack.pop()
                a = stack.pop()
                stack.append(a - b)
            elif lst[i] == '*':
                b = stack.pop()
                a = stack.pop()
                stack.append(a * b)
            elif lst[i] == '/':
                b = stack.pop()
                a = stack.pop()
                stack.append(a // b)
            else:                   # 연산자가 아닐 경우 숫자, int로 변환해서 넣어줌
                stack.append(int(lst[i]))


T = int(input())
for tc in range(1, T + 1):
    calc_list = list(input().split())   # 계산할 수식을 리스트로 받아옴

    print(f'#{tc} {forth(calc_list)}')


풀이 방법

후위표기식을 계산하는 함수를 만들어서 풀이하였다. 우선 종료조건을 작성해주었고 그 다음으로는 오류가 발생하는 조건을 적어주었다. 마지막 else 문에서는 연산자를 확인하여 연산결과를 다시 stack에 append해주었다.

profile
일단 해보자

0개의 댓글