Algorithm/PTUStudy

11주차. 후위표기식2

지구우중 2023. 4. 7. 19:17

1935. 후위표기식2

https://www.acmicpc.net/problem/1935

 

1935번: 후위 표기식2

첫째 줄에 피연산자의 개수(1 ≤ N ≤ 26) 가 주어진다. 그리고 둘째 줄에는 후위 표기식이 주어진다. (여기서 피연산자는 A~Z의 영대문자이며, A부터 순서대로 N개의 영대문자만이 사용되며, 길이

www.acmicpc.net

📌문제


- 예제1


  📝입력

5
ABC*+DE/-
1
2
3
4
5



  💻출력

6.20


📌풀이

알고리즘 도출중..

알파벳이 들어왔을 때, Stack에 push해주고 연산자를 만나면 2번 pop해서 연산을 해주면 되는데 이때 중요한 점이 2번째 pop해서 얻어온 값을 앞에 배치하여 연산해야 한다는 점이다.(코드를 보면 이해가 쉬울 것입니다.) 이 점만 파해했다면 어렵지 않게 풀 수 있는 문제이다.

132ms14628kb

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 후위표기식2 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        char[] arr = br.readLine().toCharArray();
        Map<Character, Double> map = new HashMap<>();
        for(char c : arr){
            if( c >= 'A' && c <='Z' && !map.containsKey(c)){
                map.put(c, Double.parseDouble(br.readLine()));
            }
        }

        Stack<Double> stack = new Stack<>();
        for (char c : arr) {
            if ('A' <= c && c <= 'Z') stack.push(map.get(c));
            else if (stack.size()>=2) {
                double temp1 = stack.pop();
                double temp2 = stack.pop();
                switch (c) {
                    case '+':
                        stack.push(temp2 + temp1);
                        break;
                    case '-':
                        stack.push(temp2 - temp1);
                        break;
                    case '*':
                        stack.push(temp2 * temp1);
                        break;
                    case '/':
                        stack.push(temp2 / temp1);
                        break;
                }
            }
        }
        System.out.println(String.format("%.2f",stack.pop()));
    }
}