https://www.acmicpc.net/problem/9012
스택을 활용한 방법입니다.
스택은 입력 출력 할 수 있는 구멍이 한 개인 구조입니다.
아파트 건물을 쌓는다 생각하면 됩니다.
push는 쌓는 것 입니다.
처음 들어오면 1층이되고 그 다음에 들어오면 2층이 되고 그 다음에 들어오면 3층이 됩니다.
pop는 빼는 것 입니다.
3층 까지 쌓아있을 때 pop를 해주면 3층이 빠지게 됩니다. 1,2 층만 남습니다.
이런 구조입니다.
import java.util.Scanner;
import java.util.Stack;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
for(int i=0; i<n; i++){
Stack stack = new Stack();
String s = sc.next();
for(int j=0; j<s.length(); j++){
if(s.charAt(j)=='('){
stack.push('(');
}else if(s.charAt(j)==')'){
try {
stack.pop();
}catch (Exception e){
stack.push("fair");
break;
}
}
}
if(stack.isEmpty()){
System.out.println("YES");
}else if(!stack.isEmpty()){
System.out.println("NO");
}
}
}
}
스캐너로 테스트 케이스 개수 만큼 입력받고
그 개수 만큼 반복문을 만들어 줍니다.
테스트 케이스 반복 시 마다 스택을 생성하고,
하나의 테스트 케이스를 문자열로 입력받습니다.
입력받은 테스트 케이스의 문자열 개수 만큼 반복문을 만듭니다.
그 후 문자열을 한 개씩 검사합니다.
그 문자가 '(' 이면 스택에 push 합니다. 1층에 '(' 를 쌓습니다.
문자가 '(' 가 아니고 ')' 이면 pop를 해줍니다.
1층에 '(' 가 있었고, 다음 문자로 ')'이 들어와서 pop를 해주면
스택은 빈 상태가 되고 "()" 한 개가 완성된 것 입니다.
이 때, 아파트가 빈 상태 즉, 아무것도 쌓여있지 않을 때 pop를 하게 되면 어떻게 될까요?
스택이 비어있다 라는 에러 메세지를 반환합니다. 즉 비어있는 상태에 ')' 라는 문자가 들어오면 해당 테스트 케이스는 "NO" 입니다.
그래서 빈 상태에 에러가 발생하면 바로 반복문을 빠져나갑니다. 이 때, 스택을 검사하기 위해 실패인 케이스에 스택에
"fair"이라는 단어를 push 해줍니다.
각 테스트 케이스 검사가 끝날 때 마다 스택을 검사하여
스택이 비어있으면 "YES"를 출력
스택이 비어있지 않으면 "NO"를 출력 해줍니다.
이전에, fair를 push 해주었죠. 그래서 비어있지 않으면 "NO" 입니다.
스택이 비어있다면 괄호들이 정상적으로 ()를 이루며 다 사라졌기 때문에 비어있는 상태가 된 것입니다.
'알고리즘 with JAVA' 카테고리의 다른 글
백준 11719번 그대로 출력하기 2 - 자바 (0) | 2021.05.27 |
---|---|
11721번 열 개씩 끊어 출력하기 - 자바 (0) | 2021.05.23 |
백준 11718번 문제 그대로 출력하기 - with 자바 (0) | 2021.05.13 |
백준 1316번 그룹 단어 체커 - 자바 (0) | 2021.04.13 |
백준 2941 크로아티아 알파벳 - 자바 (0) | 2021.04.13 |