s는 여러 괄호들로 이루어진 String 인자입니다.
s가 유효한 표현인지 아닌지 true/false로 반환해주세요.
종류는 '(', ')', '[', ']', '{', '}' 으로 총 6개 있습니다.
한 번 괄호를 시작했으면, 같은 괄호로 끝내야 합니다. 괄호 순서도 맞아야 합니다.
예시는 아래와 같습니다
s = "()"
return true
s = "()[]{}"
return true
s = "(]"
return false
s = "([)]"
return false
s = "{[]}"
return true
function isValid(str) {
let obj = {'(': ')', '[': ']', '{': '}'}; // (1)
let sArr = s.split(''); // (2)
let stack = []; // (3)
for (let i = 0; i < sArr.length; i++) {
if (stack.length !== 0 && sArr[i] === obj[stack[stack.length-1]]) { // (4)
stack.pop(); // (6)
}
else {
stack.push(sArr[i]); // (5)
}
}
return stack.length === 0; // (7)
}
// (1) 객체를 선언해 key값은 여는 괄호, value는 짝이 되는 닫는 괄호를 할당해준다
// (2) 변수로 들어오는 값을 하나씩 잘라내 배열로 반환한다
// ex) sArr = ['(', ')']
// (3) stack알고리즘을 이용하기위해 빈 배열 하나를 생성해준다
// (4) 반복문을 돌려준다, 만약 stack의 길이가 0이라면 pass
// (5) stack에 i번째 sArr의 값을 push해준다.
// ex) stack = ['(']
// (6) 이번엔 stack의 길이가 0이 아니기 때문에 조건문의 다음 단계로 넘어가
// ex) stack = ['('] sArr = ['(', ')']
// sArr의 i번째 인덱스 값이 stack의 길이-1의 인덱스 값을 가진 obj key의 value와 같다면
// ex) obj['('] = ')' sArr[i] = ')'
// stack의 마지막 인덱스 값을 하나 없앤다
// ex) stack = []
// (7) 스택의 길이가 0이라면 true, 아니라면 false를 반환해준다
// 0이라는 의미는 짝이 맞다면 stack배열안의 값이 다 사라져 빈 배열이 되기 때문이다
이번 풀이는 Stack 알고리즘 이해가 필요하다
스택 알고리즘은 Last In First Out. 즉, 하나를 쌓으면 처음 쌓았던 요소가 빠져나간다.
반대로 Queue 알고리즘은 쌓인 순서대로 빠져나간다.
이를 활용해 문제를 풀 수 있다.