올바른 괄호

문제

설명

괄호가 입력되면 올바른 괄호이면 “YES”, 올바르지 않으면 ”NO”를 출력합니다.

(())() 이것은 괄호의 쌍이 올바르게 위치하는 거지만, (()()))은 올바른 괄호가 아니다.

입력

첫 번째 줄에 괄호 문자열이 입력됩니다. 문자열의 최대 길이는 30이다.

출력

첫 번째 줄에 YES, NO를 출력한다.

예시 입력 1

(()(()))(()

예시 출력 1

NO

해결방법

  • 스택 구조 사용.
  • 괄호를 하나 정하고 넣음 ‘(’ 일 때 push, ‘)’일때 pop 하여 반복 수행, 반복을 수행 했는데 자료가 남아있는 경우 혹은 반복 내에 넣어야 하는데 비어있는 경우는 올바르지 못한 경우.
  • Stack에서는 push/pop 기본이고, isEmpty/size 등을 기본적으로 사용 가능하다.

코드

import java.util.*;

class Main {
    public String solution(String str) {
        String answer = "YES";
        Stack<Character> stack = new Stack<>();
        // 괄호가 쌍인 경우 올바른 것이므로, 여는 괄호일떄 넣고 아닐때 빼면
        // 올바른 문자열일 경우 최종적으로는 스택에 아무것도 남지 않아야 한다.
        for (char x : str.toCharArray()) {
            // 괄호가 여는 경우, 스택에 넣는다.
            if (x == '(') stack.push(x);
            // 여는게 아닌데, 
            else {
                // 비어있으면 올바르지 못한 것
                if (stack.isEmpty()) return "NO";
                // 안 비어있다면 꺼낸다.
                stack.pop();
            }
        }
        // 다 진행 했는데, 스택에 괄호가 남아있다면 올바르지 않은 것.
        if (!stack.isEmpty()) return "NO";
        return answer;
    }

    public static void main(String[] args) {
        Main.Main T = new Main.Main();
        Scanner kb = new Scanner(System.in);
        String str = kb.next();
        System.out.println(T.solution(str));
    }
}


© 2024. Chiptune93 All rights reserved.