본문 바로가기
TIL - 프로그래밍/Python 알고리즘

[SWEA] 4874. Forth - Python

by chaemj97 2022. 2. 25.
728x90

https://swexpertacademy.com/main/learn/course/lectureProblemViewer.do

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

< 📝 문제 >

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

 

한다. 3 4 + .
 

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

숫자는 스택에 넣는다.

 

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

 

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

 

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

 

다.
 

다음은 Forth 연산의 예이다. 

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

 

< ❓ 생각 >


< 💻 코드 >

def Forth(arr):
    stack = []
    for i in arr:

        # 숫자면 스택에 넣기
        if i not in '+-*/.':
            stack.append(int(i))

        # 연산자면 스택에 숫자 2개 꺼내 계싼하고 결과를 다시 스택에 넣기
        elif i in '+-*/':
            # 계산할 숫자가 있어야 함
            if len(stack) >= 2:
                if i == '+':
                    stack[-2] = stack[-2] + stack[-1]
                elif i == '-':
                    stack[-2] = stack[-2] - stack[-1]
                elif i == '*':
                    stack[-2] = stack[-2] * stack[-1]
                elif i == '/':
                    # 나누는 수가 0이면 안됨
                    if stack[-1]:
                        stack[-2] = stack[-2] // stack[-1]
                    else:
                        return 'error'
                stack.pop()
            # 형식이 잘못된 경우 (계산할 숫자 없는데 연산자 나오는 경우)
            else:
                return 'error'

        # '.'
        elif i == '.':
            # 계산이 끝난 경우
            if len(stack) == 1:
                return stack[0]
            # 계산할 숫자가 남아있으면
            else:
                return 'error'

# 테스트 케이스 개수
T = int(input())
for tc in range(1,T+1):
    # 연산 코드
    arr = list(input().split())

    print(f'#{tc} {Forth(arr)}')


< ❗ 느낀 점 >

if문이 많이 쓰여 줄이고 싶었는데 실패...

728x90
반응형

댓글