백준 - 2504번 괄호의 값 (골드 5)

2024. 3. 16. 15:57코딩테스트 정리(자바)

728x90

고민해봤으나 풀이가 떠오르지 않았다.

해설을 참고하니 분배법칙을 이용해서 풀어야 한다.

( 2+3*3)*2 + 2*3

-> 2*2 + 3*3*2 + 2*3 으로 

import java.io.*;
import java.util.*;

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));
        String s=br.readLine();
        Stack<Character> stack=new Stack<>();
        StringBuilder sb=new StringBuilder();
        int size=s.length();
        int result=0;
        int current=1;
        
        for(int i=0;i<size;i++){
            char ch=s.charAt(i);
            if(ch=='(') {//2를 곱함
                current*=2;
                stack.push(ch);
            }
            else if(ch=='[') {//3을 곱합
                current*=3;
                stack.push(ch);
            }
            else if(ch==')'){
                if(stack.isEmpty() || stack.peek()!='(') {
                    //스택이 비어있거나 괄호의 짝이 안맞을 경우 0출력
                    
                    break;
                }
                if(s.charAt(i-1)=='('){
                    // 바로 전 기호가 ')' 였다면 결과에 현재까지 계산한 값을 더함.
                    result+=current;
                }
                stack.pop();
                current/=2; //스택에서 pop하고 현재 계산값에서 2를 나눠줌.
            }
            else if(ch==']'){
                if(stack.isEmpty() || stack.peek()!='[') {
                    //스택이 비어있거나 괄호의 짝이 안맞을 경우 0출력
                    
                    break;
                }
                if(s.charAt(i-1)=='['){
                    // 바로 전 기호가 ')' 였다면 결과에 현재까지 계산한 값을 더함.
                    result+=current;
                }
                stack.pop();
                current/=3; //스택에서 pop하고 현재 계산값에서 3를 나눠줌.
            }
            
        }
        if(!stack.isEmpty()) //스택이 비어있지않다면 괄호가 잘못된 것임.
           result=0;
        sb.append(Integer.toString(result));
       
        bw.write(sb.toString());
        bw.flush();
        bw.close();
    }
}
728x90