[SWEA-4874] Forth

ego2·2023년 2월 9일
0
post-thumbnail

SW Expert Academy

문제 조건

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

3 4 + .

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

숫자는 스택에 넣는다.

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

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

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

다음은 Forth 연산의 예이다.

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

[입력]

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

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

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

[출력]

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

#1 84
#2 error
#3 168

💡아이디어

예외 처리 때문에 조금 까다로운 문제였다. 밑에 오류코드는 첫 번째로 작성한 코드인데 testcase를 10개중 3개 밖에 통과하지 못했다.
동시에 런타임에러도 발생했는데 이는 tsetcase에 0으로 나누기를 시도하는 경우가 있어서 발생한 것 같다.

수정한 사항은 try except 문을 이용해 모든 예외 사항(0을 나눌경우, 연산자가 부족한경우 등등)을 묶어서 처리해 주었다.

또한 오류코드에 고려하지 않은 나눗셈은 항상 나누어 떨어져야 한다는 조건을 만족하도록
”/” 입력받아 //으로 처리를 해 나누어 떨어지도록 처리하였다.

stack에 문자열로 계속 변환 할 필요없이 isdigit() 함수로 숫자를 판별한 후 int형으로 형>변환 하여 stack 삽입해주었다.

오류코드

"""
Forth라는 컴퓨터 언어는 스택 연산을 기반으로 하여 후위 표기법을 사용
"""

T = int(input())

for test_case in range(1, T+1):
    postfix = input().split()

    stack = []

    for i in postfix:
        if i == ".":
            if len(stack) == 0:
                print("#{} error".format(test_case))
                break
            else:
                print("#{} {}" .format(test_case, stack[0]))
                break

        elif i.isdigit() == True:
            stack.append(i)

        else:   # 연산자 만날 경우
            if len(stack) < 2:
                print("#{} error".format(test_case))
                break
            else:
                back_num = int(stack.pop())
                front_num = int(stack.pop())

                if i == "+":
                    stack.append(str(front_num + back_num))
                elif i == "-":
                    stack.append(str(front_num - back1_num))
                elif i == "*":
                    stack.append(str(front_num * back_num))
                elif i == "/":
                    stack.append(str(front_num / back_num))

🧑‍💻PASS 코드

T = int(input())

for test_case in range(1, T+1):
    postfix = input().split()

    stack = []

    for i in postfix:
        # 종료 포인트(.) 만날 경우
        if i == ".":
            if len(stack) == 1:
                print("#{} {}".format(test_case, stack[0]))
                break
            else:
                print("#{} error".format(test_case))
                break
        # 숫자 만날 경우
        elif i.isdigit() == True:
            stack.append(int(i))
    
        else:       # 연산자 만날 경우
            try:    # 예외 처리(0을 나눌 경우, 연산자가 부족한경우 등등)
                back_num = stack.pop()
                front_num = stack.pop()

                if i == "+":
                    tmp = front_num + back_num
                    stack.append(tmp)
                elif i == "-":
                    tmp = front_num - back_num
                    stack.append(tmp)
                elif i == "*":
                    tmp = front_num * back_num
                    stack.append(tmp)
                elif i == "/":
                    tmp = front_num // back_num
                    stack.append(tmp)
            except:     # 숫자도 연산자도 아닌경우 
                print("#{} error".format(test_case))
                break
profile
Talk is cheap. Show me the code.

0개의 댓글