본문 바로가기

알고리즘(Java)/스택

백준 2504번 괄호의 값★

다시 풀어보기..

 

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

public class Main {
	
	private void solve(){
		String[] array = sc.readLine().split("");
		
		
		Stack<String> stack = new Stack<>();
		int sum = 0;
		
		int check = 0;
		for (int i = 0; i < array.length; i++) {
			if (check == -1) {
				System.out.println(0);
				return;
			}

			if (array[i].equals("(") || array[i].equals("[")) {
				stack.push(array[i]);
			} else {
				if (stack.isEmpty()) {
					System.out.println(0);
					return;
				}

				if (array[i].equals(")")) {
					if (stack.peek().equals("(")) {
						stack.pop();
						stack.push("2");
					} else {
						check = stackInnerLoop(stack, "[", "(", 2);
					}
				} else {
					if (stack.peek().equals("[")) {
						stack.pop();
						stack.push("3");
					} else {
						check = stackInnerLoop(stack, "(", "[", 3);
					}
				}
			}
		}
		
		// 최종 스택 안에는 정수들만 존재한다.
				// 괄호가 있을 시 올바르지 않은 문자열
				while (!stack.isEmpty()) {
					if (stack.peek().equals("(") || stack.peek().equals(")") || stack.peek().equals("[")
							|| stack.peek().equals("]")) {
						System.out.println(0);
						return;
					}
					sum += Integer.parseInt(stack.pop());
				}
				System.out.println(sum);

	}
	private int stackInnerLoop(Stack<String> stack, String str1, String str2, int value) {
		int result = 0;
		
		while(!stack.isEmpty()){
			String top = stack.peek();
			
			if(top.equals(str1)){
				return -1;
				
			}else if(top.equals(str2)){
				stack.pop();
				result *= value;
				stack.push(String.valueOf(result));
				break;
			}else{
				result += Integer.parseInt(stack.pop());
			}
		}
		
		return result;
	}
	public static void main(String[] args) throws IOException {
		sc.init();
		new Main().solve();
	}
	
	static class sc{
		private static BufferedReader br;
		
		static void init(){
			br = new BufferedReader(new InputStreamReader(System.in));
			
		}
		
		static String readLine(){
			try{
				return br.readLine();
			}catch(IOException e){}
			
			return null;
		}
	}
}//http://mygumi.tistory.com/175

'알고리즘(Java) > 스택' 카테고리의 다른 글

백준알고리즘 9012번 괄호  (0) 2017.11.16
알고리즘(스택 수열)-★  (0) 2017.11.15