[프로그래머스] 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
}
이렇게 문제를 푸니 모든 테스트에 성공했고 정답을 맞출 수 있었다.
스택 큐 문제는 익숙하지는 않았는데 처음 문제를 보자마자 알아차릴 수 있을 정도로 더 연습을 해봐야겠다.