문제설명

 

소스코드

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Stack;
public class Main
{
    public static void main(String[] args) throws Exception
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Stack<Double> operand = new Stack<>();
        HashMap<Character, Integer> hash = new HashMap<>();
        int N = Integer.parseInt(br.readLine());
        String input = br.readLine();
        for(int i = 0; i < N; ++i) //A~Z까지 알파벳을 피연산자와 매핑시킴
        {
        	char tmp = 'A';
        	tmp += i;
        	hash.put(tmp, Integer.parseInt(br.readLine()));
        }
        for(int i = 0; i < input.length(); ++i)
        {
        	if(input.charAt(i) == '+' || input.charAt(i) == '-' || input.charAt(i) == '*' || input.charAt(i) == '/')
        	{
                double A = operand.pop();
                double B = operand.pop();
                if(input.charAt(i) == '+') operand.push(B + A);
            	else if(input.charAt(i) == '-') operand.push(B - A);
            	else if(input.charAt(i) == '*') operand.push(B * A);
            	else if(input.charAt(i) == '/') operand.push(B / A);
        	}
        	else operand.push((double)hash.get(input.charAt(i)));
        }
        System.out.printf("%.2f", (double)operand.pop());
    }
}

 

설명

수식의 중위 표기법과 후위 표기법

 

후위 표기식을 계산하는 알고리즘

 

  • 입력의 두 번째 줄에 주어지는 알파벳과 3번째 줄부터 주어지는 피연산자들의 매핑 관계를 만들기 위해 해시테이블을 사용하였다.
  • 부동 소수점의 부정확성 때문에 float말고 double을 사용해야 한다.