코딩테스트 준비/백준

[백준] 1935번 후위 표기식2 - 파이썬(Python)

youjin86 2021. 7. 29. 21:33

https://www.acmicpc.net/problem/1935

 

1935번: 후위 표기식2

첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이

www.acmicpc.net

 

문제

 

접근법

 

생각해야할 건 크게 2가지였다.

첫째, 후위표기식을 어떻게 계산할지

둘째, 알파벳에 숫자들을 어떻게 넣을지

 

첫째를 해결하기 위해 하나하나 과정을 적어보았고, 이들의 공통점을 묶어 나열해 보았다.

'연산자일 때 코드를 어떻게 구성할까'가 가장 큰 고민이었는데, 연산자로 연산된 결과도 스택에 집어넣음으로 해결할 수 있음을 깨닫게 되면서 첫째 고민이 해결되었다.

 

이제 둘째를 해결해야했는데, 숫자를 각 알파벳에 맞게 어떻게 하면 여러 번 for문을 안 돌리고 한 방에 해결할 수 있음에 대해 고민을 하게 되었다.

고민 결과, 아스키 코드를 떠올렸고 문제에서 알파벳 순서에 맞게 숫자들을 제공해준다 하였으니 그걸 이용해야겠다는 생각이 들었다.

 

[주요 변수]

expression (list) : 후위연산식

num (list) : 알파벳 순서에 맞게 제공된 값들

stk (list) : 연산해야하는 숫자들 모음

 

[과정]

1. 후위연산식이 들어있는 expression 앞에서부터 읽기

2. 만약 알파벳일 경우,해당 알파벳을 아스키 코드로 바꾸어 65를 뺀 값을 인덱스로 하는 num을 stk에 append

    (이유 : 'A'의 아스키 코드 값이 65이기 때문)

3. 만약 연산자일 경우, stk에서 두 번 pop

4. 후위연산자이기 때문에 먼저 pop되는 숫자가 연산의 뒤에 있어야 함을 주의하여 나온 2숫자를 연산자에 맞게 연산

5. 연산이 끝난 결과는 다시 계산을 위해 stk에 append

6. 1~5번을 반복

7. 계산 결과를 소숫점 둘째 자리까지 출력

 

 

코드

N=int(input())
expression=list(input())
num=[int(input()) for i in range(N)]

stk=[]

for i in expression:
    if i.isalpha():
        stk.append(num[ord(i)-65])
    else:
        a=stk.pop()
        result=stk.pop()

        if i=='+':
            result+=a

        elif i=='-':
            result-=a

        elif i=='*':
            result*=a

        elif i=='/':
            result/=a

        stk.append(result)

print('%.2f' %stk[-1])