코드: https://github.com/kgh128/Problem-Solving/blob/main/src/Baekjoon/p9012.java
주어진 괄호 문자열을 입력받는다.
String ps = br.readLine();
괄호 문자열 ps를 돌면서 스택 연산을 수행한다. 문자열을 돌 때 향상된 for문을 이용한다. char형으로 돌아야 하므로, toCharArray()를 이용하여 String인 ps를 char형 배열로 변환한다.
(인 경우: 스택에 넣는다.)인데 스택에 (이 들어있는 경우: (을 스택에서 빼서 괄호 쌍을 만든다.)인데 스택이 비어있는 경우: )와 짝을 이룰 (이 없으므로 올바른 괄호 문자열이 아니다.위와 같이 스택 연산을 수행한다.
Stack<Character> stack = new Stack<>();
boolean isVps = true;
for (char p: ps.toCharArray()) {
if (p == '(') {
stack.push(p);
}
else if (p == ')' && !stack.empty()) {
stack.pop();
}
else if (p == ')' && stack.empty()) {
isVps = false;
break;
}
}
원래는
if문의 조건이 더 간단했지만, 가독성이 안좋아서 좀 더 길더라도 위와 같이 수정했다. 가독성과 코드 길이 사이의 중심을 잡는 게 힘든 것 같다.
'('가 남은 경우스택 연산을 모두 수행했는데, 스택이 비어있지 않다는 것은 짝을 못이룬 (가 남았다는 의미이다. 이 경우도 마찬가지로 올바른 괄호 문자열이 아니다.
if (!stack.empty()) {
isVps = false;
}
isVps는 올바른 괄호 문자열인지 저장하는 변수이다. 이를 이용하여 출력 버퍼에 결과("YES" 또는 "NO")를 저장한다.
if (isVps) bw.append("YES\n");
else bw.append("NO\n");