곽로그

[백준 1935, Java] 후위표기식2 본문

알고리즘/백준

[백준 1935, Java] 후위표기식2

일도이동 2020. 10. 26. 13:02
반응형

문제

 

 

1935번: 후위 표기식2

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

www.acmicpc.net

 

check

1. 문제이해를 잘 못했다. ABCD에 대응하는 숫자가 차례로 주어지는 줄 알았다. 즉 1 1 1 1 이라도 A B C D로 주어지는 걸로 생각

 

→ 테스트 케이스를 잘 볼것

 

2. A의 아스키코드를 이용하면 꽤나 쉽게 풀 수 있다

3. Sting num = 10 이면 num.charAt(0)에 10 이 있는 걸로 생각. 

코드

package october.fifthWeek;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.text.DecimalFormat;
import java.util.Stack;


public class PostfixExpression {
    public static void main(String[] args) throws Exception {
        /*
            1) ABC*+DE/-를 입력받는다(operation)
            2) alphabetNum을 선언한다(char[])
            3) alphabet에 대응하는 숫자를 입력받는다.
            3) operation을 순회하면서 index에 있는 요소가 연산자가 아니면(알파벳이면) alphabetNum에서 알파벳에 대응하는 숫자를 push하고
            4) 연산자이면 스택에서 숫자 두개를 pop 하고 연산자와 연산한 값을 stack에 push 한다
         */
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        DecimalFormat decimalFormat = new DecimalFormat("####.00");
        int[] alphabetNum = new int[26];

        int N = Integer.parseInt(br.readLine());
        String[] operation = br.readLine().split("");
        for(int index = 0; index<N; index++){
            alphabetNum[index] = Integer.parseInt(br.readLine());
        }
        Stack<Double> stack  = new Stack<>();

        for(int index = 0; index<operation.length;index++){
            char element = operation[index].charAt(0);
            if(isOperator(element)){
                double num2 = stack.pop();
                double num1 = stack.pop();
                double result = operate(num1, num2,element);
                stack.push(result);
            }
            else{
                double num = alphabetNum[element-65];
                stack.push(num);
            }
        }
        String result = decimalFormat.format(stack.pop());
        bw.write(result);
        bw.flush();

    }
    public static double operate(double num1, double num2, char operator){
        double result = 0;
        if(operator=='+'){
            result = num1+num2;
        }
        else if(operator=='-'){
            result = num1-num2;
        }
        else if(operator=='*'){
            result = num1*num2;
        }
        else if(operator=='/'){
            result = num1/num2;
        }
        return  result;
    }
    public static boolean isOperator(char operator){
        boolean result = false;
        if(operator=='+' ||operator=='-'  ||operator=='/' || operator=='*'){
            result = true;
        }
        return result;
    }
}
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 1406, Java] 에디터  (0) 2020.10.28
[백준 10820, Java] 문자열 분석  (0) 2020.10.27
[백준1158, Java] 요세푸스 문제  (0) 2020.10.20
백준 19236 청소년 상어 (Java)  (0) 2020.10.17
[백준 15686, Java] 치킨배달  (0) 2020.10.15
Comments