알고리즘

백준 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);
        }
    }
}

 

'알고리즘' 카테고리의 다른 글

백준 1789번 수들의 합 (JAVA)  (0) 2022.01.05
백준 14179번 빗물 (JAVA)  (0) 2022.01.04
백준 1259번 팰린드룸수 (JAVA)  (0) 2022.01.02
백준 1927번 최소 힙 (JAVA)  (0) 2022.01.01
백준 15990번 1,2,3더하기 5 (JAVA)  (0) 2021.12.31