프로그래밍/알고리즘
[ 알고리즘 ] 백준 1935번 후위표기식 2
9/3
2019. 5. 2. 16:17
백준 1935번 후위표기식 2
아래 1918번 후위표기식을 풀고 바로 풀어서 그런 지, 바로 풀 수 있었다.
문제는 크게 어려움 없이, 두가지 경우로 나눠서 해결했다.
알파벳인 경우에는 해당하는 숫자를 바로 스택에 push해주었다.
연산자인 경우에는 스택에서 두 피연산자를 pop해준 뒤 ( 두번 ) 이를 연산자를 이용하여 계산하고, 이를 다시 스택에 push해주었다.
위의 두가지를 반복하여 답을 구하였고, System.out.format()
함수를 이용하여 소수점 두자리 까지 표현하였다.
코드
package Algorithms;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
/**
* Baekjoon1935
* 백준 1935 후위표기식2
*/
public class Baekjoon1935 {
private static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public static void main(String[] args) throws IOException {
int N = Integer.parseInt(br.readLine());
Map<Character, Integer> map = new HashMap<>();
String input = br.readLine();
char key = 'A';
for (int i = 0; i < N; i++) {
map.put(key, Integer.parseInt(br.readLine()));
key++;
}
Stack<Double> stack = new Stack<>();
for (char c : input.toCharArray()) {
if (Character.isAlphabetic(c)) {
stack.push(Double.valueOf(map.get(c)));
} else {
double temp = calculate(stack.pop(), stack.pop(), c);
stack.push(temp);
}
}
System.out.format("%.2f",stack.pop());
}
private static double calculate(Double num1, Double num2, char c) {
switch (c) {
case '+':
return num2 + num1;
case '-':
return num2 - num1;
case '*':
return num2 * num1;
case '/':
return num2 / num1;
default:
return -1;
}
}
}