사용한 방법 : Stack
풀이 :
1. 왼쪽 소괄호 혹은 왼쪽 대괄호를 만나면 스택에 push한다.
2. 오른쪽 소괄호(오른쪽 대괄호)를 만났을 때, 스택의 맨 위의 문자가 왼쪽 소괄호(왼쪽 대괄호)가 아니면
균형잡힌 문자열이 아니다.
- 스택의 맨 위의 문자가 왼쪽 소괄호(왼쪽 대괄호)이면 pop한다.
- 스택의 맨 위의 문자가 왼쪽 소괄호(왼쪽 대괄호)가 아니면 균형잡힌 문자열이 아니므로 반복문을 빠져나간다.
- 스택이 비어있으면 오른쪽 소괄호(오른쪽 대괄호)를 넣는다.
3. 문자열의 길이만큼 반복문을 마쳤을 때 스택이 비어있으면 균형잡힌 문자열이고,
스택이 비어있지 않으면 균형잡힌 문자열이 아니다.
전체코드
package num4949;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Stack;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
Stack<Character> s;
String str;
while (!(str = br.readLine()).equals(".")) {
s = new Stack<>();
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (c == '(' || c == '[')
s.push(c);
else if (c == ')' || c == ']') {
if (!s.isEmpty()) {
char ch = s.peek();
if ((c == ')' && ch == '(') || (c == ']' && ch == '['))
s.pop();
else
break;
} else
s.push(c);
}
}
if (!s.isEmpty())
bw.write("no\n");
else
bw.write("yes\n");
}
bw.flush();
}
}
'BOJ' 카테고리의 다른 글
[백준 1520번] 내리막 길 (java) (1) | 2019.09.23 |
---|---|
[백준 11722번] 가장 긴 감소하는 부분 (java) (0) | 2019.09.21 |
[백준 1509번] 팰린드롬 분할 (java) (0) | 2019.09.21 |
[백준 1707번] 이분 그래프 (java) (0) | 2019.09.21 |
[백준 9251번] LCS (java) (0) | 2019.09.20 |