728x90
https://www.acmicpc.net/problem/1935
문제 설명
후위 표기식과 각 피연산자에 대응하는 값들이 주어져 있을 때, 그 식을 계산하는 프로그램을 작성하시오.
풀이 과정
- 나의 풀이
① 이 문제에서 직관적으로 파악한 것은 '두번째 줄에 후위 표기식이 주어지고 3번째줄부터 피연산자에 대응하는 값이 주어져 후위표기식을 계산하여 출력하는 거구나'이다.
② 아이디어 열기
(1) 첫번째 줄에 나온 피연산자의 개수는 괜히 주어진 값이 아니다. 특정 리스트에 피연산자의 개수만큼의 항목을 넣고자 주어진 값이다.
(2) 후위 표기식 특성상 연산자가 등장하면 앞의 피연산자들을 뒤부터 계산하는 방식이다. 그러므로 특정 리스트 stack에 피연산자의 값을 저장하고 연산자를 만나면 pop함수를 통해 끄집어와서 계산하는 방식을 채택해야겠다고 생각하였다.
(3) 마지막으로 출력값은 소수점 2번째 자리까지 제한해야함을 알아차렸다.
이를 실제 코드에 구현해보면 다음과 같다.
# 1935 후위 표기식2
n = int(input())
word = input() # 후위표기식을 word에 저장함
num_lst = [0]*n # 피연산자값을 저장하기 위한 num_lst 생성
for i in range(n):
num_lst[i] = int(input()) # 피연산자값 받기
stack = [] # stack 리스트를 통해 후위표기식 계산
for i in word :
if 'A' <= i <= 'Z' : # 후위표기식에서 알파벳을 만나면 stack에 저장한다.(물론 알파벳 형태가 아닌 피연산자값의 형태로)
stack.append(num_lst[ord(i)-ord('A')])
else : # 연산자를 만나면
str2 = stack.pop() # stack 리스트의 마지막 2항목을 꺼내와서 계산한다.
str1 = stack.pop()
if i =='+' :
stack.append(str1+str2)
elif i == '-' :
stack.append(str1-str2)
elif i == '*' :
stack.append(str1*str2)
elif i == '/' :
stack.append(str1/str2)
print('%.2f' %stack[0]) # '%.2f' % 함수를 통해 소수점 자릿수를 제한한다.
후기
후위표기식의 개념을 정확히 파악하고 stack 리스트에 알파벳이 아니라 피연산자의 값으로 저장해야함을 알면 쉽게 풀리는 문제이다.
+) i가 알파벳인지 파악을 위해 'A'<=i<='Z' 사용함.
num_lst라는 빈 리스트로 피연산자값 받기.
stack.append(num_lst[ord(i)-ord('A')])를 통해 stack 리스트에 알파벳이 아닌 피연산자값 저장하기. 왜냐하면 피연자값은 알파벳 순서로 저장되었기 때문에.
'Algorithm' 카테고리의 다른 글
[백준] 1406 에디터 (파이썬 Python) (0) | 2021.07.17 |
---|---|
[백준] 11718 그대로 출력하기 파이썬(Python) (0) | 2021.07.10 |
[백준] 2743 단어 길이 재기 (파이썬 Python) (0) | 2021.07.08 |
[백준] 9012 괄호 (파이썬 Python) (0) | 2021.07.08 |
[백준] 11729 하노이 탑 이동 순서 (파이썬 Python) (0) | 2021.07.08 |