JAVA/알고리즘 공부

[백준] 9012번: 괄호 (JAVA)

soyeonisgood 2022. 11. 12. 20:51

 

이 문제는 예제에 대한 해석이 잘 되어야한다. 

여는괄호만 스택에 담고(push), 닫는 괄호를 만날 때마다 스택을 하나씩 지운다(pop). 최종적으로 스택이 비어있으면  YES, 그렇지 않으면 NO 이다. 첫 시작이 닫는 괄호로 시작하면 NO 인 것을 잊지말자. 아래 예시를 보고 조건문 로직을 고민해보자.

 

예시 1.

여는괄호'(' 와 닫는괄호')' 로 크게 바깥을 감싸고, 그 내부도 여는괄호'(' 로 시작해서 닫는괄호')' 로 끝나는 적절한 경우 

예시 2.

기본 VPS: 여는괄호'('  닫는괄호')' 가 하나씩 있는 경우

틀린 예시 1. 

첫 인덱스가 닫는괄호')' 로 시작

틀린 예시 2. 

여는괄호'(' 없이 닫는괄호')' 가 오는 경우

 

 

 

package stack;

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

public class Ex9012 {
	public static void main(String[] args) {
		
		try {
			StringBuffer sb = new StringBuffer();
			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
			int cnt = Integer.parseInt(br.readLine());
			
			while(cnt-- > 0) {
				String vps = br.readLine();
				Stack<Character> s = new Stack<>();
				boolean b = true;
				
				for(int i=0; i<vps.length(); i++) {
					if(vps.charAt(i)=='(') { 
						s.push(vps.charAt(i));
					} else { 
						if(! s.empty()) {
							s.pop();
						} else { // 닫는 괄호 시작 && 스택에 여는 괄호 없을 때
							b = false;
						}
					}
				}
				
				if(!s.empty()) { 
					b = false;
				}
				
				if(b==true) {
					sb.append("YES \n");
				} else {
					sb.append("NO \n");
				}
			}
			
			System.out.println(sb);
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
}