반응형
- 알고리즘 분류 : 문자열, 스택
- 사용 언어 : JAVA
- 문제 요점
- 닫힌 괄호는 가장 마지막에 들어온 열린 괄호와 확인하기 때문에 스택을 이용하였다.
- 문제에서는 소괄호만 주어져있지만, 필자는 자체적으로 대괄호와 중괄호도 있다고 가정하고 구현하였다.
소스 설명은 주석을 참고해주세요.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
public class Main {
// 해당 문자열 정합성 검사
public static String isClear(String str) {
Stack<Character> s = new Stack<>();
for(int j=0; j<str.length(); j++) {
char now = str.charAt(j);
// 여는 괄호는 스택에 넣고
if(now == '[' || now == '{' || now == '(') {
s.add(now);
}
// 닫는 괄호는 스택에서 확인한다.
else {
// 스택이 비어있지 않다면
if(!s.isEmpty()) {
char c = s.pop();
// 스택에서 꺼낸 여는 괄호가 지금 닫는 괄호랑 종류가 다르다면 정합성 X
if( !((c == '[' && now == ']') || (c == '{' && now == '}') || (c == '(' && now == ')')) ) {
return "NO";
}
}
// 스택이 비어있으면 여는 괄호가 부족하다는 의미. 정합성 X
else {
return "NO";
}
}
}
// 스택이 비어있으면 정합성 O
if(s.isEmpty()) {
return "YES";
}
// 스택이 다 비지 않았으면 닫는 괄호가 부족하다는 의미. 정합성 X
else {
return "NO";
}
}
public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
for(int i=0; i<N; i++) {
String str = br.readLine();
sb.append(isClear(str) + "\n");
}
System.out.println(sb.toString());
}
}
반응형
'Algorithm' 카테고리의 다른 글
[BAEKJOON] 7576번 : 토마토 (JAVA) (0) | 2022.04.07 |
---|---|
[BAEKJOON] 5212번 : 지구온난화 (JAVA) (0) | 2022.03.28 |
[BAEKJOON] 15651번 : N과 M(3) (JAVA) (0) | 2022.03.23 |
[BAEKJOON] 15650번 : N과 M(2) (JAVA) (0) | 2022.03.22 |
[BAEKJOON] 15649번 : N과 M(1) (JAVA) (0) | 2022.03.21 |