๊ธฐ๋ก๋ฐฉ

BOJ_1918 : ํ›„์œ„ ํ‘œ๊ธฐ์‹ ๋ณธ๋ฌธ

CodingTest/Java

BOJ_1918 : ํ›„์œ„ ํ‘œ๊ธฐ์‹

Soom_1n 2023. 7. 9. 00:36

๐Ÿ‘‰ ๋ฌธ์ œ๋งํฌ

 

1918๋ฒˆ: ํ›„์œ„ ํ‘œ๊ธฐ์‹

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

www.acmicpc.net



๐Ÿ”ธ ๋ฌธ์ œ ๋ถ„์„ ๐Ÿ”ธ

  • ์ค‘์œ„ ํ‘œ๊ธฐ์‹์„ ํ›„์œ„ ํ‘œ๊ธฐ์‹์œผ๋กœ ๋ณ€ํ™˜ํ•ด ์ถœ๋ ฅํ•œ๋‹ค.
  • ์ž…๋ ฅ๋˜๋Š” ํ”ผ ์—ฐ์‚ฐ์ž๋Š” ์•ŒํŒŒ๋ฒณ ๋Œ€๋ฌธ์ž, ์—ฐ์‚ฐ์ž๋Š” "+-*/()"์˜ 6๊ฐ€์ง€๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค.
  • ์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ›„์œ„ ํ‘œ๊ธฐ์‹์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ”ธ ์ฝ”๋“œ ๐Ÿ”ธ

import java.io.*;

public class Main {
    private static class MyStack {
        private int pointer;
        private char[] stack;

        public MyStack() {
            this.pointer = 0;
            stack = new char[100];
        }

        public void push(char c) {
            stack[pointer++] = c;
        }

        public char pop() {
            return stack[--pointer];
        }

        public boolean isEmpty() {
            return pointer == 0;
        }

        public char peek() {
            if (pointer == 0) return '\0';
            else return stack[pointer - 1];
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();
        char[] input = br.readLine().toCharArray(); // A : 65, Z : 90

        MyStack stack = new MyStack();

        for (char c : input) {
            if (c >= 65 && c <= 90) // ์ž…๋ ฅ ๋ฌธ์ž๊ฐ€ ์•ŒํŒŒ๋ฒณ์ผ ๊ฒฝ์šฐ
                sb.append(c);
            else { // ์ž…๋ ฅ ๋ฌธ์ž๊ฐ€ ์—ฐ์‚ฐ์ž์ผ ๊ฒฝ์šฐ
                if (c == '+' || c == '-') { // '+' or '-'
                    if (stack.peek() == '*' || stack.peek() == '/') {
                        while (!stack.isEmpty() && stack.peek() != '(') {
                            sb.append(stack.pop());
                        }
                    } else if (stack.peek() == '+' || stack.peek() == '-')
                        sb.append(stack.pop());
                    stack.push(c);
                } else if (c == '*' || c == '/') { // '*' or '/'
                    if (stack.peek() == '*' || stack.peek() == '/') {
                        sb.append(stack.pop());
                    }
                    stack.push(c);
                } else if (c == '(') { // '('
                    stack.push(c);
                } else { // ')'
                    while (!stack.isEmpty()) {
                        char p = stack.pop();
                        if (p == '(') {
                            break;
                        }
                        sb.append(p);
                    }
                }
            }
        }
        while (!stack.isEmpty())
            sb.append(stack.pop());
        bw.write(sb.toString());
        bw.flush();
    }
}

๐Ÿ”ธ ์ฝ”๋“œ ํ•ด์„ ๐Ÿ”ธ

  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์Šคํƒ์€ ํšจ์œจ์ด ์กฐ๊ธˆ ์•ˆ์ข‹๋‹ค๊ณ  ์•Œ๊ณ  ์žˆ์–ด์„œ ์ง์ ‘ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋งŒ ์ถ”๊ฐ€ํ•œ MyStack ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.
    • push, pop, ์›์†Œ ์œ ๋ฌด ํ™•์ธ, ๊ฐ€์žฅ ์ตœ๊ทผ ์›์†Œ ํ™•์ธ์˜ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ๋งŒ ๊ตฌํ˜„ํ–ˆ๋‹ค.
  • ์ž…๋ ฅ๋œ ์ค‘์œ„ ํ‘œ๊ธฐ์‹์€ char๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•ด input์— ์ €์žฅํ–ˆ๋‹ค.
  • ๋ฌธ์ž ํ•˜๋‚˜์”ฉ ๊ฒ€์‚ฌํ•˜๋ฉฐ ๊ณ„์‚ฐ ํ›„ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
    • ์•ŒํŒŒ๋ฒณ์€ ์•„์Šคํ‚ค์ฝ”๋“œ ๊ฐ’์„ ํ™•์ธํ•ด์„œ A๋ถ€ํ„ฐ Z๊นŒ์ง€๋Š” ๋ฐ”๋กœ ์ถœ๋ ฅ์„ ์œ„ํ•ด StringBuilder์— ์ €์žฅํ•œ๋‹ค.
    • '+'์™€ '-'๋Š” ์ง์ „์— ๊ฐ™์€ ๋ ˆ๋ฒจ์˜ ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ์—ˆ์œผ๋ฉด ์Šคํƒ์—์„œ ๊บผ๋‚ด ์ถœ๋ ฅํ•˜๊ณ , '*'์™€ '/'๊ฐ€ ์žˆ์—ˆ๋‹ค๋ฉด ์—ฌ๋Š” ๊ด„ํ˜ธ๋ฅผ ๋งŒ๋‚˜๊ฑฐ๋‚˜ ์Šคํƒ์ด ๋ชจ๋‘ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ชจ๋“  ์›์†Œ๋ฅผ ๊บผ๋‚ด์„œ ์ถœ๋ ฅํ•œ๋‹ค.
      • ๊ทธ ํ›„ ๋ฐฉ๊ธˆ ์ž…๋ ฅ๋œ ์›์†Œ๋ฅผ ์Šคํƒ์— ์ถ”๊ฐ€ํ•œ๋‹ค.
    • '*'์™€ '/'๋Š” ๊ฐ™์€ ๋ ˆ๋ฒจ์˜ ์—ฐ์‚ฐ์ž๊ฐ€ ์žˆ์œผ๋ฉด ๊บผ๋‚ด์„œ ์ถœ๋ ฅํ•˜๊ณ , ๋ฐฉ๊ธˆ ์ž…๋ ฅ๋œ ์›์†Œ๋ฅผ ์Šคํƒ์— ์ถ”๊ฐ€ํ•œ๋‹ค.
    • ์—ฌ๋Š” ๊ด„ํ˜ธ๋Š” ๋ฐ”๋กœ ์Šคํƒ์— ์ถ”๊ฐ€ํ•œ๋‹ค.
    • ๋‹ซ๋Š” ๊ด„ํ˜ธ๋Š” ์—ฌ๋Š” ๊ด„ํ˜ธ๋ฅผ ๋งŒ๋‚  ๋•Œ ๊นŒ์ง€ ์—ฐ์‚ฐ์ž๋“ค์„ ์Šคํƒ์—์„œ ๊บผ๋‚ด ์ถœ๋ ฅํ•œ๋‹ค.
  • ์ž…๋ ฅ๋œ ๋ชจ๋“  ๋ฌธ์ž๋ฅผ ์ฒ˜๋ฆฌํ–ˆ์œผ๋ฉด, ์Šคํƒ์— ๋‚จ์€ ์—ฐ์‚ฐ์ž๋ฅผ ๋ชจ๋‘ ๊บผ๋‚ด์„œ ์ถœ๋ ฅํ•œ๋‹ค.

๐Ÿ”ธ end ๐Ÿ”ธ

  • ์Šคํƒ์„ ์ง์ ‘ ๊ตฌํ˜„ํ•œ ๊ฑด ๊ฑฐ์˜ ์—†์—ˆ๋Š”๋ฐ, ์ข‹์€ ์—ฐ์Šต์ด ๋œ ๊ฒƒ ๊ฐ™๋‹ค.
    • ํŠนํžˆ ๋‹น์žฅ pushํ•  ๋•Œ ๊ฐ’์„ ์ €์žฅํ•  ์ธ๋ฑ์Šค๋ฅผ pointer๊ฐ’์œผ๋กœ ์„ค์ •ํ–ˆ๋Š”๋ฐ, pop๊ณผ peekํ• ๋•Œ๋Š” -1์ด ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฑธ ๋ชจ๋ฅด๊ณ  ์ž˜๋ชป ์‚ฌ์šฉํ•ด์„œ ์˜ค๋ฅ˜๊ฐ€ ๋‚ฌ์—ˆ๋‹ค.
  • ๊ณจ๋“œ 2์น˜๊ณ ๋Š” ๊ธฐ๋ณธ์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ๋ผ ์‰ฝ๊ฒŒ ํ’€๋ฆฐ ๊ฒƒ ๊ฐ™๋‹ค. ๋‹ค๋งŒ ์ •๋‹ต๋ฅ ์ด ๋‚ฎ์€ ์ด์œ ์™€ ๊ฐ™์€ ๊ฒƒ ๊ฐ™์€๋ฐ, ๋ฐ˜๋ก€๋ฅผ ์ฐพ๋Š”๊ฒŒ ๋„ˆ๋ฌด ๋ฒˆ๊ฑฐ๋กœ์›Œ์„œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ๊ทธ๋ƒฅ ๋„ฃ์–ด๋ณด๋Š” ์‹์œผ๋กœ ์˜ค๋ฅ˜๋ฅผ ์žก์€ ๊ฒƒ ๊ฐ™๋‹ค.
    • +-๋Š” ์ถ”๊ฐ€ ์กฐ๊ฑด 2๊ฐœ, */๋Š” ์ถ”๊ฐ€์กฐ๊ฑด 1๊ฐœ ๋ผ๋Š” ์œ„ ์ฝ”๋“œ์˜ ๊ฒฐ๊ณผ ๊ฐ™์ด ๋””ํ…Œ์ผํ•œ ํ™•์ธ์ด ํ•„์š”ํ–ˆ๋‹ค.

728x90