[백준] 1935번 후위 표기식2 - Python / 알고리즘 기초 1/2 - 자료구조 1 (참고)

ByungJik_Oh·2025년 3월 19일
0

[Baekjoon Online Judge]

목록 보기
13/244
post-thumbnail



💡 문제

후위 표기식과 각 피연산자에 대응하는 값들이 주어져 있을 때, 그 식을 계산하는 프로그램을 작성하시오.

입력

첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이는 100을 넘지 않는다) 그리고 셋째 줄부터 N+2번째 줄까지는 각 피연산자에 대응하는 값이 주어진다. 3번째 줄에는 A에 해당하는 값, 4번째 줄에는 B에 해당하는값 , 5번째 줄에는 C ...이 주어진다, 그리고 피연산자에 대응 하는 값은 100보다 작거나 같은 자연수이다.

후위 표기식을 앞에서부터 계산했을 때, 식의 결과와 중간 결과가 -20억보다 크거나 같고, 20억보다 작거나 같은 입력만 주어진다.

출력

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


💭 접근

  1. 문제 조건에서 입력되는 알파벳은 무조건 순서대로 사용되므로 alph 문자열의 index와 num 배열의 index가 같다는 것을 사용하여 알파벳으로 입력된 후위표기식을 숫자로 바꿔준다.

    ex) 예제
    a = ['A', 'B', 'C', '*', '+', 'D', 'E', '/', '-']
    num = [1, 2, 3, 4, 5]
    -> a = [1, 2, 3, '*', '+', 4, 5, '/', '-']

  2. 이후 for 문을 돌면서 type(a[i])가 int 이면 stack에 append 해주고, int가 아니면(연산자이면) 연산을 해준다.
  3. 이때 주의해야 할 점이 있는데, pop()의 경우 뒤에서부터 원소를 빼주는 함수이기 때문에 순서가 중요한 -, / 연산에서 그냥 빼서 연산을 진행하면 답이 달라질 수 있다.
    -> 뒤에 오는 숫자를 먼저 pop 해준다.
    back = stack.pop()
    front = stack.pop()
    #front - back or front / back
  4. 연산을 한 후, 그 결과를 다시 stack에 append 해준다.

📒 코드

alph = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

n = int(input())
a = list(input())
num = [int(input()) for _ in range(n)]
stack = []

for i in range(len(a)):
    if a[i] in alph:
        a[i] = num[alph.index(a[i])] # 알파벳을 숫자로 변환

for word in a:
    if type(word) is int:
        stack.append(word)
    else: # 연산자일 때
        back = stack.pop() # 뒤에 오는 숫자 먼저 빼주기!
        front = stack.pop()

        if word == '+':
            stack.append(front + back)
        elif word == '-':
            stack.append(front - back)
        elif word == '*':
            stack.append(front * back)
        elif word == '/':
            stack.append(front / back)

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

💭 후기

후위 표기식의 원리를 잘 이해했다면 쉽게 풀릴 문제였다. 앞서 풀었던 stack 문제들과 많이 비슷했던 것 같다. 어떤 변수는 append, 다른 변수가 입력될 때 조건에 맞춰서 stack에서 pop.

소수 표현할 때 format 함수 기억하기!

format(float(stack[0]), '.2f')

🔗 문제 출처

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


profile
精進 "정성을 기울여 노력하고 매진한다"

0개의 댓글