1. 문제 설명


2. 제한 사항


3. 입출력 예

let output = solution("()()");
console.log(output); // true

output = solution("(())()");
console.log(output); // true

output = solution(")()(");
console.log(output); // false

output = solution("(()(");
console.log(output); // false

4. 입출력 예 설명

입출력 예 #1,2,3,4문제의 예시와 같습니다.


5. 문제 풀이

function solution(s) {
  const stack = [];
  for (let i = 0; i < s.length; ++i) {
    stack.push(s[i]);
    let bracket = stack[stack.length - 2] + stack[stack.length - 1];
    if (bracket === '()') {
      stack.pop();
      stack.pop();
    }
    else if (bracket === ')(') return false;
  }
    
  if (stack.length === 0) return true;
  return false;
}

6. 문제 풀이 해설

function solution(s) {
  // 분석
  // 짝짓기 문제는 스택을 활용하면 편하다.
    
  // 풀이
  // 1. 우선 스택을 선언하고, 반복문을 돌린다.
  // 2. 반복문의 첫 줄에는 항상 s를 하나씩 푸쉬한다.
  // 3. 스택의 끝에서 두번째 요소와, 마지막 요소의 합이 올바른 괄호형태인지 체크한다.
  // 4. 조건에 부합한다면 완성된 괄호를 제거하고, 아니면 계속 반복문을 진행한다.
  // 5. 단, 탐색 중간에 한번이라도 역방향 괄호가 쌓이면 false를 반환해야 한다.
  // (5번은 효율성을 위해 추가된 것이다. 즉, 5번 조건이 없어도 정확성은 통과한다.)
  const stack = [];
  for (let i = 0; i < s.length; ++i) {
    stack.push(s[i]);
    let bracket = stack[stack.length - 2] + stack[stack.length - 1];
    if (bracket === '()') {
      stack.pop();
      stack.pop();
    }
    else if (bracket === ')(') return false;
  }
    
  // 6. 반복문이 끝났을 때 stack에 남아있는 게 없다면 전부 올바른 괄호였던 것이다.
  // 즉, 그렇다면 true를 반환하고, 하나라도 남아있다면 false를 반환한다.
  if (stack.length === 0) return true;
  return false;
}