문제 출저
https://www.acmicpc.net/problem/1935
1935번: 후위 표기식2
첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이
www.acmicpc.net
문제 풀이
후위 표기식이 주어지고 알파벳의 숫자가 주어집니다. 이 정보를 통해 후위 표기식을 계산한 정답을 구해야 합니다.
Stack, Map을 활용하여 문제를 풀었습니다.
Map으로 알파벳별 숫자를 저장합니다. 후위 표기식에 하나씩 탐색을 합니다.
알파벳이 나올 경우 Map을 통해서 해당되는 알파벳의 double 값을 stack에 저장합니다.
+, -. *, / 연산자가 나올 경우 stack에서 두 개의 값을 pop한 다음 연산을 한 값을 add 했습니다.
후위 표기식을 모두 마치면 stack에 정답이 저장되어 있습니다.
이 값을 string format을 통해 소수점 2자리까지 출력하여 정답을 구했습니다.
소스 코드
package baekjoon.year24.month1.day1120.day20;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
public class B1935 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
String order = br.readLine();
Map<Character, Double> alpaNumber = new HashMap<>();
char start = 'A';
for(int i = 0; i < n; i++) {
Double number = Double.parseDouble(br.readLine());
alpaNumber.put((char) (start + i), number);
}
Stack<Double> stack = new Stack<>();
for(int i = 0; i < order.length(); i++) {
char letter = order.charAt(i);
if(Character.isAlphabetic(letter)) {
stack.add(alpaNumber.get(letter));
}
else {
double two = stack.pop();
double one = stack.pop();
if(letter == '+') stack.add(one + two);
else if(letter == '-') stack.add(one - two);
else if(letter == '*') stack.add(one * two);
else if(letter == '/') stack.add(one / two);
}
}
Double answer = stack.pop();
System.out.println(String.format("%.2f", answer));
}
}