[프로그래머스] Level 2 - 올바른 괄호 (JavaScript)

2023.06.01(목)

문제

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

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

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

제한사항

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

입출력 예

s answer
”()()” true
”(())()” true
”)()(“ false
”(()(“ false

입출력 예 설명

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

첫번째 풀이

처음 생각했을 때 첫번째 시작 문자열이 ` ( 여는 괄호로 시작하고 끝나는 문자열이 )` 닫는 문자열이면 해결되는거 아닌가? 라는 생각으로 너무 안일하게 문제를 풀었었다.

function solution(s){
    let firstStr = s.slice(0,1)
    let lastStr = s.slice(-1)
    if(firstStr === ')' || lastStr === '(') return false
        return true
}

이렇게 문제를 풀고 테스트에서도 통과가 되는 것을 보고 굉장히 쉽다고 생각했었다. 하지만 제출하기 버튼을 눌렀을 때 나의 풀이가 잘못되었다는 것을 확인했다.

효율성테스트
테스트 1 〉통과 (0.06ms, 33.9MB)
테스트 2 〉실패 (0.05ms, 33.9MB)
정확성 테스트
..
테스트 4 〉	통과 (0.04ms, 33.4MB)
테스트 5 〉	실패 (0.03ms, 33.6MB)
테스트 6 〉	통과 (0.03ms, 33.5MB)
...

뭐가 문제인지 계속 생각을 해봤는데 예를 들어 s에 (( ) 이런 괄호가 오거나 ` ()))) 이런 괄호가 들어와도 내가 만든 알고리즘에서는 TRUE`가 출력되는 것을 알게 되었다.

문제를 다시 들여다 보니 Stack 을 사용하면 쉽게 해결할 수 있을 것 같았다

두번째 풀이

stack처럼 사용할 변수를 하나 만들어주고 순회하면서 ( 여는 괄호일 때 1을 카운트하고 )닫는 괄호 일 때 -1을 해주어서 0을 만들어주면 true 0보다 작다면 false를 출력하게 만들어주었다.

function solution(s){
   let stackCount = 0 
   for(let i = 0; i < s.length; i++){
       stackCount += s[i] === '(' ? 1 : -1
       if(stackCount < 0) return false
   }
    return stackCount === 0 ? true : false
}

이렇게 문제를 푸니 모든 테스트에 성공했고 정답을 맞출 수 있었다.

스택 큐 문제는 익숙하지는 않았는데 처음 문제를 보자마자 알아차릴 수 있을 정도로 더 연습을 해봐야겠다.