다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.
s의 길이는 1 이상 1,000 이하입니다.
s | result |
---|---|
"[](){}" | 3 |
"}]()[{" | 2 |
"[)(]" | 0 |
"}}}" | 0 |
다음 표는 "{}" 를 회전시킨 모습을 나타낸 것입니다.
x | s를 왼쪽으로 x칸만큼 회전 | 올바른 괄호 문자열? |
---|---|---|
0 | "[](){}" | O |
1 | "](){}[" | X |
2 | "(){}[]" | O |
3 | "){}[](" | X |
4 | "{}[]()" | O |
5 | "}[](){" | X |
올바른 괄호 문자열이 되는 x가 3개이므로, 3을 return 해야 합니다.
다음 표는 "}]()[{" 를 회전시킨 모습을 나타낸 것입니다.
x | s를 왼쪽으로 x칸만큼 회전 | 올바른 괄호 문자열? |
---|---|---|
0 | "}]()[{" | X |
1 | "]()[{}" | X |
2 | "()[{}]" | O |
3 | ")[{}](" | X |
4 | "[{}]()" | O |
5 | "{}]()[" | X |
올바른 괄호 문자열이 되는 x가 2개이므로, 2를 return 해야 합니다.
s를 어떻게 회전하더라도 올바른 괄호 문자열을 만들 수 없으므로, 0을 return 해야 합니다.
s를 어떻게 회전하더라도 올바른 괄호 문자열을 만들 수 없으므로, 0을 return 해야 합니다.
function solution(s) {
let answer = 0;
// 홀수면 바로 0 리턴
if (s.length % 2 == !0) return 0;
s = s.split("");
for (let i = 0; i < s.length; i++) {
const stack = [];
// 첫 번쨰 요소를 빼서 끝에 넣어줌
let start = s.shift();
s.push(start);
// 배열 끝에 붙을 start가 {, [, ( 면 continue로 다음으로 넘김
if (start === "{" || start === "[" || start === "(") continue;
// stack 배열에 s의 첫 번째 요소를 넣어줌
stack.push(s[0]);
for (let j = 1; j < s.length; j++) {
let last = stack[stack.length - 1];
// {,[,(이 },],)를 만나면 pop
last === "{" && s[j] === "}"
? stack.pop()
: last === "[" && s[j] === "]"
? stack.pop()
: last === "(" && s[j] === ")"
? stack.pop()
: stack.push(s[j]);
}
// stack의 길이가 0이면 answer +1
if (stack.length === 0) answer++;
}
return answer;
}
shift를 사용해서 시간이 오래걸렸다. 다른 사람 풀이를 보니까 s를 배열로 변환하지 않고 풀었던데 앞으론 그런식으로 풀어야겠다
풀이 방식이 유사했던 풀이
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;
}
mapping을 사용한 풀이
function solution(s) {
if(s.length % 2 === 1) return 0;
let answer = 0;
const mapping = { "}" : "{", "]" : "[", ")" : "("};
for(let i = 0; i < s.length; i++) {
const stack = [];
const rotate = s.slice(i) + s.slice(0, i);
let flag = true;
for(let j = 0; j < s.length; j++) {
if(rotate[j] === "[" || rotate[j] === "(" || rotate[j] === "{" )
stack.push(rotate[j]);
else {
const last = stack.pop();
if(last !== mapping[rotate[j]]) {
flag = false
break;
}
}
}
if(flag) answer++;
}
return answer;
}