Programming/JAVA

[백준] 1935: 후위 표기식2

gayeon_ 2024. 2. 5. 17:34

 

후위 표기식을 입력하고 계산 결과값을 출력하는 문제이다.

 

 

 

 

입출력 예제이다.

 

 

후위 표기식 ABC*+DE/-는 중위 표기식 (A+(B*C) - (D/E)로 표현할 수 있다.

 

후위 표기식은

피연산자를 스택에 넣고 연산자가 입력되면 pop을 해서 연산한 뒤 결과를 스택에 다시 push하는 방식으로 계산할 수 있다.

 

 

 

package boj;

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

public class Main {

	public static void main(String[] args) throws IOException{

        // BufferedReader를 사용하여 입력을 받기 위한 객체 생성
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // 피연산자의 개수 입력
        int N = Integer.parseInt(br.readLine());

        // 문자를 저장할 스택 생성
        Stack<Double> stack = new Stack<Double>();
        
        // 후위 표기식 입력
        String input = br.readLine();
        
        // 피연산자의 값을 넣을 배열
        double[] arr = new double[N];

        // 피연산자의 개수 만큼 값 입력
        for(int i = 0; i < N; i++) {
        	arr[i] = Double.parseDouble(br.readLine());
      
        }
        
        double result = 0;
        
        for(int i = 0; i < input.length(); i++) {
        	// 피연산자인 경우
        	if(input.charAt(i) >= 'A' && input.charAt(i) <= 'Z') {
        		stack.push(arr[input.charAt(i) - 'A']);
        	} else { // 연산자인 경우
        		double first = stack.pop();
        		double second = stack.pop();
        		
        		switch (input.charAt(i)) {
        		case '+':
        			result = second + first;
        			stack.push(result);
        			continue;
        			
        		case '-':
        			result = second - first;
        			stack.push(result);
        			continue;
        			
        		case '/':
        			result = second / first;
        			stack.push(result);
        			continue;
        			
        		case '*':
        			result = second * first;
        			stack.push(result);
        			continue;
        		}
        		
        	}
        }
        // 결과 출력
        System.out.printf("%.2f", stack.pop());

	}

}

 

연산자를 만나면 pop을 두 번 하게 되는데

이 때 첫 번째로 pop이 된 요소는 first에,

두 번째로 pop한 요소는 second에 저장한다.

 

후위 연산식은 계산할 때 첫 번째로 pop이 된 요소가 연산자 뒤에 위치하게 되므로 연산자가 +라면

second + first

와 같은 순서로 계산하게 된다.

 

arr[input.charAt(i) - 'A']는 현재 읽은 문자(input.charAt(i))가 어떤 알파벳인지에 따라 배열 arr에서 해당 알파벳에 대응하는 값을 스택에 넣기 위해 사용된다.

 

예를 들어 input.charAt(i)가 'A'일 경우, 실제로는 arr[0]에 해당하는 값이 스택에 push되게 됩니다.

이렇게 하면 피연산자의 값을 가져와 계산할 수 있도록 했다.

 

마지막으로 모든 연산을 마친 후 소숫점 둘째 자리까지만 출력해야 하므로 형식지정자 %.2f로 출력했다.