프로그래밍/알고리즘

[ 알고리즘 ] 백준 1935번 후위표기식 2

9/3 2019. 5. 2. 16:17

백준 1935번 후위표기식 2

문제 링크

아래 1918번 후위표기식을 풀고 바로 풀어서 그런 지, 바로 풀 수 있었다.

문제는 크게 어려움 없이, 두가지 경우로 나눠서 해결했다.

  1. 알파벳인 경우에는 해당하는 숫자를 바로 스택에 push해주었다.

  2. 연산자인 경우에는 스택에서 두 피연산자를 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;
        }
    }
}