이번 문제는 stack를 활용하여 괄호 짝을 찾는 문제이다.
하지만 이번 문제와는 다르게 소괄호 () 와 대괄호 []가 모두 들어가 있다.
따라서 if문 처리가 조금 복잡하다.
특히 ')'가 나온 뒤 '('가 나오는 등 순서도 신경써야하는 것이 헷갈렸다.
하지만 boolean변수를 하나 추가하여 해결했다.
코드를 통해 설명하겠다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.security.Identity;
import java.util.Stack;
public class Main {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while(true) {
//입력되는 여러 줄을 읽기위한 반복문
String line = br.readLine();
// 입력값을 읽어들임
Stack<Character> stack = new Stack<>();
// Stack선언
boolean isValid = true;
//')'과 ']'이 먼저 입력되었을 때, 올바르지 않은것을 처리하기 위한 변수
if(line.equals(".")) {
break;
//"."이 입려되면 반목문을 중단
}
for(int i = 0; i < line.length(); i++) {
//문장 내 글자를 하나하나 읽기위한 반목분
char c = line.charAt(i);
//c는 문자열의 i번째 문자
if(c == '(' || c == '[') {
stack.push(c);
//우선 'c', '['가 입력되면 stack에 저장
}
else if(c == ')' && !stack.isEmpty() && stack.peek() == '(') {
stack.pop();
// ')'이 stack가 비어있지 않으면서 stack의 가장 윗값이 '('라면
//stack의 맨 윗요소 제거
}
else if(c == ']' && !stack.isEmpty() && stack.peek() == '[') {
stack.pop();
// ']'이 stack가 비어있지 않으면서 stack의 가장 윗값이 '['라면
//stack의 맨 윗요소 제거
}
else if(c == ')' || c == ']') {
//stack에 '(', '['가 저장되어 있지 않으면 참된 문장이 아니므로
isValid = false;
//isValid를 false처리
break;
}
}
if(stack.isEmpty() && isValid == true) {
System.out.println("yes");
//정상적인 문장이라면 소괄호, 대괄호의 짝이 맞아 스택이 비었을 것으며,
//')', ']'으로 시작하지 않으므로 isValid가 true일 것이다.
}
else {
System.out.println("no");
}
}
}
}
'java' 카테고리의 다른 글
| [java]백준 9012 괄호 (0) | 2024.01.31 |
|---|---|
| [java] 백준 10773 제로 (0) | 2024.01.31 |
| [java] 백준 28278 스택2 (0) | 2024.01.31 |
| [java] 백준 13909 창문 닫기 (1) | 2024.01.29 |
| [java] 17103 골드바흐 파티션 (0) | 2024.01.29 |