[devmoon]백준 2504 - (Java) 괄호의 값
알고리즘/백준

[devmoon]백준 2504 - (Java) 괄호의 값

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

 

2504번: 괄호의 값

4개의 기호 ‘(’, ‘)’, ‘[’, ‘]’를 이용해서 만들어지는 괄호열 중에서 올바른 괄호열이란 다음과 같이 정의된다. 한 쌍의 괄호로만 이루어진 ‘()’와 ‘[]’는 올바른 괄호열이다.  만일

www.acmicpc.net

1. 유형

스택, 문자열

 

2. 시뮬레이션

 

난이도에 비해 예외케이스가 많아서 까다로웠던 문제.

 

로직

  • 여는괄호 ( [  와 닫히는괄호 ) ]가 연속해서 붙어있는 경우에 합을 계산.

예외처리를 신경써야한다.

- 맨 앞에 여는괄호가 나오는 경우 )()  -> 0

- 길이가 1인 경우  ) -> 0

- 짝이 안 맞는 경우 (() -> 0

3. 코드

import java.io.*;
import java.util.*;
public class Main {

	public static void main(String[] args) throws IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(in.readLine());
		String S=st.nextToken();
		Stack<Character> stack=new Stack<>();
		int K=1;
		int sum=0;
		for(int i=0;i<S.length();i++) {
			if(S.charAt(i)=='(') {
				K*=2;
				stack.add('(');
			}else if(S.charAt(i)=='[') {
				K*=3;
				stack.add('[');
			}else if(!stack.isEmpty()&&S.charAt(i)==')') {
				if(i-1>=0&&S.charAt(i-1)=='(') {
					sum+=K;
				}else {
					if(stack.peek()!='(') {
						sum=0;
						break;
					}
				}
				K/=2;
				stack.pop();
			}else if(!stack.isEmpty()&&S.charAt(i)==']') {
				if(i-1>=0&&S.charAt(i-1)=='[') {
					sum+=K;
				}else {
					if(stack.peek()!='[') {
						sum=0;
						break;
					}
				}
				K/=3;
				stack.pop();
			}else {
				sum=0;
				break;
			}
		}
		if(!stack.isEmpty())
			System.out.println(0);
		else
			System.out.println(sum);
	}

	static int stoi(String s) {
		return Integer.valueOf(s);
	}
}
/*
붙어있을때만 계산
int K
for N:
	if (:
		K*=2
		스택에 저장
	if [:
		K*=3
		스택에 저장
	if ):
		if 이전값이 (일때 sum에 추가
		else 
			if 탑이 ( 아님:
				break
		나누기
		stack.pop
	if ]:
		if 이전값이 [일때 sum에 추가
		else
			if 탑이 [ 아님:
				break
		나누기
		stack.pop -> 예외처리, 비어있을경우 런탐에러
	else:
		첨부터 ] )나온경우
if stack이 empty가 아님:
else empty임
*/

4. 느낀점

낮은 난이도 치고는 예외처리할게 많아서 조금 

복잡했던 문제였다. 수도코드를 짜는것이 많은 도움이 된거같다.