본문 바로가기
알고리즘/백준

백준 1935번 - 후위 표기식 2

by latissimus 2022. 3. 13.

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.Stack;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Stack<Double> stack = new Stack<>();
        double result;

        //N(알파벳 개수) 읽기
        int N = Integer.parseInt(br.readLine());

        //식 읽기
        String postfixExpression = br.readLine();

        // 알파벳 읽기
        // 'A' = 65 이기때문에, 인덱스 0(A-65)에 A의 값이 들어간다. 인덱스 1(B-65)에는 B의 값이 들어간다.
        double[] arr = new double[N];
        for(int i=0; i<N; i++){
            arr[i] = Double.parseDouble(br.readLine());
        }

        // 받아온 식 해석
        for(int i=0; i<postfixExpression.length(); i++){
            char ch = postfixExpression.charAt(i);

            //연산자 만나면 스택에서 두 개 빼서 연산하고 결과 다시 넣기
            if(isOperator(ch)){
                double back = stack.pop(); //먼저 뺀 놈이 뒤로 오게 위치를 바꾼다.
                double front = stack.pop();
                result = calculate(front, back, ch);
                stack.push(result);

            //연산자 이외 (알파벳)이면 값 해석해서 스택에 넣기
            } else{
                stack.push(arr[ch-65]);
            }
        }
        System.out.printf("%.2f", stack.pop());
    }


    public static boolean isOperator(char ch) {
        if (ch == '+' || ch == '-' || ch == '*' || ch == '/') {
            return true;
        }
        return false;
    }
    public static double calculate(double front, double back, char operater){
        if(operater == '+'){
            return front + back;
        }
        if(operater == '-'){
            return front - back;
        }
        if(operater == '*'){
            return front * back;
        }
        if(operater == '/'){
            return front / back;
        }
        return 0;
    }
}

계속 실패가 나와서 알고보니 %2f라고 썼다. *포맷팅 공부가 필요하다.

댓글