정구리의 우주정복

4874. [파이썬 S/W 문제해결 기본] 5일차 - Forth 본문

ALGORITHM/SOLVE

4874. [파이썬 S/W 문제해결 기본] 5일차 - Forth

Jungry_ 2020. 5. 18. 17:55
반응형

#파이썬으로 품

##분명 나보다 더 좋은 해결책이 있을거임

 

testCase = int(input())

for i in range(testCase):
    stack = []
    string = list(input().split())
    top = 0 
    try:
        if len(string)<2:
            result ='error'
        if string[0]=='+' or string[0] =='-' or string[0]=='/' or string[0]=='*' or string[0]=='.': #맨처음에 연산자 들어온 경우
            result ='error'
        else: 
            stack.append(string[0]) #연산자가 아니라면 1 append
        for j in range(1,len(string)):
            if string[j] =='+':#연산자가 들어온 경우
                if len(stack) < 2:
                    result = 'error'
                    break
                else:
                    sum = str(int(stack[top-1])+int(stack[top]))
                    stack.pop(top)
                    stack.pop(top-1)
                    top -= 1
                    stack.append(sum)
            elif string[j] =='-':
                if len(stack) < 2:
                    result = 'error'
                    break
                else:
                    sum = str(int(stack[top-1])-int(stack[top]))
                    stack.pop(top)
                    stack.pop(top-1)
                    top -= 1
                    stack.append(sum)
            elif string[j] =='*':
                if len(stack) < 2:
                    result = 'error'
                    break
                else:
                    sum = str(int(stack[top-1])*int(stack[top]))
                    stack.pop(top)
                    stack.pop(top-1)
                    top -= 1
                    stack.append(sum)
            elif string[j] =='/':
                if len(stack) < 2:
                    result = 'error'
                    break
                else:
                    sum = str(int(stack[top-1])//int(stack[top]))
                    stack.pop(top)
                    stack.pop(top-1)
                    top -= 1
                    stack.append(sum)
            elif string[j] =='.': #. 이 들어온 경우
                if len(stack) > 1:
                    result ='error'
                    break
                else:
                    result = stack[0]

            else: #숫자가 들어온 경우 
                stack.append(string[j])
                top += 1
        print("#"+str(i+1)+" "+result)
    except:
        print('#'+str(i+1)+' error')

 

만약 eval() 을 쓸수 있었다면 좀 더 코드가 간결했겠지만 못써서 아주 길어졌다 하지만 어려운 코드는 아니니까 이해하기는 쉬울듯

!!중요한건 0에 대한 처리와 (ZeroDivisionError) '/'  를 입력하더라도 계산은 '//' 로 해줘야하는 !! 

반응형
Comments