[백준 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개의 댓글

관련 채용 정보