본문 바로가기
알고리즘 문제풀이 입문: 코딩테스트 대비/섹션 5. Stack, Queue(자료구조)

올바른 괄호

by _비니_ 2024. 4. 12.

설명

괄호가 입력되면 올바른 괄호이면 “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");
    }
}
반응형