https://www.acmicpc.net/problem/1935
[문제]
후위 표기식과 각 피연산자에 대응하는 값들이 주어져 있을 때, 그 식을 계산하는 프로그램을 작성하시오.
[입력 조건]
첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이는 100을 넘지 않는다) 그리고 셋째 줄부터 N+2번째 줄까지는 각 피연산자에 대응하는 값이 주어진다. 3번째 줄에는 A에 해당하는 값, 4번째 줄에는 B에 해당하는값 , 5번째 줄에는 C ...이 주어진다, 그리고 피연산자에 대응 하는 값은 100보다 작거나 같은 자연수이다.
후위 표기식을 앞에서부터 계산했을 때, 식의 결과와 중간 결과가 -20억보다 크거나 같고, 20억보다 작거나 같은 입력만 주어진다.
[코드]
import java.util.*;
public class BaekJoon_1935 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
Stack<Double> stack=new Stack<>();
int n=sc.nextInt();
String str=sc.next(); // 후위식 입력 받기
double[] number=new double[27];
// 숫자 입력 받기
for(int i=0;i<n;i++)
number[i]=sc.nextDouble();
// 후위식 계산
for(int i=0;i<str.length();i++) {
int code=(int)str.charAt(i);
// 숫자라면 스택에 삽입
if(code>=65&&code<=90)
stack.push(number[code-65]);
// 문자라면 스택에서 두 숫자를 꺼내 연산 후 다시 스택에 삽입한다.
else {
double a=stack.pop();
double b=stack.pop();
double result=0;
switch(code) {
case 42: // * 인 경우
result=b*a;
break;
case 43: // + 인 경우
result=b+a;
break;
case 47: // / 인 경우
result=b/a;
break;
case 45: // - 인 경우
result=b-a;
break;
}
stack.push(result);
}
}
// 계산이 끝난 결과 값을 소숫점 둘째 자리까지 출력한다.
System.out.printf("%.2f",stack.pop());
}
}
[고찰]
후위 표기식은 스택을 사용하여 해결해야 하는 문제였다. 후위식의 연산 방법을 문자일 경우에는 스택에 삽입하고, 연산자일 경우에는 스택에서 두 피연산자를 꺼내 연산 후 결과 값을 스택에 삽입하면 된다. 후위식의 연산 방법만 안다면 쉽게 해결할 수 있는 문제였다.
'백준' 카테고리의 다른 글
[백준_2346번] 풍선 터뜨리기 (0) | 2021.08.11 |
---|---|
[백준_10799번] 쇠막대기 (0) | 2021.08.10 |
[백준_2217번] 로프 (0) | 2021.08.10 |
[백준_18310번] 안테나 (0) | 2021.08.10 |
[백준_10825번] 국영수 (0) | 2021.08.10 |