본문 바로가기

알고리즘/백준알고리즘

[백준 알고리즘/Python3] 1935 후위 표기식2

문제이해

먼저 들어온 문자열에 'A'~'Z'까지 들어온 숫자로 변환해서 새로운 식을 만들었습니다.

그 다음 숫자가 들어오면 스택에 push, 문자가 들어오면 pop 해서 이전에 들어왔던 값을 계산하고 다시 스택에 push 하는 것을 만들었습니다.

그런데 체점을 하니 런타임 에러가 났습니다.

 

코드

import string
test_num = int(input())

calculation = input()
english = list(string.ascii_uppercase)

stack = []
#후위 표기식에 숫자 넣기
for i in range(test_num):
    word = input()
    #replace는 변환된 문자열을 반환함
    calculation = calculation.replace(english[i], word, calculation.count(english[i]))

calculation = list(calculation)

for i in calculation:
    #문자가 숫자이면
    if(i.isalnum()):
        stack.append(i)
    else:
        n2 = str(stack.pop())
        n1 = str(stack.pop())
        modify = str(i)
        result = n1 + modify + n2
        result = eval(result)
        stack.append(result)

answer = round(stack[0],4)
print(format(stack[0], ".2f"))

eval은 문자열중에 기호가 있다면 그대로 출력하지 않고 계산을 하고 출력해줍니다.

다른 방법을 찾아본 결과 들어온 수식을 숫자로변환하지 않고도 스택에 넣는 방법이 있었습니다.

 

코드

import string
test_num = int(input())

calculation = input()
english = [0] * test_num

stack = []
for i in range(test_num):
    english[i] = int(input())

# calculation = list(calculation)

for i in calculation:
    #문자가 숫자이면
    if(i.isalnum()):
        stack.append(english[ord(i) - ord('A')])
    else:
        n2 = (stack.pop())
        n1 = (stack.pop())
        if (i == '+'):
             stack.append(n1 + n2)
        elif(i == '-'):
             stack.append(n1 - n2)
        elif(i == '*'):
             stack.append(n1 * n2)
        elif(i == '/'):
             stack.append(n1 / n2)

print(format(stack[0], ".2f"))

english에는 A,B,C,D...문자에 넣을 값들을 넣어둡니다. 그리고 'A'의 아스키 코드값을 뺀 위치의 값이 해당 문자의 숫자를 의미합니다.

ex) 'C'문자열은 67입니다. 'A'는 65로 기준이 됩니다.

즉, 모든 대문자는 'A'(65)를 기준으로 한칸씩 앞으로 갑니다.

 

ord()는 문자의 아스키 코드값을 반환합니다. 수식을 for문으로 돌면서 ord()로 문자의 아스키 코드값을 받고 'A'의 값을 빼면 english에서 자신의 위치가 나오게 됩니다.

 

이렇게 아스키 코드로 값을 넣는 새로운 방법을 알게되었습니다.

728x90