[백준 2504] 괄호의 값(Java)

최민길(Gale)·2023년 11월 13일
1

알고리즘

목록 보기
142/172

문제 링크 : 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);
    }


}

profile
저는 상황에 맞는 최적의 솔루션을 깊고 정확한 개념의 이해를 통한 다양한 방식으로 해결해오면서 지난 3년 동안 신규 서비스를 20만 회원 서비스로 성장시킨 Software Developer 최민길입니다.

0개의 댓글