문제를 이해하는데 시간이 좀 걸렸다.. 😂
스트링으로 받은 char(i) 가 ( 이면 ( 개수를 증가시키기위해 cnt*2 + 스택에 ( 저장
스트링으로 받은 char(i) 가 [ 이면 [ 개수를 증가시키기위해 cnt*3 + 스택에 [ 저장
만약 char(i) 가 ')' 라면 먼저 성립되는 괄호인지 체크하기위해 스택에 있는 값이 '(' 여는 괄호가 아니거나 스택이 비어있다면 문제 성립이 안됨 flag = false 후 탈출
만약 스택에 있는 값이 '(' 라면 현재까지 나온 더해진 cnt를 answer에 합산 후 다시 cnt / 2 하고 st.pop();
만약 char(i) 가 ']' 라면 먼저 성립되는 괄호인지 체크하기위해 스택에 있는 값이 '[' 여는 괄호가 아니거나 스택이 비어있다면 문제 성립이 안됨 flag = false 후 탈출
만약 스택에 있는 값이 '[' 라면 현재까지 나온 더해진 cnt를 answer에 합산 후 다시 cnt / 3 하고 st.pop();
처음 42%에서 틀렸다고 떠서 반례를 찾아보니 만약 스택이 비어있지 않는 경우 무조건 성립이 되지 않음으로 마지막 조건에 !st.isEmpty() 를 추가해서 정답 처리가 됐다 😮
package problem_solving.stack;
import java.util.Scanner;
import java.util.Stack;
public class BaekJoon_2504 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.next();
Stack<Character> st = new Stack<>();
int cnt = 1 ;
int answer = 0 ;
boolean flag = true;
for(int i =0 ; i<s.length();i++) {
char c = s.charAt(i);
if( c == '(') {
st.push(c);
cnt *= 2;
} else if( c=='[') {
st.push(c);
cnt *= 3;
} else {
if( c == ')') {
if( st.isEmpty() || st.peek() != '(') {
flag = false;
break;
}
if( s.charAt(i-1) =='(' ) {
answer += cnt ;
}
st.pop();
cnt /= 2;
} else if( c == ']') {
if( st.isEmpty() || st.peek() != '[') {
flag = false ;
break;
}
if ( s.charAt(i-1) == '[') {
answer+=cnt ;
}
st.pop();
cnt /=3;
}
}
}
if( !flag || !st.isEmpty()) {
System.out.println(0);
} else {
System.out.println(answer);
}
}
}