ALGORITHM

[JAVA] 백준 1935번- 후위 표기식2

연듀 2022. 7. 19. 12:05

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

 

1935번: 후위 표기식2

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

www.acmicpc.net

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Stack;

public class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());

        String str = br.readLine();

        HashMap<Character, Integer> map = new HashMap<>();

        char ch = 'A';
        for(int i=0; i<n; i++){
                map.put(ch++, Integer.parseInt(br.readLine()));
        }

        Stack<Double> stack = new Stack<>();

        for(int i=0; i<str.length(); i++){
            char val = str.charAt(i);
            if(Character.isLetter(val)){ // 알파벳이면 해당하는 숫자를 스택에 추가
                stack.push((double)map.get(val));
            }
            else{ // 연산자일 경우 스택에서 숫자 두개 꺼내 계산
                double r = stack.pop();
                double l = stack.pop();

                switch(val){
                    case '+':
                        stack.push(l+r);
                        break;
                    case '-':
                        stack.push(l-r);
                        break;
                    case '*':
                        stack.push(l*r);
                        break;
                    case '/':
                        stack.push(l/r);
                        break;
                }
            }
        }
        System.out.println(String.format("%.2f", stack.pop()));
    }
}

 

해시맵을 사용해 피연산자인 알파벳을 키로, 알파벳에 해당하는 숫자를 값으로 저장한다.

문자열을 돌며 알파벳이면 스택에 저장하고, 연산자이면 스택에서 위에 있는 두개의 숫자를 pop해 연산한 후 다시 push한다. 

이렇게 연산을 진행하고 스택에 마지막에 남아있는 값이 정답이다.