설명
괄호가 입력되면 올바른 괄호이면 “YES", 올바르지 않으면 ”NO"를 출력합니다. (())() 이것은 괄호의 쌍이 올바르게 위치하는 거지만, (()()))은 올바른 괄호가 아니다.
입력
첫 번째 줄에 괄호 문자열이 입력됩니다. 문자열의 최대 길이는 30이다.
출력
첫 번째 줄에 YES, NO를 출력한다.
예시 입력 1
(()(()))(()
예시 출력 1
NO
문제 해결
스택을 만들어 입력 괄호들을 입력받아 넣은 후 '(' 를 만나면 push를 하고, ')' 를 만나면 pop을 해서 만약 스택에 남아있는 게 없다면 짝이 맞는 거, 남는 게 있다면 짝이 맞지 않는 거로 생각하고 문제 풀이에 접근했다.
예시 입력에서 '( ( ) ( ( ) ) ) ( ( )' 가 들어있고, 위에 말한 것 처럼 push, pop을 반복하다보면 스택에 '( (' 가 남게 된다.
즉 짝이 맞지 않으므로 'NO'가 출력되는 것이다.
괄호 하나하나를 취급할 것이므로 Character 형으로 스택을 만들어준 후, 입력받은 괄호의 길이만큼 for문을 돌아준다.
만약 '(' 를 만난다면 스택에 push를 해주는 코드이다.
Stack<Character> stack = new Stack<>();
for(int i = 0; i < input.length(); i++) {
if(input.charAt(i) == '(')
stack.push(input.charAt(i));
내가 스택이 비어있을 때의 생각을 하지 못 해 RuntimeError를 만났는데, 만약 ')'를 만나 pop을 해주었는데 스택이 비어있을 때 pop을 하게 되면 EmptyStackException이 발생하게 되므로 꼭 '스택이 비어있지 않을 때'의 조건을 걸어주어야 한다.
else {
if (!stack.empty()) //안 해줘서 RuntimeError 뜸. 만약 ')'를 만났는데 비어있을 때 pop을 하면, EmptyStackException이 발생함.
stack.pop();
else {
System.out.println("NO");
return;
}
위의 단계들을 거친 후 스택이 비어있으면 괄호들의 짝이 맞는 것이므로 'YES'를 출력해주면 된다.
if(stack.empty())
System.out.println("YES");
최종 코드
import java.util.Scanner;
import java.util.Stack;
public class P01_올바른괄호 {
public static void main(String[] args) {
// ( 를 만나면 push, ) 를 만나면 pop, 남아있는 게 없다면 짝이 맞는 거
// ( ( ) ( ( ) ) ) ( ( )
// ( ( => NO
Scanner in = new Scanner(System.in);
String input = in.nextLine();
Stack<Character> stack = new Stack<>();
for(int i = 0; i < input.length(); i++) {
if(input.charAt(i) == '(')
stack.push(input.charAt(i));
else {
if (!stack.empty()) //안 해줘서 RuntimeError 뜸. 만약 ')'를 만났는데 비어있을 때 pop을 하면, EmptyStackException이 발생함.
stack.pop();
else {
System.out.println("NO");
return;
}
}
}
if(stack.empty())
System.out.println("YES");
}
}
'알고리즘 문제풀이 입문: 코딩테스트 대비 > 섹션 5. Stack, Queue(자료구조)' 카테고리의 다른 글
공주 구하기 (1) | 2024.04.15 |
---|---|
쇠막대기 (0) | 2024.04.13 |
후위식 연산(postfix) (0) | 2024.04.12 |
크레인 인형 뽑기 (카카오) (0) | 2024.04.12 |
괄호 문자 제거 (0) | 2024.04.12 |