출처: www.acmicpc.net/problem/1935
후위 표기식2 성공분류
시간 제한 | 메모리 제한 | 제출 | 정답 | 맞은 사람 | 정답 비율 |
2 초 | 128 MB | 6346 | 2827 | 2245 | 44.686% |
문제
후위 표기식과 각 피연산자에 대응하는 값들이 주어져 있을 때, 그 식을 계산하는 프로그램을 작성하시오.
입력
첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이는 100을 넘지 않는다) 그리고 셋째 줄부터 N+2번째 줄까지는 각 피연산자에 대응하는 값이 주어진다. (3번째 줄에는 A에 해당하는 값, 4번째 줄에는 B에 해당하는값 , 5번째 줄에는 C ...이 주어진다, 그리고 피연산자에 대응 하는 값은 정수이다)
출력
계산 결과를 소숫점 둘째 자리까지 출력한다.
예제 입력 1
5
ABC*+DE/-
1
2
3
4
5
예제 출력 1
6.20
예제 입력 2
1
AA+A+
1
예제 출력 2
3.00
이번 문제를 보고 자료구조가 생각났다. 수업에서 후위표기식을 중위표기식으로 나타내는 내용도 배웠었는데 마침 그와 관련된 내용이었다. 피연산자의 경우에는 append()함수를 통해 스택에 push해주고, 연산자일 경우에는 스택 윗부분의 두 피연산자를 불러오고 계산한 결과값을 대신 넣어준다. 아래의 모든 연산을 마치고 나서는 스택의 마지막 값이 출력된다.
먼저 파이썬 내의 인터프리터를 제어해주기 위해서 import sys를 해주었다. 그리고 입력한 숫자를 저장할 변수를 num으로 지정해주고, 그 num의 수만큼 리스트를 만들어 주는 방식으로 nums=[0]*num을 이용해주었다. ord()란 특정한 한 문자를 아스키 코드 값으로 변환해주는 함수이다. append는 리스트의 맨 마지막에 추가하는 것이다.
소스코드는 아래와 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
import sys
num=int(input())
cal=input()
nums=[0]*num
for i in range(num):
nums[i]=int(input())
stack=[]
for j in cal:
if 'A'<=j<='Z':
stack.append(nums[ord(j)-ord('A')])
else:
second=stack.pop()
first=stack.pop()
if j=='+':
stack.append(first+second)
elif j=='-':
stack.append(first-second)
elif j=='/':
stack.append(first/second)
elif j=='*':
stack.append(first*second)
print(f"{stack[0]:.2f}")
|
cs |
스택의 개념에 대해 다시한번 정리하고 넘어갈 수 있는 문제였다.
'Baekjoon Online' 카테고리의 다른 글
[python] 백준 1652번_누울 자리를 찾아라 (0) | 2021.01.11 |
---|---|
[python] 백준 1019번_책 페이지 (0) | 2021.01.10 |
[C] 백준 2562번_최댓값 (0) | 2021.01.08 |
[C] 백준 2588번_곱셈 (0) | 2021.01.07 |
[C] 백준 2798번_블랙잭 (0) | 2021.01.06 |