[Java] 백준 2504 괄호의 값

이현희·2024년 6월 21일

📌 서론.

이번 문제는 문제 자체를 이해하기에는 어려움이 없었으나 은근히 구현 아이디어가 떠오르지 않는 문제였다. 결국 서치를 하면서 풀었지만 다른 사람의 풀이 로직이 이해가 안가 애먹었던 문제였다.

그런데!! 알고보니 문제를 잘못 읽어서 계속 삽질했었다.

e. 올바른 괄호열 X와 Y가 결합된 XY의 괄호값은 값(XY)= 값(X)+값(Y) 로 계산된다.
이 정의를 잘못 해석했었다. 결론은 문제를 잘 읽자!

📚 오늘의 문제.

📝 문제 1.

링크 : https://www.acmicpc.net/problem/2504

  1. 문제 설명

    1. ()’ 인 괄호열의 값은 2이다.
    2. []’ 인 괄호열의 값은 3이다.
    3. (X)’ 의 괄호값은 2×값(X) 으로 계산된다.
    4. [X]’ 의 괄호값은 3×값(X) 으로 계산된다.
    5. 올바른 괄호열 X와 Y가 결합된 XY의 괄호값은 값(XY)= 값(X)+값(Y) 로 계산된다.

    주어진 괄호열을 읽고 그 괄호값을 앞에서 정의한대로 계산하여 출력하는 문제이다.

    💡 아이디어 : 곱셈 분배법칙 💡

    ex. (()[]) → 2(2+3) ⇒ 10 !

    크게 3,4 정의에 해당하는 종속형태캐치하고 구현하는 게 키 포인트인 것 같다!

    📖 풀이 과정 📖

    1. 분배를 할 때 곱해줄 변수 mul과 최종값 result 변수를 선언한다.

    2. 열린괄호를 마주칠 때마다 스택에 push하고, 가중치를 수정해준다.

      2-1. ( 일 경우 가중치는 2이다. 따라서 mul *= 2;

      2-2. [ 일 경우 가중치는 3이다. 따라서 mul *= 3;

    3. 닫힌괄호를 만나면 이 괄호가 종속형태인지 확인해준다.

      3-1. stack이 빈 상태이거나, stack.peek()과 짝이 맞는 괄호가 아니라면 error!

      3-2. 바로 직전 괄호(input[i-1])과 쌍이 맞다면 → 종속괄호 ⇒ result+= mul; 해당 종속괄호에 대한 계산을 더해준다.
      3-2-1. ) 일 경우 mul /= 2;

      3-2-1. ] 일 경우 mul /= 3;
      3-3. stack.pop()해주고 가중치의 값도 반으로 수정해준다.

  2. 문제 풀이

    import java.io.*;
    import java.util.*;
    
    public class Main {
        public static void main(String[] args) throws IOException {
    
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
            char[] input = br.readLine().toCharArray();
            Stack<Character> stack = new Stack<>();
            int mul = 1;
            int result = 0;
            boolean isValid = true;
    
            for (int i = 0; i < input.length; i++) {
                char data = input[i];
                if (!isValid) {
                    break;
                }
    
                switch (data) {
                    case '(':
                        stack.push(data);
                        mul *= 2;
                        break;
                    case '[':
                        stack.push(data);
                        mul *= 3;
                        break;
                    case ')':
                        if (stack.isEmpty() || stack.peek() != '(') {
                            isValid = false;
                        } else {
                            if (input[i - 1] == '(') {
                                result += mul;
                            }
                            stack.pop();
                            mul /= 2;
                        }
                        break;
                    case ']':
                        if (stack.isEmpty() || stack.peek() != '[') {
                            isValid = false;
                        } else {
                            if (input[i - 1] == '[') {
                                result += mul;
                            }
                            stack.pop();
                            mul /= 3;
                        }
                        break;
                }
            }
    
            if (!isValid || !stack.isEmpty()) {
                result = 0;
            }
    
            bw.write(String.valueOf(result));
            bw.close();
            br.close();
        }
    }
    

0개의 댓글