문제 풀이 및 개발 공간

[백준] 후위 표기식 (gold 2 본문

백준공부/java

[백준] 후위 표기식 (gold 2

gomduri43 2024. 5. 17. 12:42

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

public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

        String a=br.readLine();

        Stack<Character> stk=new Stack<>();
        StringBuilder answer=new StringBuilder();

        for(int i=0; i<a.length(); i++){
            //알파벳이면 일단 올림.
            char temp=a.charAt(i);
            if(0<=temp-'A' && temp-'A'<=25){
                answer.append(String.valueOf(temp));
            }
            //만약 + 혹은 -가 나온다면, 이것이 (안에 들어있지 않는 한은
            //연산자를 다 뱉어야 한다. 어느 것이든지 이보다 우선순위가 앞서기 때문에
            else if(temp=='+' || temp=='-'){
                if(!stk.isEmpty()){
                    while(!stk.isEmpty() && stk.peek()!='('){
                        answer.append(String.valueOf(stk.pop()));
                    }
                }
                stk.push(temp);
            }
            //만약 * 혹은 -가 나왔다면, 전에 나온게 *,/이면 뱉는다.
            //이는 (안에 있어도 동일한게, (안에서도 *,/ 전에 *,/가 등장하면
            //앞서 등장한 것 이후에 현재 등장한 것이 실행되어야 하므로
            //스택에 들어있는 *,/가 우선순위를 지닌다.
            else if(temp=='*' || temp=='/'){
                if(!stk.isEmpty() && (stk.peek()=='*' || stk.peek()=='/')){
                    answer.append(String.valueOf(stk.pop()));
                }
                stk.push(temp);
            }
            else{
                if(temp=='('){
                    stk.push(temp);
                }
                //괄호가 )이면, (가 나올때까지 안에 있는 걸 뱉는다.
                //()가 가장 젤 높은 우선순위이므로, )로 인해.
                //이 안의 연산자는 다 실행되어야 하므로, 뱉는다.
                else if(temp==')'){
                    while(true){
                        if(stk.peek()=='('){
                            break;
                        }
                        answer.append(String.valueOf(stk.pop()));
                    }
                    stk.pop();
                }
            }

        }
        //남아있는 연산자가 존재할 수 있다.
        //(전에 연산자가 나오고 젤 마지막, 영어 대문자가 나오면,
        //answer에 붙이기 작업만 하기 때문에 바로 전의 연산자도 뱉지못한 상태)
        while(!stk.isEmpty()){
            answer.append(String.valueOf(stk.pop()));
        }
        System.out.println(answer.toString());
    }
}

'백준공부 > java' 카테고리의 다른 글

[백준] 1781번 컵라면 (gold 2  (0) 2024.05.18
[백준] 12100번 2048 (Easy (gold 2  (0) 2024.05.17
[백준] 1939번 중량제한 (gold 3  (0) 2024.05.16
[백준] 2091번 동전 (gold 3  (0) 2024.05.15
[백준] 1613번 역사 (gold 3  (0) 2024.05.15