다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.
(), [], {}
는 모두 올바른 괄호 문자열입니다.
만약A
가 올바른 괄호 문자열이라면,(A)
,[A]
,{A}
도 올바른 괄호 문자열입니다. 예를 들어,[]
가 올바른 괄호 문자열이므로,([])
도 올바른 괄호 문자열입니다.
만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다. 예를 들어,{}
와([])
가 올바른 괄호 문자열이므로,{}([])
도 올바른 괄호 문자열입니다.
대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열s
가 매개변수로 주어집니다. 이s
를 왼쪽으로x (0 ≤ x < (s의 길이))
칸만큼 회전시켰을 때s
가 올바른 괄호 문자열이 되게 하는x
의 개수를 return 하도록 solution 함수를 완성해주세요.
s | result |
---|---|
"{}" | 3 |
"}]()[{" | 2 |
"[)(]" | 0 |
"}}}" | 0 |
탐색하는 함수를 calculate함수로 빼서 넣어주었다. calculate함수는 주어진 배열이 조건을 만족하는지를 판별하고 조건을 만족하면 1을 아니면 0을 리턴해주었다. 이 곳에서도 열어주는 괄호는 push해주고 짝이 맞으면 바로 pop을 이용해 빼주었다.
const calculate = (arr, number) =>{
const stack = []
for(let i = 0 ; i < arr.length ; ++i){
if(arr[i] === "(" || arr[i] === "[" || arr[i] === "{" ){
stack.push(arr[i])
}else if(arr[i] === ")" && stack[stack.length-1] === "("){
stack.pop()
}else if (arr[i] === "]" && stack[stack.length-1] === "["){
stack.pop()
}else if (arr[i] === "}" && stack[stack.length-1] === "{"){
stack.pop()
}
}
return stack.length === 0 ? 1 : 0
}
function solution(s) {
var answer = 0;
if(s.length % 2 === 1) return answer = 0
const newArr = s.split("")
for(let i = 0 ; i < newArr.length ; ++i){
const result = calculate(newArr,i)
answer += result
const string = newArr.shift()
newArr.push(string)
}
return answer;
}
이렇게 문제를 해결했지만 하나하나 판별해주다보니 코드가 길어져 비효율적인 부분이 있다고 생각은 했다. 하지만 해결방안이 생각나지 않았다.
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;
}
객체형식으로 mapping해서 풀어준게 인상적이였다. 또한 회전할때마다 만들어주는 문자를 slice메서드를 이용해주었다.