본문 바로가기
알고리즘 문제풀이/백준

[백준 2054] 괄호의 값(JAVA)

by 소보루:-) 2020. 3. 4.

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

 

2504번: 괄호의 값

4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다. 한 쌍의 괄호로만 이루어진 ‘()’와 ‘[]’는 올바른 괄호열이다.  만일 X가 올바른 괄호열이면 ‘(X)’이나 ‘[X]’도 모두 올바른 괄호열이 된다.  X와 Y 모두 올바른 괄호열이라면 이들을 결합한 XY도 올바른 괄호열이 된다. 예를 들어 ‘(()[[]])’나 ‘(())[][]’ 는 올바른 괄호열이지만 ‘([)]’ 나 ‘(()(

www.acmicpc.net

 

여는 괄호 (,[ 이면 스택에 넣어주고, 닫는 괄호면 스택의 가장 끝에 들어있는 값이 맞는 짝인지 확인해줬다.

val 값을 1로 두고 , 연산을 진행하면서 답을 구했다.

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

public class Main_bj_2504_괄호의값 {

	public static Stack<Character> stack=new Stack<Character>();
	public static void main(String[] args) throws Exception{
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		String s=br.readLine();
		boolean f=false;
		long ans=0;
		int val=1;
		for(int i=0; i<s.length(); i++) {
			if(s.charAt(i)=='(') {
				stack.add(s.charAt(i));
				val*=2;
			}
			if(s.charAt(i)=='[') {
				stack.add(s.charAt(i));
				val*=3;
			}
			if(s.charAt(i)==')') {
				if(stack.empty() || stack.peek()!='(') {
					f=true;
					break;
				}if(s.charAt(i-1)=='(')
					ans+=val;
				stack.pop();
				val/=2;
				
			}else if(s.charAt(i)==']') {
				if(stack.empty() || stack.peek()!='[') {
					f=true;
					break;
				}
				if(s.charAt(i-1)=='[')
					ans+=val;
				stack.pop();
				val/=3;
			}
		}
		if(f==true || !stack.empty()) {
			System.out.println(0);
		}else {
			System.out.println(ans);
		}
	}

}

댓글