괄호 문자열이란 괄호 기호인 '{', '}', '[', ']', '(', ')' 와 같은 것을 말한다. 그중 괄호의 모양이 바르게 구성된 문자열을 바른 문자열, 그렇지 않은 문자열을 바르지 않은 문자열이라 부르도록 하자.
(())와 같은 문자열은 바른 문자열이지만 ()())와 같은 문자열은 바르지 않은 문자열이다.
입력으로 주어진 괄호 문자열이 바른 문자열인지 바르지 않은 문자열인지 "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);
'PS > 제코베 JS 100제' 카테고리의 다른 글
제코베 JS 100제 / 55 / 하노이의 탑 (0) | 2022.08.26 |
---|---|
제코베 JS 100제 / 54 / 연속되는 수 (0) | 2022.08.24 |
제코베 JS 100제 / 52 / quick sort (0) | 2022.08.24 |
제코베 JS 100제 / 51 / merge sort를 만들어보자 (0) | 2022.08.24 |