[프로그래머스] 76502. 괄호 회전하기
문제 링크
풀이 과정
스택에 문자열 substring()
을 사용해 풀었습니다.
let tmp = s.substring(i) + s.substring(0, i);
먼저 substring()
을 통해 주어진 문자열을 한 칸씩 회전시킵니다.
for (let j = 0; j < tmp.length; j++) {
let ch = tmp[j];
if (ch === "(" || ch === "{" || ch === "[") {
stack.push(ch);
} else if (ch === ")") {
if (stack.length === 0) {
wrong = true;
break;
}
if (stack.length && stack[stack.length - 1] === "(") stack.pop();
} else if (ch === "}") {
if (stack.length === 0) {
wrong = true;
break;
}
if (stack.length && stack[stack.length - 1] === "{") stack.pop();
} else if (ch === "]") {
if (stack.length === 0) {
wrong = true;
break;
}
if (stack.length && stack[stack.length - 1] === "[") stack.pop();
}
}
이후 위와 같이 올바른 괄호쌍인지를 확인하는 과정을 거칩니다.
- 여는 괄호(
(
,{
,[
)면 스택에 넣습니다. - 닫는 괄호인 경우 다음과 같이 작동합니다.
- 스택이 비어있다면, 올바른 괄호쌍이 될 수 없으므로 중간에 그만둡니다.
- 스택에 요소가 들어있고, 스택
top
이 매칭되는 여는 괄호일 경우 스택에서 제거합니다.
if (!wrong && !stack.length) answer++;
올바른 괄호쌍이며(!wrong
), 스택에 요소가 들어있다면(!stack.length
) 카운트 해줍니다.
코드
function solution(s) {
let answer = 0;
for (let i = 0; i < s.length; i++) {
let tmp = s.substring(i) + s.substring(0, i);
let stack = [];
let wrong = false;
for (let j = 0; j < tmp.length; j++) {
let ch = tmp[j];
if (ch === "(" || ch === "{" || ch === "[") {
stack.push(ch);
} else if (ch === ")") {
if (stack.length === 0) {
wrong = true;
break;
}
if (stack.length && stack[stack.length - 1] === "(") stack.pop();
} else if (ch === "}") {
if (stack.length === 0) {
wrong = true;
break;
}
if (stack.length && stack[stack.length - 1] === "{") stack.pop();
} else if (ch === "]") {
if (stack.length === 0) {
wrong = true;
break;
}
if (stack.length && stack[stack.length - 1] === "[") stack.pop();
}
}
if (!wrong && !stack.length) answer++;
}
return answer;
}
console.log(solution("[](){}"));
console.log(solution("}]()[{"));
console.log(solution("[)(]"));
console.log(solution("}}}"));
댓글남기기