백준 - 1935 : 후위 표기식 2

밀양박최고점박혜성·2022년 7월 13일
0

Stack

목록 보기
2/2

후위표기식은 피연산자 뒤에 연사자를 적는 것이다.

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)를 빼주어야 원활하게 피연사자에 따라서 입력받은 수가 저장된 배열의 인덱스를 결정할 수 있다.

profile
어..ㅓ 이게 왜 돌아가

0개의 댓글