[백준] 2504번 : 괄호의 값

김건우·2023년 8월 9일
0

문제 풀이

목록 보기
17/62

괄호의 값


해결 방법

우선 전에도 비슷한 문제를 해결해 봤기 때문에 스택으로 접근했다.
하지만, 아무리 생각해도 어떻게 해결해야 할지 떠오르지 않아서 다른 분들의 풀이를 보고 이해했다.

해결의 중요한 부분은 '분배 법칙'을 이용한다는 것이다.

위의 예시의 문제를 보자

(()[[]])([])(()[[]])([])

해당 연산을 수식으로 나타내어보면 2(2+33)+232*(2+3*3)+2*3 이렇게 나타낼 수 있다.

닫힌 괄호를 만나는 순간, 바로 앞이 해당 열린 괄호인 경우
이때까지의 곱을 더해주면 된다.

그래서

  1. '(' , '[' 를 만난다면 2 , 3 을 곱해준다.

  2. ')' 를 만난다면?

    스택을 확인

    1. 스택이 비어있거나, 스택의 맨 위 (바로 앞)가 '('가 아니라면 -> 0

    2. 바로 앞이 '('이라면 -> 지금까지 곱을 모두 결과에 더함.

    스택에서 pop() 연산 후, 지금까지 곱에서 2를 나눈다.

  3. ']' 를 만난다면?

    위와 같은 연산을 함.


코드

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.println(value(br.readLine()));
    }
    static int value(String s){
        Stack<Character> stack = new Stack<>();
        int result=0;
        int temp=1;

        for(int i=0;i<s.length();i++){
            char c = s.charAt(i);
            if(c=='('){
                stack.push('(');
                temp *= 2;
            }
            else if(c=='['){
                stack.push('[');
                temp *= 3;
            }
            else if (c==')'){
                if(stack.empty() || stack.peek() != '('){
                    result = 0;
                    break;
                }
                else if(s.charAt(i-1) == '('){
                    result += temp;
                }
                stack.pop();
                temp /= 2;
            }
            else if (c==']'){
                if(stack.empty() || stack.peek() != '['){
                    result = 0;
                    break;
                }
                else if(s.charAt(i-1) == '['){
                    result += temp;
                }
                stack.pop();
                temp /=3;
            }
        }
        if(!stack.empty()){
            return 0;
        }
        return result;
    }
}
profile
공부 정리용

0개의 댓글