소괄호,중괄호,대괄호로 이루어진 문자열을 받아 모든 괄호의 짝이 맞는지의 여부를 리턴
([), 열린만큼만 닫혀야(]) 합니다.| str | result |
|---|---|
| '[[[{{{((()))}}}]]]' | true |
| '{}' | true |
| '[(]{)}' | false |
| '[]}{()' | false |
| '(' | false |
| ')(' | false |
프로그래머스의 올바른 괄호는 (,)만 이루어진 문자열이기 때문에 간단히 count을 이용해 열린 괄호와 닫힌 괄호를 +,-만 해주면 되었지만 이 문제의 경우{},[],() 3가지 전부 사용하기 때문에 괄호의 종류와 괄호의 짝이 맞는지 파악을 해주어야 한다.
1. {,[,( 이 3가지에 맞는 닫힌 괄호를 지정해준다.
2. 스택을 이용해서 괄호의 짝이 맞는지 또, 닫힌 괄호가 스택에 들어왔을때 닫힌 괄호, 열린 괄호의 짝이 맞는지 또, 종류가 맞는지 파악을 해준다.
3. 반복문을 사용하기 때문에 쉽게 걸러낼 수 있는 케이스는 반복문이 시작되기 전에 걸러내어 시간을 단축시킨다.
// sub 함수
const stackfunc = (stack, right) => {
let left =''
switch(right){
case ')' :
left = '('
break;
case ']' :
left = '['
break;
case '}' :
left = '{'
break;
}
stack.pop()
return (stack[stack.length-1] === left) ? stack.pop() : false
}
// main 함수
const balancedBrackets = function (str) {
let stack = []
if(str[0] === ')' || str[0] === '}' || str[0] === ']' || str.length %2 !== 0) return false
for(let i of str){
stack.push(i)
if( i === ']' || i === '}' || i=== ')' ){
if(stackfunc(stack,i) === false) return false
}
}
return true
};
balancedBrackets 함수에서 닫힌 괄호로 시작하거나, 들어온 문자열의 길이가 짝수가 아닐 경우 올바른 괄호가 아니기 때문에 false를 리턴해준다.stackfunc에 넘겨 준다.stackfunc는 스택에 있는 마지막 요소(닫힌 괄호)와 그 전의 요소(열린 괄호)가 짝이 맞는지 파악을 해주는 함수이다. 먼저 switch문을 통해 마지막 요소right와 맞는 종류의 열린 괄호를 left로 지정해준다.pop()을 통해 마지막 요소(닫힌 괄호)를 제거해주고, 스택에 마지막 요소가 left와 맞는지 확인하고 맞으면 스택에 마지막 값을 제거하고, 아니면 false를 리턴해준다.stackfunc의 값이 false를 리턴해주면 바로false를 리턴해준다.true를 리턴해준다.