백준/코드 플러스 (알고리즘 기초 - 1)

[백준] 203 - 자료구조 1 (참고) : 후위 표기식2 (1935번 JAVA)

MoveForward 2023. 1. 6. 09:46

[백준] 203 - 자료구조 1 (참고) : 후위 표기식2 (1935번 JAVA)


[풀이 중점]

* 아스키 코드를 활용하여 계산식에서 피연산자를 구분하여야 한다.

* 후위 표기법 계산 방법을 숙지해야 한다.


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Stack;

public class Main{
    
    public static void main(String[] args) throws IOException{

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        Stack<Double> stack = new Stack<>();
        
        // 피연산자 수
        int N = Integer.parseInt(br.readLine());
        
        // 계산식
        String str = br.readLine(); 

        // 피연산자에 대응하는 값 입력 받기 (0부터 A)
        double[] arr = new double[N];
        for(int i=0; i<N; i++){
            arr[i] = Integer.parseInt(br.readLine());
        }


        for(int i=0; i<str.length(); i++){

            // 아스키 코드를 통해 피연산자 판단 (A : 65 ~ Z : 90)
            if( (int) str.charAt(i) >= 65 &&  (int) str.charAt(i) <= 90){
                stack.push( arr[(int) str.charAt(i) - 65] );
            }

            double first; double second;
            // 연산자
            switch (str.charAt(i)) {
                case '+':
                    second = stack.pop();
                    first = stack.pop();
                    stack.push(first + second);
                    break;
                case '-':
                    second = stack.pop();
                    first = stack.pop();
                    stack.push(first - second);
                    break;
                case '*':
                    second = stack.pop();
                    first = stack.pop();
                    stack.push(first * second);
                    break;
                case '/':
                    second = stack.pop();
                    first = stack.pop();
                    stack.push(first / second);
                    break;
            }
        }
        double result = stack.pop();
        // 소수점 둘째자리 까지 표시
        String s = String.format("%.2f", result);
        bw.write(s+"\n");
        bw.flush();
        bw.close();
    }
}