맛있는물회

[맛있는물회] <SWEA알고리즘> 4874번 "Forth" 본문

IT/알고리즘

[맛있는물회] <SWEA알고리즘> 4874번 "Forth"

맛있는물회 2020. 4. 5. 04:13

문제 조건

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

3 4 + .
 

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

숫자는 스택에 넣는다.

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

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

 

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

다음은 Forth 연산의 예이다.


 

 

Input


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

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

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

 

Output


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

 

생각한 아이디어


파이썬에서는 Char 처럼 문자 자료형을 따로 안쓰는 듯하다.

그래도 str으로 접근을 해도 내가 하고 싶은데로 다 되었다.

숫자를 어떻게 판단할까 하다가 특수문자를 먼저 if 로 거르고 else로 숫자를 받았는데 잘 안되는 듯 했다.

그래서 찾아보니 isDigit()이라는 좋은 함수가 있어서 사용하였다.

 

그런데 계속 해봐도 test 케이스 7개만 맞고 5개만 맞고 이런다. 어디가 문제인지 모르겠다.

아주 전형적인 stack 을 사용한 계산기 문제이다. 

흠,,어쨌든 그냥 넘어가기로 했다.

 

Try Except를 처음 사용해봤는데 에러가 발생하면 except으로 넘어가고 이때 flag를 지정해주는 것이 중요한 포인트 인듯 하다.

 

소스코드


T = int(input())
for TC in range(1, T + 1):
    string = list(input().split())
    stk = list()
    ans = 0
    for i in range(len(string)-1):
        if string[i].isdigit():
            stk.append(string[i])
        else:
            try:
                b,a = int(stk.pop()), int(stk.pop())
                if string[i] == '+':
                    c = a + b
                elif string[i] == '-':
                    c = a - b
                elif string[i] == '*':
                    c = a * b
                elif string[i] == '/':  
                    c = a / b
                stk.append(str(c))

            except:
                ans = -1
    if ans == -1 or len(stk)>=2:
        print("#%d" %TC, "error")
    else :
        print("#%d %d" %(TC, int(stk.pop())))

 

*파이썬 문법 정리

Comments