ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • boj)2504 - 괄호의 값
    PS/boj 2020. 10. 14. 14:42
    import java.io.*;
    import java.util.*;
    
    public class boj_2504 {
        public static void main(String[] args) throws IOException {
            Scanner sc = new Scanner(System.in);
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
            String str = sc.nextLine();
    
            Stack<String> stack = new Stack<>();
            int roundBracket = 0;
            int squareBracket = 0;
    
            for (int i = 0; i < str.length(); i++) {
                String s = str.substring(i, i + 1);
    
                switch (s) {
                    case "(":
                        roundBracket++;
                        stack.push(s);
                        break;
                    case "[":
                        squareBracket++;
                        stack.push(s);
                        break;
                    case ")":
                        roundBracket--;
                        if (roundBracket > -1) {
    
                            if (stack.peek().equals("(")) {
                                stack.pop();
                                stack.push("2");
                            } else {
                                int roundResult = 0;
    
                                while (!stack.isEmpty()) { // 괄호안의 수 처리
                                    if (stack.peek().equals("[")) { // 잘못된 문자열 처리
                                        bw.write("0");
                                        bw.flush();
                                        return;
                                    } else if (stack.peek().equals("(")) {
                                        stack.pop();
                                        roundResult *= 2;
                                        stack.push(String.valueOf(roundResult));
                                        break;
                                    } else { 
                                        roundResult += Integer.parseInt(stack.pop()); 
                                    }
                                }
                            }
                        }
                        break;
                    case "]":
                       squareBracket--;
    
                       if (squareBracket > -1) {
                           if (stack.peek().equals("[")) {
                               stack.pop();
                               stack.push("3");
                           } else {
                               int squareResult = 0;
    
                               while (!stack.isEmpty()) {
                                    if (stack.peek().equals("(")) {
                                        bw.write("0");
                                        bw.flush();
                                        return;
                                    } else if (stack.peek().equals("[")) {
                                        stack.pop();
                                        squareResult *= 3;
                                        stack.push(String.valueOf(squareResult));
                                        break;
                                    } else {
                                        squareResult += Integer.parseInt(stack.pop());
                                    }
                               }
                           }
                       }
                       break;
                }
    
                if (squareBracket < 0 || roundBracket < 0) {
                    bw.write("0");
                    bw.flush();
                    return;
                }
            }
    
            if (squareBracket != 0 || roundBracket != 0) {
                bw.write("0");
                bw.flush();
                return;
            }
    
            int ans = 0 ;
            while (!stack.isEmpty()) {
                ans += Integer.parseInt(stack.pop());
            }
            bw.write(String.valueOf(ans));
            bw.flush();
        }
    }

     

    - 실패

     

    - 여러가지 찾아봤는데 그나마 이해가 제일 잘되서 이걸로 따라갔음

    - 여는 괄호는 상관이 없는데 닫은 괄호 처리하기가 까다로

       예외도 처리해야 하고 이게 곱하는 괄호인지 더하는 괄호인지도 처리해야함 

    - 여기에서는 바로앞과 붙어있는 괄호일때 이걸 숫자로 바꿔서 다시 스택에 넣고

       아닐경우에는 여는괄호를 만날때까지 숫자들을 더하고 마지막엔 곱해줌

    - 반복문을 끝까지 돌았으면 마지막엔 숫자만 남아있고 이 숫자들을 더한 값이 ans

    'PS > boj' 카테고리의 다른 글

    boj)10866 - 덱  (0) 2020.10.14
    boj)4889 - 안정적인 문자열  (0) 2020.10.14
    boj)4949 - 균형잡힌 세상  (0) 2020.10.13
    boj)6198 - 옥상 정원 꾸미기  (0) 2020.10.13
    boj)2164 - 카드2  (0) 2020.10.12
킹수빈닷컴