문제 링크 : https://www.acmicpc.net/problem/2504
이 문제는 스택을 이용하여 풀 수 있습니다. 올바른 괄호열을 구하기 위해 ( 와 [ 문자는 스택에 추가하고, ) 와 ] 문자의 경우 스택에서 pop하는 방식으로 구현합니다. 이 때 단순히 pop만 하는 것이 아니라 연산 결과를 스택에 함께 저장해줍니다.
만약 ) 문자의 경우 ( 문자가 나올 때까지 스택을 탐색하여 수가 있을 경우 이 수들의 합을 구합니다. 만약 수가 없을 경우 1을 리턴한 후 x2 연산을 수행한 결과를 ( 문자를 pop한 후 스택에 추가합니다. 이렇게 하면 각 괄호 연산의 결과들이 스택에 저장되고, 이를 괄호 단위로 쪼개서 구별 가능하기 때문에 문제를 풀 수 있습니다.
다음은 코드입니다.
import java.util.*;
import java.io.*;
class Main{
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
Stack<String> stack = new Stack<>();
int res = 0;
for(int i=0;i<str.length();i++){
char curr = str.charAt(i);
if(curr == '('){
stack.push("(");
}
else if(curr == '['){
stack.push("[");
}
else{
if(stack.isEmpty()){
System.out.println(0);
return;
}
else if(curr == ')'){
long sum = 0;
while(!stack.isEmpty() && !stack.peek().equals("(")){
if(stack.peek().equals("[")){
System.out.println(0);
return;
}
sum += Long.parseLong(stack.pop());
}
if(stack.isEmpty()){
System.out.println(0);
return;
}
stack.pop();
long val = sum==0 ? 2 : sum*2;
stack.push(String.valueOf(val));
}
else if(curr == ']'){
long sum = 0;
while(!stack.isEmpty() && !stack.peek().equals("[")){
if(stack.peek().equals("(")){
System.out.println(0);
return;
}
sum += Long.parseLong(stack.pop());
}
if(stack.isEmpty()){
System.out.println(0);
return;
}
stack.pop();
long val = sum==0 ? 3 : sum*3;
stack.push(String.valueOf(val));
}
}
}
while(!stack.isEmpty()){
if(stack.peek().equals("(") || stack.peek().equals("[")){
System.out.println(0);
return;
}
res += Long.parseLong(stack.pop());
}
System.out.println(res);
}
}