(, ), {, }, [, ]로 이루어진 문자열 s
각 괄호가 갯수, 순서에 맞게 열리고 닫혀 있는지 확인
맞다면 true 아니라면 false 반환
/**
* @param {string} s
* @return {boolean}
*/
var isValid = function(s) {
let brackets = {
')' : '(',
'}' : '{',
']' : '['
}
if (s.length === 1 && brackets[s[0]])
return false;
let stack = [];
for (let i = 0; i < s.length; i++) {
let open = brackets[s[i]];
if (!open)
stack.push(s[i]);
else if (open !== stack.pop())
return false;
}
return stack.length === 0;
};
각 괄호 정보를 객체에 닫힘-열림 형태로 저장
괄호가 하나 들어있거나 첫 문자가 닫는 괄호라면 바로 false 반환
이제 문자열을 돌면서 여는 괄호면 (brackets에 없는 키) stack에 저장
닫는 괄호면 stack의 마지막 요소를 꺼내와서 비교
해당 괄호를 키로 하는 값과 꺼내온 값이 같다면 넘어가고
아니라면 잘못된 문자열이므로 바로 false 반환
순회가 끝나고 stack에 남은 괄호가 있다면 (여는 괄호 수 > 닫는 괄호 수)
false 반환 아니라면 true 반환
Accepted
Runtime 54ms (Beats 75.37%)
Memory 50.41MB (Beats 36.24%)
분명 easy 문제이고, 읽었을 때 아 쉽다라고 생각했는데 꽤 시간이 걸렸다... stack 문제라는 걸 까먹고 문자열 확인으로만 해결하려다가 괄호 세트를 찾으면 지워야 하는데 그러면 반복을 다시 어떻게 하지? 라는 고민만 계속했다. 그러다가 stack을 활용해야 되는거 아닌가? 생각이 들자마자 쭈르륵 해결했다는 이야기.