SWE(4874)_Forth

SWE 4874_Forth

문제이해

후위표기법 사용. 숫자는 스택에 넣는다 연산자를 만나면 스택의 숫자 두 개를 꺼내 더하고 결과를 다시 스택에 넣는다 ‘.’은 스택에서 숫자를 꺼내 출력한다

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

4 2 / . -> 2 4 3 - . -> 1

내 코드

T = int(input())
for tc in range(1, T+1):
    stack = []
    text = list(input().split())
    result = 0
    for i in text:
        if i == '.':
            if(len(stack) > 1):
                result = "error"
            else:
                result = stack.pop(-1)
                break
        elif(i != '+' and i != '-' and i != '*' and i != '/'):
            stack.append(i)
        else:
            if(len(stack) < 2):
                result = "error"
                break
            else:
                if(i == '+'):
                    a = int(stack.pop(-1))
                    b = int(stack.pop(-1))
                    stack.append(b+a)
                elif(i == '-'):
                    a = int(stack.pop(-1))
                    b = int(stack.pop(-1))
                    stack.append(b-a)
                elif(i == '*'):
                    a = int(stack.pop(-1))
                    b = int(stack.pop(-1))
                    stack.append(b*a)
                elif(i == '/'):
                    a = int(stack.pop(-1))
                    b = int(stack.pop(-1))
                    stack.append(b//a)
                else:
                    result = "error"
                    break

    print("#%s %s" % (tc, result))

예외 케이스 찾아보다 발견한 유저분 코드

[참고]https://swexpertacademy.com/main/talk/solvingTalk/boardCommuView.do?searchCondition=COMMU_DETAIL-COMMU_TITLE-NICK_NAME_TAG&commuId=AWmupVu6hBgDFAR1&searchKeyword=C&orderBy=CHILD_COMMU_COUNT&pageSize=10&pageIndex=28

눈 여겨볼 점은 , operators라는 딕셔너리를 선언한 뒤, 각 연산자를 key로 두고, value에 lambda로 함수 연산을 넣어두었다. 이렇게 하니 코드가 훨씬 깔끔하다.

T = int(input())
for tc in range(1, T+1):
    stack = []
    text = input().split()
    operators = {
        '+': lambda x, y: y+x,
        '-': lambda x, y: y-x,
        '*': lambda x, y: y*x,
        '/': lambda x, y: y//x
    }
    result = 0
    for i in text:
        if i == '.':
            if(len(stack) > 1):
                result = "error"
            else:
                result = stack.pop(-1)

        elif i in operators.keys():
            if(len(stack) < 2):
                result = "error"
                break
            else:
                a = int(stack.pop())
                b = int(stack.pop())
                result = operators[i](int(a), int(b))
                stack.append(int(result))
        else:
            stack.append(i)
    print("#%s %s" % (tc, result))

이렇게 코드를 바꾸니 훨씬 간단하고 보기 좋다. 고수가 되기 위해선, 어떤 순서로 먼저 분기할지, 예제를 써가면서 고민해본 뒤 코드를 뱉어내는 게 좋을 것이다..


참고자료

0%