import java.io.*;
import java.util.*;
class Main {
public static void main(String args[]) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 입력받은 문자열을 쪼갠다.
char[] charArray = br.readLine().toCharArray();
// 후입선출 자료구조 스택 선언
Stack < Character > stack = new Stack < > ();
// 괄호 닫힘 상태를 알 수 있는 변수
boolean isVPS = false;
// 결과 값을 위한 변수, 계산을 위한 변수
int answer = 0;
int value = 1;
// 배열의 길이만큼 반복문을 수행한다.
for (int i = 0; i < charArray.length; i++) {
// '('모양의 괄호일 경우, value변수에 2를 곱해준다.
if (charArray[i] == '(') {
stack.push(charArray[i]);
value *= 2;
}
// '['모양의 괄호일 경우, value변수에 3를 곱해준다.
if (charArray[i] == '[') {
stack.push(charArray[i]);
value *= 3;
}
// ')'모양의 괄호일 경우, 스택이 비어있거나 스택의 제일 위에 있는 요소가 '('가 아닐 경우
if (charArray[i] == ')') {
if (stack.isEmpty() || stack.peek() != '(') {
isVPS = true;
break;
}
// 직전의 요소가 '('인 경우
if (charArray[i - 1] == '(') {
// 현재까지 곱해진 값을 더한다.
answer += value;
}
stack.pop();
// 쌍을 만났기 때문에 나누기 2를 해준다.
value /= 2;
} else if (charArray[i] == ']') {
if (stack.isEmpty() || stack.peek() != '[') {
isVPS = true;
break;
}
if (charArray[i - 1] == '[') {
answer += value;
}
stack.pop();
value /= 3;
}
}
// 스택이 비어있지 않은 경우
if (isVPS || stack.isEmpty() == false) {
System.out.println(0);
} else {
System.out.println(answer);
}
}
}
해결방법
이전에 괄호 문제를 풀어봤다면 쉽게 해결할 수 있는 문제였다.
괄호 문제는 모든 괄호가 닫힌지 안닫힌지에 대한 여부만 판단하였다면, 이번 문제는 괄호에 대한 계산과 닫힘 여부도 판단하여야했다. 문제에서 가장 중요하게 생각했던 부분은 괄호의 쌍을 만나게 될 경우 해당 괄호가 갖는 고유의 값을 나눠주어야 하는 부분이였다.
이외에는 코드를 차례대로 읽어보면 이해하기 쉬울 것 같다!