[algorithm/ 자료구조 스택 (stack) ] 올바른 괄호(짝이 맞는 경우)

YoungSeo_Study.log·2022년 3월 2일
0

문제: 올바른 괄호, 짝이 맞으면 "yes", 괄호의 짝이 안맞으면 "no"를 출력한다.

입력) () 소괄호 / (()) => 짝이 맞다 / (()))) => 짝이 맞지 않다

접근방식

  • 자료구조 stack 스택을 사용, 후입선출 특징 (젤 나중에 들어간 자료가 젤 먼저 나온다.)
  • ( 여는 괄호를 stack에 담고, ) 닫는 괄호가 입력받는다면 stack []에서 (여는 괄호를 제거한다.
    => 짝이 맞지 않는 경우) 만약 stack []안에 ( 괄호가 남아있다면? ) 닫는 괄호 부족
    => 짝이 맞지 않는 경우) stack [] 안이 비었지만, 입력할 ) 닫는 괄호가 남아있는 경우
    => 짝이 맞는 경우) stack [] 안이 비고, 입력할 자료 남아있지 않다.

풀이

  1. 변수 stack을 선언하고 ( 를 담기위해 [] 빈배열을 할당한다.
  2. 입력받는 요소를 모두 조회한다.
  3. 여는 괄호를 조회한 경우? => 입력받는 ( 를 stack []에 담는다.
    => stack.push(el)
  4. 닫는 괄호를 만난 경우? () 짝 만들어진다.
    4-1. 조건 1) stack.length 가 0이라면 ( 가 없는데, 입력할 ) 만 있는 경우
    => 짝이 맞지 않으므로 "no"를 리턴한다.
    4-2. 조건 2) stack []내에 고 ( 여는 괄호가 있다면 제거한다.
    => stack.pop();
  5. 반복문을 다 돌며 모든 괄호의 짝을 비교한 경우,
    5-1. stack[]안에 ( 있으면 )가 부족했던 것
    => "no"를 리턴
    5-2. stack[]이 텅비고, 입력할 요소가 없는 경우 () 모든 괄호가 짝이 지어졌으므로
    => "yes"를 리턴한다.
function solution(arr) {
        let stack = [];
        for (let el of arr) {
          if (el === "(") {
            stack.push(el);
          } else {
            if (stack.length === 0) {
              return "no";
            } else {
              stack.pop();
            }
          }
          if (stack.length > 0) {
            return "no";
          }
          return "yes";
        }
      }

      let arr = "(()(()))(()"; // no
      console.log(solution(arr));
profile
느리지만 조금씩 공부하는 중 입니다. 현재 3개월차 신입입니다 ><!

0개의 댓글