공부 기록장

[백준-2504] 괄호의 값 본문

알고리즘/백준

[백준-2504] 괄호의 값

또도닝 2021. 5. 10. 19:03

이 문제는 백준 실버 2 레벨의 문제이다.

 

이 문제는 실버 2임에도 불구하고 뭔가 생각해야 할 것도 많고 되게 까다로웠다. 

처음에는 식을 어떻게 세워야 할 지 몰라서 헤매고 있었는데 스터디 같이 하던 오빠가 어떤식으로 풀면 되는지 알려주었다.

 

1) (나 [와 같은 열리는 괄호가 나오면 스택에 넣어주기

2) 닫히는 괄호가 나왔을 때 스택 제일 위에 있는 것이 짝이 맞는 열리는 괄호라면 2 혹은 3 으로 바꿔주기

3) 열리는 괄호가 아니라면 스택을 검사하며 열리는 괄호가 나올 때 까지 값을 더해주거나 곱해주기.

4) 단, 짝이 맞지 않는 열리는 괄호가 나오면 올바르지 않은 문장이기 때문에 종료.

 

이게 가장 큰 틀이다.

 

import java.util.Scanner;
import java.util.Stack;

public class 괄호의값_2504 {
	static String s;
	static Stack<String> stack;
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		stack = new Stack<>();
		s = sc.next();
		
		boolean flag = true;
		for(int i = 0; i < s.length(); i++) {
			String c = s.substring(i, i+1);
			if(c.equals("(") || c.equals("[")) //열리는 괄호 삽입
				stack.push(c);
			else if(!stack.isEmpty()){ //스택이 비어있지 않다면 
				if(c.equals(")")) { // ) 가 나왔을 때
					if(stack.peek().equals("(")) { //바로 앞이 ( 였다면
						stack.pop();
						stack.push("2"); //그 자리를 2로 바꿔줌
					}else {
						int sum = 0;
						while(!stack.isEmpty()){ //loop 검사
							String check = stack.pop();
							if(check.equals("(")) { //스택을 돌다가 ) 부분을 만나면
								sum *= 2; //지금까지 더해준 숫자에 2를 곱해준 뒤 넣어주기
								stack.push(Integer.toString(sum));
								break;
							}else if(check.equals("[")){ // [를 만나면 잘못된 수식.
								flag = false;
								break;
							}else { //숫자를 만났다면 같은 괄호 속에 들어있는 것이므로 계속해서 더해주기.
								sum += Integer.parseInt(check);
							}
						}
					}
				}else { //[의 경우도 (와 똑같이 계산. 
					if(stack.peek().equals("[")) {
						stack.pop();
						stack.push("3");
					}else {
						int sum = 0;
						while(!stack.isEmpty()){
							String check = stack.pop();
							if(check.equals("[")) {
								sum *= 3;
								stack.push(Integer.toString(sum));
								break;
							}else if(check.equals("(")){
								flag = false;
								break;
							}else {
								sum += Integer.parseInt(check);
							}
						}
					}
				}
			}else { //스택이 비어있는데 열리는 괄호가 아니면 끝.
				flag = false;
				break;
			}
		}
		
		int ans = 0;
		while(!stack.isEmpty()){ 
			String check = stack.pop();
			if(check.equals("(") || check.equals("[")){
				flag = false;
				break;
			}
			ans += Integer.parseInt(check);
		}
		if(flag) {
			System.out.println(ans);			
		}else {
			System.out.println(0);
		}
	}
}

 

'알고리즘 > 백준' 카테고리의 다른 글

[백준-1806] 부분합  (0) 2021.05.11
[백준-1916] 최소비용 구하기  (0) 2021.05.03
[백준-1062] 가르침  (0) 2021.04.29
[백준-14719] 빗물  (0) 2021.04.28
[백준-14888] 연산자 끼워넣기  (0) 2021.04.28
Comments