PS/제코베 JS 100제
제코베 JS 100제 / 53 / 괄호 문자열
KimMinJun
2022. 8. 24. 20:47
괄호 문자열이란 괄호 기호인 '{', '}', '[', ']', '(', ')' 와 같은 것을 말한다. 그중 괄호의 모양이 바르게 구성된 문자열을 바른 문자열, 그렇지 않은 문자열을 바르지 않은 문자열이라 부르도록 하자.
(())와 같은 문자열은 바른 문자열이지만 ()())와 같은 문자열은 바르지 않은 문자열이다.
입력으로 주어진 괄호 문자열이 바른 문자열인지 바르지 않은 문자열인지 "YES"와 "NO"로 구분된 문자열을 출력해보자.
function isValidBracketString(str) {
if (!str.length) return; // 빈 문자열일 경우
let left_bracket = [
["(", 0],
["{", 0],
["[", 0],
];
let right_bracket = [
[")", 0],
["}", 0],
["]", 0],
];
for (const c of str) {
// 괄호가 아닐 경우
if (!"(){}[]".includes(c)) return false;
for (let i = 0; i < left_bracket.length; i++) {
// 닫는 괄호가 여는 괄호보다 먼저 나왔을 경우
if (right_bracket[i][1] > left_bracket[i][1]) return false;
if (left_bracket[i][0] === c) left_bracket[i][1]++;
else if (right_bracket[i][0] === c) right_bracket[i][1]++;
}
}
for (let i = 0; i < left_bracket.length; i++) {
// 괄호 종류에 맞는 쌍의 갯수가 맞을 경우
if (left_bracket[i][1] === right_bracket[i][1]) continue;
else return false;
}
return true;
}
const str = "(){}[]"; // true
/*
"(]" // 같은 종류의 괄호가 아니므로 false
")(" // 닫힌 괄호가 먼저 나왔으므로 false
"())" // 열린 괄호와 닫힌 괄호의 짝이 맞지 않으므로 false
*/
const result = isValidBracketString(str) ? "YES" : "NO";
console.log(result);