후위표기식은 피연산자 뒤에 연사자를 적는 것이다.
1-2학년 때인가 자료구조 수업시간에 배웠던 기억이 난다.
보자마자 이 문제는 스택을 사용해야겠다고 생각했다. Vv
import sys
k = int(input())
exp = input()
expLen = len(exp)
num = []
exp_stk = []
i, j = 0,0
for _ in range(k) :
a =int(sys.stdin.readline().strip())
if(a<100) :
num.append(a)
if k>=1 and k<=26 and expLen <100:
for i in range(expLen) :
if 'A' <= exp[i] <= 'Z' :
exp_stk.append(num[ord(exp[i])-ord('A')])
j+=1
if(j>=k) : j = k-1
else :
a = exp_stk.pop()
b = exp_stk.pop()
if exp[i] == '+':
res = float(b) + float(a)
exp_stk.append(res)
elif exp[i] == '-':
res = float(b) - float(a)
exp_stk.append(res)
elif exp[i] == '*':
res = float(b) * float(a)
exp_stk.append(res)
elif exp[i] == '/':
res = float(b) / float(a)
exp_stk.append(res)
print("{:.2f}".format(exp_stk.pop()),end="")
문제 구현은 앞 키로거보다 쉬웠다.
하지만 틀렸습니다가 계속 떴다...?
어이가없네...
틀린 코드는
if 'A' <= exp[i] <= 'Z' :
exp_stk.append(num[ord(exp[i])-ord('A')])
피연산자를 만났을 때 스택에 append하는 부분이었다,
나는 이 부분을
if exp[i] >= "A" and exp[i] <="Z" :
exp_stk.append(num[j])
j+=1
if(j>=k) : j = k-1
피연자와 상관없이 강제로 잡았다. 즉
A나 B,C와 상관없이 피연산자의 순서대로 입력받은 수가 저장된 배열의 인덱스를 옮겼다.
하지만 이 문제가 원하는 것은 피연사자에 따라서 인덱스가 자동으로 결정되는 것이었다.
충격 쓰발
ord() -> 입력받은 문자를 아스키코드로 바꿔주는 함수이다.
즉, 피연산자의 아스키코드값을 인덱스로 변환해주는 것인데, 이를 위해서는 0부터 시작하는 배열 인덱스 특성상 A(65) - A(65)를 해주어야 0부터 시작할 수 있다,
따라서 A(65)를 빼주어야 원활하게 피연사자에 따라서 입력받은 수가 저장된 배열의 인덱스를 결정할 수 있다.