문제
문제해결
import java.util.Scanner;
import java.util.Stack;
public class B9012 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
for (int i = 0; i < n; i++) {
String str = sc.next();
Stack<Character> stack = new Stack<>(); //괄호를 담을 스텍
boolean flag = true;
for (int j = 0; j < str.length(); j++) {
if (str.charAt(j)=='(') stack.push('('); //여는 괄호 넣기
else
if (stack.empty()){ //닫는 괄호가 더 많을 경우
System.out.println("NO");
flag = false; //이미 판별이 난 경우 괄호 개수 맞는지 체크 불필요
break;
} else
stack.pop();
}
if (flag) //괄호 개수 맞는지 체크
if (stack.empty()) System.out.println("YES"); //괄호 개수가 맞음
else System.out.println("NO"); //여는 괄호가 더 많을 경우
}
}
}
- 괄호 체크에는 3가지 경우의 수가 있다.
1. 여는 괄호가 더 많을 경우 -> stack에 남는 요소가 있다
2. 닫는 괄호가 더 많을 경우 -> stack이 빌때 꺼내게 된다
3. 괄호가 딱 맞을 경우 -> stack의 size가 정확히 0이 된다
- 우선 문자열을 하나씩 체크하면서 여는 괄호일때는 stack에 push 한다
- 닫는 괄호일 경우 stack에 pop한다. 이때 매칭되는 여는 괄호가 없을 시 stack이 empty가 되므로 empty 체크 후 닫는 괄호가 더 많을 경우 NO를 출력하고, 뒤에 괄호 개수 맞는지 체크할 필요가 없어진다
- 반복문이 끝까지 다 돌았을 경우에는 1,3번 경우의 수만 남게된다. empty일 경우 괄호가 딱 맞으므로 YES를 출력하고 아닐 경우 여는 괄호가 더 많으므로 NO를 출력한다
'[알고리즘] > 백준' 카테고리의 다른 글
백준 1406 자바 - 에디터 (0) | 2021.06.15 |
---|---|
백준 1874 자바 - 스택 수열 (0) | 2021.06.14 |
백준 10828 자바 - 스택 (0) | 2021.06.12 |
자바 - 구현 - 백준 9093 단어 뒤집기 (0) | 2021.06.12 |
자바 - 구현 - 백준 1783 병든 나이트 (0) | 2021.05.26 |