๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Algorithm

[Algorithm/Java][๋ฐฑ์ค€] 1918 ํ›„์œ„ ํ‘œ๊ธฐ์‹

๋ฐ˜์‘ํ˜•

[BOJ] 1918 ํ›„์œ„ ํ‘œ๊ธฐ์‹

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

๋ฌธ์ œ ์ ‘๊ทผ

์ž…๋ ฅ๋ฐ›์€ String์„ char ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•œํ›„ ํ•˜๋‚˜์”ฉ ์ ‘๊ทผํ•ด์„œ ์—ฐ์‚ฐ์ž๋Š” Stack์„ ์ด์šฉํ•ด ์ฒ˜๋ฆฌํ•˜๊ณ  StringBuilder์˜ append๋ฅผ ์ด์šฉํ•ด์„œ ์ด์–ด ๋ถ™์—ฌ์ฃผ์—ˆ๋‹ค.
์ค‘์œ„ํ‘œ๊ธฐ์‹์—์„œ ํ›„์œ„ํ‘œ๊ธฐ์‹์œผ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ, Stack์„ ์ด์šฉํ•˜๋Š”๋ฐ ํ˜„์žฌ ์—ฐ์‚ฐ์ž๋ณด๋‹ค stack์— top์— ์žˆ๋Š” ์—ฐ์‚ฐ์ž์˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’๋‹ค๋ฉด postfix์— ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.
'*'์™€ '/'๋ฅผ 2, '+' ์™€ '-'๋ฅผ 1, '('์„ 0์œผ๋กœ ์„ค์ •ํ•ด์„œ ์œ„์— ๋ฐฉ์‹์„ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ–ˆ๋‹ค.
์ž…๋ ฅ์„ ๋ฐ›์•„์„œ 4๊ฐ€์ง€ ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆ„์–ด์„œ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์˜€๋‹ค.
1.A~Z ์‚ฌ์ด์— ํ”ผ์—ฐ์‚ฐ์ž์ผ ๊ฒฝ์šฐ postfix์— ์ถ”๊ฐ€ํ•œ๋‹ค.
2.'('์ธ ๊ฒฝ์šฐ Stack์— pushํ•œ๋‹ค.
3.')'์ธ ๊ฒฝ์šฐ Stack์—์„œ '('๊ฐ€ ๋‚˜์˜ฌ๋•Œ๊นŒ์ง€ popํ•ด์ฃผ์–ด postfix์— ์ถ”๊ฐ€ํ•œ๋‹ค.
4.๋‹ค๋ฅธ ์—ฐ์‚ฐ์ž์ผ ๊ฒฝ์šฐ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ณ ๋ คํ•ด์„œ ํ˜„์žฌ ์—ฐ์‚ฐ์ž์˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ stack์— top์— ์žˆ๋Š” ์šฐ์„ ์ˆœ์œ„๋ณด๋‹ค ๋†’์•„์งˆ ๋•Œ๊นŒ์ง€ stack์— ์žˆ๋Š” ์—ฐ์‚ฐ์ž๋ฅผ popํ•ด์„œ postfix์— ์ถ”๊ฐ€ํ•˜๊ณ , ํ˜„์žฌ ์—ฐ์‚ฐ์ž๋ฅผ ์Šคํƒ์— pushํ•œ๋‹ค

Code

import java.util.Scanner;
import java.util.Stack;

public class BOJ1918 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        System.out.println(toPostfix(input));
    }
    public static String toPostfix(String infix){
        Stack<Character> op = new Stack<>();
        StringBuilder postfix = new StringBuilder();
        for(char c: infix.toCharArray()){
            if(c >= 'A' && c<= 'Z'){
                postfix.append(c);
            }
            else {
                // ์—ฐ์‚ฐ์ž์ผ ๋•Œ
                if(c=='('){
                    op.push(c);
                }
                else if(c==')'){
                    while (!op.isEmpty() && op.peek() != '(') {
                        postfix.append(op.pop());
                    }
                    if(!op.isEmpty()) op.pop();

                } else {
                    // ์Šคํƒ์— ์—ฐ์‚ฐ์ž๊ฐ€ ์ €์žฅ๋˜์–ด์žˆ์„๋•Œ, ํ˜„์žฌ ์—ฐ์‚ฐ์ž๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‹ž์€ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋‚˜์˜ฌ๋•Œ๊นŒ์ง€ popํ•ด์„œ postfix์— ์ถ”๊ฐ€ํ•œ๋‹ค.
                    while(!op.isEmpty()&&getPrecedence(op.peek()) >= getPrecedence(c)){
                        postfix.append(op.pop());
                    }
                    op.push(c);
                }
            }
        }
        while(!op.isEmpty()){
            postfix.append(op.pop());
        }
        return postfix.toString();
    }
    // ์—ฐ์‚ฐ์ž์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    static public int getPrecedence(char op){
        if(op == '*' || op == '/') return 2;
        else if(op == '+' || op == '-') return 1;
        else return 0;
    }
}

์–ด๋ ค์› ๋˜ ์  / ๋ฐฐ์šด ์  / ๋Š๋‚€ ์ 

์ค‘์œ„ ํ‘œ๊ธฐ์‹์„ ํ›„์œ„ ํ‘œ๊ธฐ์‹์œผ๋กœ ์ผ๋‹จ ์ตœ๋Œ€ํ•œ ๋งŽ์€ ์˜ˆ์‹œ๋“ค์„ ๋ณ€ํ™˜ํ•ด์ฃผ๊ณ , ๊ทœ์น™์„ ์ฐพ๋Š” ๊ณผ์ •์ด ์˜ค๋ž˜ ๊ฑธ๋ ธ๋‹ค.
๋ฐ˜๋ก€๋“ค์„ ์ตœ๋Œ€ํ•œ ๋งŽ์ด ์ฐพ์•„๋ณด๊ณ  ๋ณ€ํ™˜ํ•ด ๋ณด๋ฉด์„œ ๊ณ„์† ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ณ ์ณ๋‚˜๊ฐ”๋‹ค.

๋ฐ˜์‘ํ˜•