백준 괄호의 값

KIMYEONGJUN·2026년 3월 18일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

첫째 줄에 괄호열을 나타내는 문자열(스트링)이 주어진다.
단 그 길이는 1 이상, 30 이하이다.

첫째 줄에 그 괄호열의 값을 나타내는 정수를 출력한다.
만일 입력이 올바르지 못한 괄호열이면 반드시 0을 출력해야 한다.

내가 이 문제를 보고 생각해본 부분

입력받은 괄호 문자열을 한 문자씩 순회한다.
열린 괄호 '(' 일 때는 스택에 '('를 넣고 현재 곱셈 값 cur을 2배로 늘린다.
열린 괄호 '[' 일 때는 스택에 '['를 넣고 cur을 3배로 늘린다.
닫힌 괄호 ')' 는 스택이 비어 있거나 맨 위에 '(' 가 없으면 올바르지 않은 괄호열이므로 0을 출력하고 종료한다.
바로 이전 문자가 '(' 였다면, 현재 곱셈 값 cur을 결과값 res에 더한다.
스택에서 '('를 꺼내고, cur 값을 2로 나눈다.
닫힌 괄호 ']' 는 스택이 비어 있거나 맨 위에 '[' 가 없으면 올바르지 않은 괄호열이므로 0 출력 후 종료한다.
바로 이전 문자가 '[' 였다면, 현재 cur을 결과 res에 더한다.
스택에서 '['를 꺼내고, cur 값을 3으로 나눈다.
반복문 종료 후 스택이 비어 있으면 누적된 결과 res를 출력하고, 아니면 0 출력하여 올바른 괄호열인지 판별한다.

코드로 구현

package baekjoon.baekjoon_33;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;

// 백준 2504번 문제
public class Main1330 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String s = br.readLine();
        Stack<Character> stack = new Stack<>();

        int cur = 1;
        int res = 0;

        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            switch (c) {
                case '(':
                    stack.push('(');
                    cur *= 2;
                    break;
                case '[':
                    stack.push('[');
                    cur *= 3;
                    break;
                case ')':
                    if (stack.isEmpty() || stack.peek() != '(') {
                        System.out.println(0);
                        return;
                    }
                    if (i > 0 && s.charAt(i - 1) == '(') {
                        res += cur;
                    }
                    stack.pop();
                    cur /= 2;
                    break;
                case ']':
                    if (stack.isEmpty() || stack.peek() != '[') {
                        System.out.println(0);
                        return;
                    }
                    if (i > 0 && s.charAt(i - 1) == '[') {
                        res += cur;
                    }
                    stack.pop();
                    cur /= 3;
                    break;
            }
        }

        System.out.println(stack.isEmpty() ? res : 0);
        br.close();
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글