프론트엔드 개발/Algorithm

프로그래머스 lv.2 올바른 괄호

하이고니 2023. 1. 19. 00:00
문제 설명

괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어

  • "()()" 또는 "(())()" 는 올바른 괄호입니다.
  • ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.

'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고,
올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.

 

제한사항
  • 문자열 s의 길이 : 100,000 이하의 자연수
  • 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.

 
입출력 예시
 
"()()" true
"(())()" true
")()(" false
"(()(" false

 

나의 코드

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

function solution(s) {
  let openCount = 0;
  for (let i = 0; i < s.length; i++) {
      if (s[i] === '(') {
          openCount++;
      } else if (s[i] === ')') {
          if (openCount === 0) {
              return false;
          } else {
              openCount--;
          }
      }
  }
  return openCount === 0;
}

 

open 괄호 가 들어오면 openCount를 ++ 한다.

close 괄호 가 들어왔을 때, openCount가 0 이라면 무조건 false 다.

openCount 가 0이 아니라면 (open 괄호가 하나라도 있는 상황이면) 쌓여있는 (open 괄호)를 하나씩 제거한다.

 

마지막에 openCount가 0이 아니면 무조건 false다.

 

 

아름다운 풀이

function solution(s){
    let cum = 0
    for (let paren of s) {
        cum += paren === '('? 1: -1
        if(cum < 0) {
            return false
        }
    }
    return cum === 0? true: false;
}

 

이건 진짜 예술이다..

cum 이라는 변수를 두고 0의 값을 할당한다.

 

s 스트링의 요소가 ( 이면 1을 더하고 아니면 1을 뺀다.

cum이 0 미만이 되는 순간 false 

 

마지막에 cum이 0이 아니면 false