괄호의 값

문제 풀러가기

2504

코드

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));
    String str = br.readLine();

    Stack<String> stack = new Stack<String>();

    boolean isAble = true;
    for(int i = 0; i < str.length(); i++) {
      String c = str.substring(i, i + 1);

      if("(".equals(c))
        stack.push(")");
        continue;

      if("[".equals(c)) {
        stack.push("]");
        continue;
      }

      int num = 0;
      while(true) {
        if(stack.isEmpty()) {
          isAble = true;
          break;
        }

        if(isNumber(stack.peek())) {
          num += Integer.parseInt(stack.pop());
        } else {
          if(isVPS(c, stack.peek())) {
            stack.pop();
            int t = (")".equals(c)) ? 2 : 3;

            if(num == 0) {
              stack.push(String.valueOf(t));
            } else {
              stack.push(String.valueOf(t * num));
            }

            break;
          } else {
            isAble = false;
            break;
          }
        }
      }

      if(!isAble) break;
    }

    int result = 0;

    while(!stack.isEmpty()) {
      if(isNumber(stack.peek())) {
        result += Integer.parseInt(stack.pop());
      } else {
        isAble = true;
        break;
      }
    }
    if(isAble) System.out.println(result);
    else System.out.println(0);
  }

  public static boolean isVPS(String c, String target) {
    if(c.equals(target)) return true;
    return false;
  }

  public static boolean isNumber(String str) {
    if(str.equals(")") || str.equals("]")) return false;
    return true;
  }
}

설명

여는 괄호일 경우 닫는 괄호를 스택에 저장해도록 한다. 닫는 괄호가 나오면 스택이 빌 때까지 스택을 비우는데 이 때 짝이 완성되지 않았는데 스택이 비게 되거나, 숫자 혹은 자신의 짝이 아니면 false로 만들고 숫자는 계속 합한다. 반복이 끝났을 때 숫자만 들어 있어야 정상적인 문자열이다.