본문 바로가기
컴퓨터 공학/백준

[백준] JAVA 자바 : 후위 표기식2 (1935번)

by kim-dev 2024. 1. 20.
반응형

후위 표기식을 구현하는 문제이다.
사실 알파벳 마다 숫자를 대응시키는 것만 잘 해줬다면 큰 어려움 없이 쉽게 풀 수 있을 듯?

나 같은 경우에는 N개 만큼 배열 n_list를 만들어서 알파벳 A를 입력받으면 n_list[(int)A-65]에 그 수를 담고, 이후에 알파벳을 만나면 그 배열에서 수를 꺼내서 스택에 담는 형태로 코딩했다.

사실 나는 후위표기식에서 처음 pop()한 수가 오른쪽 피연산자가 되는 줄 모르고 계속 왼쪽에 두고 짰다가 이상한 결과가 나와서… 이번 기회에 제대로 배워간다…

import java.io.*;
import java.util.Stack;

public class Postfix2_1935 {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Stack<Double> stack = new Stack<>();
        
        int N = stoi(br.readLine());
        int[] n_list = new int[N]; // 각 알파벳에 대응되는 수를 담을 배열
        String str = br.readLine();
        
        for (int i=0; i<N;i ++) { // n_list에 각 알파벳과 대응되는 수를 담는다
            int ent = stoi(br.readLine());
            n_list[i] = ent;
        }
        
        double tmp_a, tmp_b; // 나중에 pop()해서 연산할 값들(피연산자)
        for (int i=0; i<str.length(); i++) {
            char c = str.charAt(i);
            switch (c) {
            case '+':
                tmp_b = stack.pop(); // 먼저 꺼낸 값이 오른쪽 피연산자에 들어간다
                tmp_a = stack.pop(); // 나중에 꺼낸 값이 왼쪽 피연산자에 들어간다
                stack.push(tmp_a + tmp_b);
                break;
            case '-':
                tmp_b = stack.pop();
                tmp_a = stack.pop();
                stack.push(tmp_a - tmp_b);
                break;
            case '*':
                tmp_b = stack.pop();
                tmp_a = stack.pop();
                stack.push(tmp_a * tmp_b);
                break;
            case '/':
                tmp_b = stack.pop();
                tmp_a = stack.pop();
                stack.push(tmp_a / tmp_b);
                break;
            default: // 연산자가 아니라 알파벳인 경우
                int num = (int)c - 65; // 그 알파벳에 해당하는 배열 인덱스를 구함
                stack.push((double)n_list[num]); // 그 인덱스의 배열 요소를 꺼내 스택에 담음
                break;
            }
        }
        System.out.printf("%.2f", stack.pop());
    }
    
    public static int stoi(String str) {
        return Integer.parseInt(str);
    }

}

 

 

로그인

 

www.acmicpc.net

 

 

작성일자: 2023-09-04