[JS] 올바른 괄호

문제 설명

괄호가 입력되면 올바른 괄호이면 “YES", 올바르지 않으면 ”NO"를 출력합니다.
(())() 이것은 괄호의 쌍이 올바르게 위치하는 거지만, (()()))은 올바른 괄호가 아니다.

입력설명

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

출력설명

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

입력예제

(()(()))(()

출력예제

NO


문제 풀이

입구와 출구가 동일한 stack 사용 해야 함.

LIFO(Last In First Out) : 나중에 들어간 것이 먼저 나옴.

  • push() : 객체를 집어넣음
  • pop() : 나중에 들어간 객체가 먼저 나옴

stack에 '(' 괄호를 입력하다가 ')' 닫는 괄호를 만나면 pop하기.

  1. for..of 문을 사용하여 문자열 개수만큼 반복한다.
  2. if : '(' 를 넣으면 stack 배열에 넣는다. => push
  3. else : ')'를 넣었는데
    • if : stack이 비어있으면 'NO'return
    • stack 배열에서 나중에 들어간 객체 '('를 꺼내준다. => pop
  4. for문이 끝나고 if : stack 배열이 비어있지 않으면 'NO' return
  5. else : 'YES' return
<!-- [210908] 올바른 괄호 -->
<!-- 스택에 괄호를 push 하다가 ')' 닫는 괄호를 만나면 pop하기 -->
<html>
  <head>
    <meta charset="UTF-8" />
    <title>출력결과</title>
  </head>
  <body>
    <script>
      function solution(s) {
        let answer = 'YES';
        let stack = [];
        for (let x of s) {
          // '('(여는 괄호)를 넣으면 push
          if (x === '(') stack.push(x);
          else {
            // ')'(닫는 괄호)를 넣었는데 짝이 없으면
            if (stack.length === 0) return 'NO';
            stack.pop();
          }
        }
        // stack이 비어있지 않으면 올바른 괄호가 아님
        if (stack.length > 0) {
          answer = 'NO';
        }
        return answer;
      }
      let a = '(()(())))';
      console.log(solution(a));
    </script>
  </body>
</html>

좋은 웹페이지 즐겨찾기