Algorithm๐Ÿฅ‡

1918.ํ›„์œ„ํ‘œ๊ธฐ์‹

hae02y 2023. 10. 16. 08:24
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

์ˆ˜์‹์€ ์ผ๋ฐ˜์ ์œผ๋กœ 3๊ฐ€์ง€ ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์—ฐ์‚ฐ์ž๊ฐ€ ํ”ผ์—ฐ์‚ฐ์ž ๊ฐ€์šด๋ฐ ์œ„์น˜ํ•˜๋Š” ์ค‘์œ„ ํ‘œ๊ธฐ๋ฒ•(์ผ๋ฐ˜์ ์œผ๋กœ ์šฐ๋ฆฌ๊ฐ€ ์“ฐ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค), ์—ฐ์‚ฐ์ž๊ฐ€ ํ”ผ์—ฐ์‚ฐ์ž ์•ž์— ์œ„์น˜ํ•˜๋Š” ์ „์œ„ ํ‘œ๊ธฐ๋ฒ•(prefix notation), ์—ฐ์‚ฐ์ž๊ฐ€ ํ”ผ์—ฐ์‚ฐ์ž ๋’ค์— ์œ„์น˜ํ•˜๋Š” ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ•(postfix notation)์ด ๊ทธ๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ค‘์œ„ ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ํ‘œํ˜„๋œ a+b๋Š” ์ „์œ„ ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ๋Š” +ab์ด๊ณ , ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ๋Š” ab+๊ฐ€ ๋œ๋‹ค.

์ด ๋ฌธ์ œ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ๋‹ค๋ฃฐ ํ‘œ๊ธฐ๋ฒ•์€ ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ•์ด๋‹ค. ํ›„์œ„ ํ‘œ๊ธฐ๋ฒ•์€ ์œ„์—์„œ ๋งํ•œ ๋ฒ•๊ณผ ๊ฐ™์ด ์—ฐ์‚ฐ์ž๊ฐ€ ํ”ผ์—ฐ์‚ฐ์ž ๋’ค์— ์œ„์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์ด ๋ฐฉ๋ฒ•์˜ ์žฅ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ์“ฐ๋Š” ์ค‘์œ„ ํ‘œ๊ธฐ์‹ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ๋ง์…ˆ๊ณผ ๊ณฑ์…ˆ์˜ ์šฐ์„ ์ˆœ์œ„์— ์ฐจ์ด๊ฐ€ ์žˆ์–ด ์™ผ์ชฝ๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜ ์—†์ง€๋งŒ ํ›„์œ„ ํ‘œ๊ธฐ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ์ˆœ์„œ๋ฅผ ์ ์ ˆํžˆ ์กฐ์ ˆํ•˜์—ฌ ์ˆœ์„œ๋ฅผ ์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ด„ํ˜ธ ๋“ฑ๋„ ํ•„์š” ์—†๊ฒŒ ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด a+b*c๋ฅผ ํ›„์œ„ ํ‘œ๊ธฐ์‹์œผ๋กœ ๋ฐ”๊พธ๋ฉด abc*+๊ฐ€ ๋œ๋‹ค.

์ค‘์œ„ ํ‘œ๊ธฐ์‹์„ ํ›„์œ„ ํ‘œ๊ธฐ์‹์œผ๋กœ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•์„ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜๋ฉด ์ด๋ ‡๋‹ค. ์šฐ์„  ์ฃผ์–ด์ง„ ์ค‘์œ„ ํ‘œ๊ธฐ์‹์„ ์—ฐ์‚ฐ์ž์˜ ์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผ ๊ด„ํ˜ธ๋กœ ๋ฌถ์–ด์ค€๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ์— ๊ด„ํ˜ธ ์•ˆ์˜ ์—ฐ์‚ฐ์ž๋ฅผ ๊ด„ํ˜ธ์˜ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์˜ฎ๊ฒจ์ฃผ๋ฉด ๋œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด a+b*c๋Š” (a+(b*c))์˜ ์‹๊ณผ ๊ฐ™๊ฒŒ ๋œ๋‹ค. ๊ทธ ๋‹ค์Œ์— ์•ˆ์— ์žˆ๋Š” ๊ด„ํ˜ธ์˜ ์—ฐ์‚ฐ์ž *๋ฅผ ๊ด„ํ˜ธ ๋ฐ–์œผ๋กœ ๊บผ๋‚ด๊ฒŒ ๋˜๋ฉด (a+bc*)๊ฐ€ ๋œ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ๋˜ +๋ฅผ ๊ด„ํ˜ธ์˜ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ณ ์น˜๋ฉด abc*+๊ฐ€ ๋˜๊ฒŒ ๋œ๋‹ค.

๋‹ค๋ฅธ ์˜ˆ๋ฅผ ๋“ค์–ด ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด A+B*C-D/E๋ฅผ ์™„์ „ํ•˜๊ฒŒ ๊ด„ํ˜ธ๋กœ ๋ฌถ๊ณ  ์—ฐ์‚ฐ์ž๋ฅผ ์ด๋™์‹œํ‚ฌ ์žฅ์†Œ๋ฅผ ํ‘œ์‹œํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋œ๋‹ค.

๊ฒฐ๊ณผ: ABC*+DE/-

์ด๋Ÿฌํ•œ ์‚ฌ์‹ค์„ ์•Œ๊ณ  ์ค‘์œ„ ํ‘œ๊ธฐ์‹์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ํ›„์œ„ ํ‘œ๊ธฐ์‹์œผ๋กœ ๊ณ ์น˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ค‘์œ„ ํ‘œ๊ธฐ์‹์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹จ ์ด ์ˆ˜์‹์˜ ํ”ผ์—ฐ์‚ฐ์ž๋Š” ์•ŒํŒŒ๋ฒณ ๋Œ€๋ฌธ์ž๋กœ ์ด๋ฃจ์–ด์ง€๋ฉฐ ์ˆ˜์‹์—์„œ ํ•œ ๋ฒˆ์”ฉ๋งŒ ๋“ฑ์žฅํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  -A+B์™€ ๊ฐ™์ด -๊ฐ€ ๊ฐ€์žฅ ์•ž์— ์˜ค๊ฑฐ๋‚˜ AB์™€ ๊ฐ™์ด *๊ฐ€ ์ƒ๋žต๋˜๋Š” ๋“ฑ์˜ ์ˆ˜์‹์€ ์ฃผ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค. ํ‘œ๊ธฐ์‹์€ ์•ŒํŒŒ๋ฒณ ๋Œ€๋ฌธ์ž์™€ +, -, *, /, (, )๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ, ๊ธธ์ด๋Š” 100์„ ๋„˜์ง€ ์•Š๋Š”๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ํ›„์œ„ ํ‘œ๊ธฐ์‹์œผ๋กœ ๋ฐ”๋€ ์‹์„ ์ถœ๋ ฅํ•˜์‹œ์˜ค

์‹œ๊ฐ„ ์ œํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์ œ์ถœ ์ •๋‹ต ๋งžํžŒ ์‚ฌ๋žŒ ์ •๋‹ต ๋น„์œจ
2 ์ดˆ 128 MB 43207 16021 12106 36.735%
https://www.acmicpc.net/problem/1918

ํ’€์ด

์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ๋ฆ„

Stack์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ค‘์œ„ํ‘œ๊ธฐ์‹์„ ํ›„์œ„ํ‘œ๊ธฐ์‹์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

ํ•ต์‹ฌ์€ ์Šคํƒ์—๋Š” ์—ฐ์‚ฐ์ž๋งŒ ์‚ฌ์šฉํ•˜๊ณ , ํ”ผ์—ฐ์‚ฐ์ž๋Š” ๋ฐ”๋กœ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค

  • ์—ฐ์‚ฐ์ž์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ง€์ •ํ•˜์—ฌ stack์— ๋„ฃ๊ธฐ ์ „์—, ํ˜„์žฌ ์—ฐ์‚ฐ์ž์˜ ์šฐ์„ ์ˆœ์œ„๋ณด๋‹ค ํฐ ์—ฐ์‚ฐ์ž๊ฐ€ stack์˜ ๋งจ ์œ„์— ์žˆ๋‹ค๋ฉด, ์—†์„ ๋•Œ๊นŒ์ง€ pop ํ•œ๋‹ค. (์šฐ์„ ์ˆœ์œ„ ์ˆœ์œผ๋กœ ๊ณ„์‚ฐ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ)
  • ) ์ผ ๊ฒฝ์šฐ์— ( ๊ฐ€ ๋‚˜์˜ฌ๋•Œ๊นŒ์ง€ stack์•ˆ์˜ ์—ฐ์‚ฐ์ž๋ฅผ pop ํ•œ๋‹ค.
  • ํ”ผ์—ฐ์‚ฐ์ž๋Š” ๋”ฐ๋กœ ์Šคํƒ์— ๋„ฃ์ง€ ์•Š๊ณ  ๋ฐ”๋กœ StringBuilder ์— append ํ•ด์ค€๋‹ค.

์ฐจ๋Ÿ‰๊ธฐ์ง€ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•œ ๋ฌธ์ œ์ด๋ฏ€๋กœ ์ฐธ๊ณ ๋ฅผ ํ•ด๋ณด๋ฉด ์ข‹์„๊ฒƒ ๊ฐ™๋‹ค.

์ฝ”๋“œ

public class ํ›„์œ„ํ‘œ๊ธฐ์‹ {  

    public static void main(String[] args) throws IOException {  

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
        StringBuilder sb = new StringBuilder();  

        String str = br.readLine();  

        Stack<Character> stack = new Stack<>(); //์Šคํƒ์„ ์„ ์–ธ(์—ฐ์‚ฐ์ž๋ฅผ ๋‹ด๋Š”๋‹ค)  - ๋’ค์—์„œ ๋ถ€ํ„ฐ  

        for(int i=0; i < str.length(); i++){  
            char now = str.charAt(i);  

            switch (now){  
                case '+':  
                case '-':  
                case '*':  
                case '/':  
                    //(๋ฐ˜๋ณต) ์Šคํƒ์˜ ์ตœ์ƒ์œ„ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ํ˜„์žฌ์˜ ์šฐ์„ ์ˆœ์œ„๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์„๋•Œ,  
                    //์Šคํƒ์—์„œ ๊ฐ’์„ ์ถœ๋ ฅํ๋กœ ์˜ฎ๊ฒจ์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ˜„์žฌ ์—ฐ์‚ฐ์ž๋ฅผ ์Šคํƒ์— ๋„ฃ๋Š”๋‹ค.  
                    while (!stack.isEmpty() && priority(stack.peek()) >= priority(now)){  
                        sb.append(stack.pop());  
                    }  
                    stack.add(now);  
                    break;  
                case '(':  
                    //์—ฌ๋Š” ๊ด„ํ˜ธ๋ฅผ ๋งŒ๋‚˜๋ฉด, ์Šคํƒ์— ๋„ฃ์–ด์ค€๋‹ค.  
                    stack.add(now);  
                    break;  
                case ')':  
                    //๋‹ซ๋Š” ๊ด„ํ˜ธ๊ฐ€ ๋‚˜์˜ค๋ฉด ์—ฌ๋Š” ๊ด„ํ˜ธ๊ฐ€ ๋‚˜์˜ฌ๋•Œ๊นŒ์ง€ ์ถœ๋ ฅํ์— ๋„ฃ์–ด์ฃผ๊ณ , ์—ฌ๋Š” ํ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.  
                    while (!stack.isEmpty() && stack.peek() != '('){  
                        sb.append(stack.pop());  
                    }  
                    stack.pop(); //์—ฌ๋Š”ํ ์‚ญ์ œ  
                    break;  
                default:  
                    sb.append(now); //๋ฌธ์ž๊ฐ€ ๋‚˜์˜ค๋ฉด ๋ฐ”๋กœ ์ถœ๋ ฅํ๋กœ ๋„ฃ์–ด์ค€๋‹ค.  
            }  
        }  

        while (!stack.isEmpty()) { //์ƒ๋‹จ์˜ for๋ฌธ์ด ๋Œ๊ณ  ์Šคํƒ์— ๋‚จ์•„์žˆ๋Š” ์—ฐ์‚ฐ์ž๋ฅผ ์ถœ๋ ฅํ๋กœ ์˜ฎ๊ฒจ์ค€๋‹ค.  
            sb.append(stack.pop());  
        }  

        System.out.println(sb);  
        br.close();  

    }  
    public static int priority(char op){ //์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ•ด์ค€๋‹ค.  
        if(op == '(' || op == ')'){  
            return 0;  
        }else if (op == '+' || op == '-'){  
            return 1;  
        }else if (op == '*' || op == '/'){  
            return 2;  
        }  
        return -1;  
    }  
}
๋ฐ˜์‘ํ˜•