안녕하세요
프로그래머스 JS [괄호 회전하기] 본문
- 괄호 회전하기
문제 설명
제한사항
입출력 예sresult
다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.
- (), [], {} 는 모두 올바른 괄호 문자열입니다.
- 만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열입니다. 예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다.
- 만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다. 예를 들어, {} 와 ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호 문자열입니다.
대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.
제한사항
- s의 길이는 1 이상 1,000 이하입니다.
입출력 예sresult
"[](){}" | 3 |
"}]()[{" | 2 |
"[)(]" | 0 |
"}}}" | 0 |
문제 풀이 괄호 쌍이 올바른지 확인합니다. const checkBrackets = () => {
for (let i = 0; i < s.length; i++) {
// 여는 괄호 [,(,{ 중 하나라면 stack에 추가합니다.
// 여는 괄호가 추가된 스택상태 ex) [ "[", "{", "(" ]
if (Object.values(bracket).includes(s[i])) {
stack.push(s[i]);
continue;
}
// 여는 괄호는 continue로 넘어가므로 여기서는 닫는 괄호 중 하나가 옵니다.
// stack의 길이가 0이라면 닫는 괄호가 먼저 온 것이므로 괄호 쌍이 맞지 않게 되어 더 이상 확인할 필요 없이 종료합니다.
// 스택상태 ex) [ "]" ] => 종료
if (stack.length === 0) {
stack.push(s[i]);
return;
}
// stack의 마지막 괄호와 닫는 괄호가 쌍을 이루면 마지막 괄호를 stack에서 제거합니다.
// 스택상태 ex) [ "[", "{", "(" ] => ")" 가 들어와서 쌍이 맞음 "("를 제거 => [ "[", "{" ]
if (stack[[stack.length - 1]] === bracket[s[i]]) {
stack.pop();
}
}
};
괄호가 비어있다면 올바른 쌍으로 이루어진 것이므로 answer에 1을 더합니다. const setAnswer = () => {
if (stack.length === 0) {
answer++;
}
};
문제의 조건대로 왼쪽으로 한 칸 밀어줍니다. 첫번째 문자를 마지막으로 보낸 형태를 만들면 됩니다. const rotateS = () => {
const first = s[0];
let slicedS = s.slice(1);
slicedS += first;
return slicedS;
};
왼쪽으로 한 칸 씩 문자열의 길이만큼 밀어주며 모든 경우를 실행한 결과를 반환합니다. for (let i = 0; i < s.length; i++) {
checkBrackets();
setAnswer();
s = rotateS();
stack = [];
}
return answer;
|
function solution(s) { let stack = [];
let answer = 0;
const bracket = {
"]": "[",
")": "(",
"}": "{",
};
const checkBrackets = () => {
for (let i = 0; i < s.length; i++) {
if (Object.values(bracket).includes(s[i])) {
stack.push(s[i]);
continue;
}
if (stack.length === 0) {
stack.push(s[i]);
return;
}
if (stack[[stack.length - 1]] === bracket[s[i]]) {
stack.pop();
}
}
};
const setAnswer = () => {
if (stack.length === 0) {
answer++;
}
};
const rotateS = () => {
const first = s[0];
let slicedS = s.slice(1);
slicedS += first;
return slicedS;
};
for (let i = 0; i < s.length; i++) {
checkBrackets();
setAnswer();
s = rotateS();
stack = [];
}
console.log(answer);
return answer;
}
solution("[](){}");
|
'프로그래머스 > Lv.2' 카테고리의 다른 글
프로그래머스 JS [위장]⭐⭐ 조합/다항식계수의 합(1+a)(1+b)(1+c) (0) | 2022.11.28 |
---|---|
프로그래머스 JS [튜플] (0) | 2022.11.28 |
프로그래머스 JS [행렬의 곱셈] (0) | 2022.11.27 |
프로그래머스 JS [H-Index] (0) | 2022.11.26 |
프로그래머스 JS [점프와 순간 이동] (0) | 2022.11.26 |