ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준/JAVA] 후위 표기식2
    Algorithm 2024. 10. 17. 10:37

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


    - 문제 풀이

    ==> 후위 표기식 
    ABC*+DE/-
    ==> 원래 식
    A+(B*C)-(D/E)

    💡스택을 사용해 피연산자(A,B,C..)가 나오면 스택에 집어넣고 연산자가 나올 때마다 스택에 있는 피연산자를 꺼내 연산!

    ex) 스택에 A,B,C가 들어있고 다음에 나오는 피연산자 *가 나오면 스택 상단에 있는 두개의 피연산자를 꺼내(.pop())

          피연산자와 연산한다 (B*C) 

     


     

    - 정답 코드

    import java.io.*;
    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()); // 5
            String s = br.readLine(); // ABC*+DE/-
            // 숫자 담을 배열
            double[] arr = new double[N];
            for(int i = 0; i < arr.length; i++) {
                arr[i] = Double.parseDouble(br.readLine()); // 1 2 3 4 5
            }
            // 피연산자가 나올때마다 담을 스택
            Stack<Double> stack = new Stack<>();
    
            double answer = 0;
    
            for(int i = 0; i < s.length(); i++) {
                // 피연산자가 나왔을 때
                if(s.charAt(i) >= 'A' && s.charAt(i) <= 'Z') {
                    // 알파벳 - 'A' 차이 = 알파벳의 순서
                    // ex) 'A' - 'A' = 0
                    //     'B' - 'A' = 1
                    stack.add(arr[s.charAt(i) - 'A']);
                // 연산자가 나왔을 때
                }else{
                    double a = stack.pop(); // C
                    double b = stack.pop(); // B
                    switch(s.charAt(i)) {
                        case '+':
                            answer = b + a;
                            stack.push(answer);
                            continue;
                        case '-':
                            answer = b - a;
                            stack.push(answer);
                            continue;
                        case '*':
                            answer = b * a;
                            stack.push(answer);
                            continue;
                        case '/':
                            answer = b / a;
                            stack.push(answer);
                            continue;
                    }
                }
            }
            // 소숫점 둘째 자리까지 출력
            System.out.printf("%.2f",stack.pop());
        }
    }

    'Algorithm' 카테고리의 다른 글

    [백준/JAVA] 스택 수열  (0) 2024.10.19
    [백준/JAVA] 프린터 큐  (0) 2024.10.17
    [프로그래머스/JAVA] 큰 수 만들기  (0) 2024.10.16
    [프로그래머스/JAVA] 구명보트  (0) 2024.10.16
    [프로그래머스/JAVA] 체육복  (0) 2024.10.15
Designed by Tistory.