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))
예외 케이스 찾아보다 발견한 유저분 코드
눈 여겨볼 점은 , 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))
이렇게 코드를 바꾸니 훨씬 간단하고 보기 좋다. 고수가 되기 위해선, 어떤 순서로 먼저 분기할지, 예제를 써가면서 고민해본 뒤 코드를 뱉어내는 게 좋을 것이다..
참고자료