주어진 문자열을 회전하면서, 올바른 문자열의 개수를 세서 반환
// 1. 회전 구현
회전은 i for문 맨 마지막 s.push(s.shift());로 구현.
// 2. 괄호 짝 판별
회전하기 전에 올바른 괄호인지 판별한다.
tmp의 길이가 0이면 무조건 넣고, 그렇지 않다면
k for문을 순회하면서 짝이 맞는지 판별한 후, 짝이 맞다면 tmp에서 지워준다. 짝이 맞다면 바로 for문 나올 수 있게 break를 적절히 걸어준 뒤,
// 3. 올바른 괄호 판별
마지막에 짝이 안 맞을 경우에도 tmp에 넣어준다.
결과적으로 j for문을 전부 순회한 뒤, tmp에 하나라도 남아 있지 않아야 올바른 괄호이므로 ==0일 때 answer++;
function solution(s) {
s=s.split('');
let answer=0;
const rs = [['(', ')'], ['[', ']'], ['{', '}']];
for (let i=0; i<s.length; i++) {
let tmp = [];
for (let j=0; j<s.length; j++) {
if (tmp.length==0) { tmp.push(s[j]); }
else {
let jud=false;
for (let k=0; k<rs.length; k++) {
if (tmp[tmp.length-1] == rs[k][0] && s[j] == rs[k][1]) {
tmp.pop();
jud=true;
break;
}
if (jud==true) break;
}
if (jud==false) tmp.push(s[j]);
}
}
if (tmp.length == 0) answer++;
s.push(s.shift());
}
return answer;
}
console.log(solution("[](){}"))
회전을 const temp = i === 0 ? s : s.slice(i) + s.slice(0, i);
로 구현한 풀이. 삼항 연산자를 활용하니 확실히 풀이가 짧다..!
function solution(s) {
let answer = 0;
for (let i = 0; i < s.length; i++) {
const arr = [];
const temp = i === 0 ? s : s.slice(i) + s.slice(0, i);
for (let j = 0; j < temp.length; j++) {
if (arr[arr.length - 1] === '(' && temp[j] === ')') arr.pop();
else if (arr[arr.length - 1] === '[' && temp[j] === ']') arr.pop();
else if (arr[arr.length - 1] === '{' && temp[j] === '}') arr.pop();
else arr.push(temp[j]);
}
if (arr.length === 0) answer++;
}
return answer;
}
replace로 다 없어져도 그 최대값이 s.length/2 이므로
function solution(s) {
var answer = 0;
for (let i = 0; i < s.length; i++) {
s = s.slice(1, s.length)+s[0];
let string = s;
for (let j = 0; j < Math.floor(s.length/2); j++) {
string = string.replace(/([\[][\]]|[\{][\}]|[\(][\)])+/g, "");
if (!string) break;
}
answer += !string ? 1 : 0;
}
return answer;
}