알고리즘
백준 2504번 괄호의 값 (JAVA)
박카스마시며코딩
2022. 1. 3. 23:53
https://www.acmicpc.net/problem/2504
2504번: 괄호의 값
4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다. 한 쌍의 괄호로만 이루어진 ‘()’와 ‘[]’는 올바른 괄호열이다. 만일
www.acmicpc.net
Java같은 경우 Stack은 Vector로 구현되어 있어 비효율적인 것으로 알고 있어 ArrayDeque을 통해 Stack을 사용하였습니다. 저는 해당 문제를 분배법칙을 활용하여 문제를 해결하였습니다.
package BOJ.dataStructure;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.StringTokenizer;
public class BOJ_2504 {
static final String open = "([";
static final String close = ")]";
static final int[] score = {2,3};
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String command = br.readLine();
ArrayDeque<Integer> stack = new ArrayDeque<>();
boolean flag = true;
int result = 0;
int num = 1;
for(int i = 0 ; i < command.length() ; i++){
char now = command.charAt(i);
int index = open.indexOf(now);
if(index >= 0 ){ // 여는 괄호
stack.push(index);
num *= score[index];
}else{ // 닫는 괄호
if(stack.isEmpty()){
flag = false;
}else{
index = close.indexOf(now);
int prev = stack.pop();
if(index == prev){
int value = score[index];
char prevChar = command.charAt(i-1);
int prevIndex = open.indexOf(prevChar);
if(prevIndex >= 0 && prevIndex == index){
result += num;
}
num /= value;
}else{
flag = false;
}
}
}
if(!flag){
break;
}
}
if(flag && stack.isEmpty()){
System.out.println(result);
}else{
System.out.println(0);
}
}
}