백준 - 4949번 : 균형잡힌 세상 (Silver IV)
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String s = "";
//br로 한 줄씩 입력 받는 것을 s에 넣고, 문장이 담긴 s가 .이 아닐 때까지 반복
while (!(s = br.readLine()).equals(".")) {
//s를 char 배열로 변환 => String 배열로 변환해도 되지만 시간을 단축시키려면 char을 활용하는 편이 좋음
char[] arr = s.toCharArray();
//여는 괄호를 담을 스택. 닫는 괄호가 나올 때 제일 위에 있는 괄호를 꺼내는 용도
Stack<Character> stack = new Stack<>();
//균형이 맞는지 파악용
boolean check = true;
for (int i = 0; i < arr.length; i++) {
//만약 여는 괄호면 그냥 stack에 담기
if (arr[i] == '(' || arr[i] == '[') stack.add(arr[i]);
//만약 닫는 괄호라면
if (arr[i] == ')' || arr[i] == ']') {
//스택이 비어있지 않고, 닫는 소괄호면 스택 최상위가 여는 소괄호이거나 닫는 대괄호면 스택 최상위가 여는 대괄호라면
if (!stack.isEmpty() && ((arr[i] == ')' && stack.peek() =='(') || (arr[i] == ']' && stack.peek() =='['))) {
//스택 최상위 값 제거
stack.pop();
} else {
//그렇지 않으면 균형이 맞지 않으므로 check에는 false를 담고 for문 끝내기
check = false;
break;
}
}
}
//마지막 확인으로 스택이 비어있지 않으면 균형이 맞지 않기 때문에 확인
if (!stack.isEmpty()) check = false;
//check가 true면 yes를, false면 no를 출력
bw.write((check ? "yes" : "no") + "\n");
}
bw.flush();
bw.close();
}
}