본문 바로가기
Algorithm Study/BaekJoon (JAVA)

백준 1918_후위 표기식_JAVA

by 창브로 2024. 4. 29.
728x90

https://www.acmicpc.net/problem/1918

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Stack<Character> stack = new Stack<>();
        String line = br.readLine();
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < line.length(); i++) {
            char chr = line.charAt(i);
            if(chr >= 'A' && chr <= 'Z') {
                sb.append(chr);
            } else {
                int p = priority(chr); // 현재 연산자 우선순위 구하고
                switch (chr) {
                    case '*':
                    case '/':
                    case '-':
                    case '+':
                        while(!stack.isEmpty() && priority(stack.peek()) >= p) {
                            // 현재 연산자보다 큰 우선순위를 가진 연산자를 만날때까지 모두 pop하고 정답에 저장
                            sb.append(stack.pop());
                        }
                        stack.push(chr);
                        break;

                    case ')':
                        while (!stack.isEmpty() && stack.peek() != '(') {
                            sb.append(stack.pop());
                        } // )는 최우선 연산자이기 때문에 '('를 만날때까지 모두 pop

                        stack.pop(); // 남아있는 '('를 꺼냄
                        break;
                    case '(':
                        stack.push(chr);
                        break;
                }
            }
        }

        while (!stack.isEmpty()) {
            sb.append(stack.pop());
        }

        System.out.print(sb.toString());

    }

    private static int priority(char chr) { // 우선순위 반환
        switch (chr) {
            case '*': return 2;
            case '/': return 2;
            case '-': return 1;
            case '+': return 1;
            default: return 0;
        }
    }
}

 

 

회고

- 전혀 생각이 나질 않아서 블로그를 참고하고 풀었다.

- 다시 풀어봐야겠다.

- 단순 스택만을 써서 푸는 문제중 어려운 문제들은 이런식으로 나올 것 같다.

'Algorithm Study > BaekJoon (JAVA)' 카테고리의 다른 글

백준 2470_두 용액_JAVA  (0) 2024.05.19
백준 16234_인구 이동_JAVA  (0) 2024.05.05
백준 4949_균형잡힌 세상_JAVA  (0) 2024.04.28
백준 10799_쇠막대기_JAVA  (0) 2024.04.24
백준 10773_제로_JAVA  (0) 2024.04.23