알고리즘/백준

[BoJ] - 2504번 괄호의 값

cafe-jun12 2025. 5. 29. 19:47
반응형

 

입력

  • 괄호열을 나타내는 문자열이 한 줄로 주어진다.
  • 문자열 길이: 1 이상, 30 이하
  • 문자열은 '(', ')', '[', ']'로만 구성됨

출력

  • 주어진 괄호열이 올바른 괄호열이라면 계산된 정수 값을 출력
  • 올바르지 않은 괄호열이라면 0 출력

 

 

해결 아이디어


 

  • 열린 괄호 (, [ 는 스택에 push
  • 닫힌 괄호 ), ] 가 나오면:
    • 스택에서 열린 괄호 또는 중간 숫자들을 꺼내며 계산
    • 올바른 짝인지 확인하고, 중간 값을 2 또는 3 곱하여 다시 스택에 push
  • 괄호열이 끝나고 스택에 정수만 남았다면, 모두 더해서 결과 반환
  • 중간에 잘못된 구조 발견 시 즉시 0 출력

다음 조건 중 하나라도 해당되면 0을 출력합니다.

  • 열린 괄호 없이 닫힌 괄호가 나올 때
  • 괄호쌍이 서로 맞지 않을 때 (( ] 또는 [ ))
  • 문자열 처리 후 스택에 괄호가 남아 있을 때

 

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String line = sc.nextLine();
        Stack<Object> stack = new Stack<>();

        for (char c : line.toCharArray()) {
            if (c == '(' || c == '[') {
                stack.push(c); // 열린 괄호 push
            } else {
                int value = 0;
                while (!stack.isEmpty() && stack.peek() instanceof Integer) {
                    value += (Integer) stack.pop(); // 내부 숫자 누적
                }

                if (stack.isEmpty()) {
                    System.out.println(0);
                    return;
                }

                char open = (char) stack.pop();
                if ((c == ')' && open != '(') || (c == ']' && open != '[')) {
                    System.out.println(0);
                    return;
                }

                // 기본값 or 내부 값 곱셈 적용
                if (c == ')') {
                    stack.push(value == 0 ? 2 : 2 * value);
                } else {
                    stack.push(value == 0 ? 3 : 3 * value);
                }
            }
        }

        int result = 0;
        for (Object obj : stack) {
            if (obj instanceof Character) {
                System.out.println(0);
                return;
            }
            result += (Integer) obj;
        }

        System.out.println(result);
    }
}

 

반응형