🔗 문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/76502#
✏️ 풀이
function solution(s) {
const opening = ['(', '{', '['];
const closing = [')', '}', ']'];
let count = 0;
for (let i = 0; i < s.length; i++) {
const rotated = s.slice(i) + s.slice(0, i);
const stack = [];
let isCorrect = true;
for (let j = 0; j < s.length; j++) {
if (opening.includes(rotated[j])) {
stack.push(rotated[j]);
} else if (opening[closing.findIndex(v => v === rotated[j])] === stack[stack.length - 1]) {
stack.pop();
} else {
isCorrect = false;
break;
}
}
if (isCorrect && !stack.length) {
count++;
}
}
return count;
}
먼저 0부터 s의 길이 - 1까지 순회하면서 회전된 괄호 문자열(rotated)을 만든다. 그리고 이 문자열을 순회하면서 여는 괄호가 나오면 stack에 push하고, 닫는 괄호일 때에는 만약 stack의 top에 있는 여는 괄호와 짝이 맞는지 확인하여 맞는 짝이면 pop하고 그렇지 않으면 순회를 중단하도록 했다.
여는 괄호가 등장한 순서의 역순으로 닫는 괄호도 등장해야지 "올바른 괄호 문자열"이 되기 때문에, 닫는 괄호가 가장 마지막에 등장한 여는 괄호와 짝이 맞아야 한다. 따라서 닫는 괄호와 가장 마지막에 등장한 여는 괄호의 짝이 맞지 않으면 올바른 괄호 문자열이 아니며, 만약 닫는 괄호가 등장할 때마다 stack에 있는 여는 괄호와의 짝이 모두 맞다고 하더라도, stack에 있는 모든 여는 괄호를 pop하지 못하면 이 또한 올바른 괄호 문자열이 아니다. 따라서 회전된 괄호 문자열(rotated)의 순회가 끝나고 나서 stack의 길이가 0일 때에만 count를 증가시키도록 하였다.
⛔ 반례
// 단순히 괄호의 개수만 따져서는 안 됨
입력:
[{]}
출력:
0
'연습장 > 프로그래머스 문제풀이' 카테고리의 다른 글
[프로그래머스 Level 3] N으로 표현 - JavaScript (0) | 2023.01.23 |
---|---|
[프로그래머스 Level 2] 프린터 - JavaScript (0) | 2023.01.23 |
[프로그래머스 Level 2] 행렬의 곱셈 - JavaScript (0) | 2023.01.13 |
[프로그래머스 Level 3] 입국심사 - JavaScript (0) | 2023.01.10 |
[프로그래머스 Level 2] 멀리 뛰기 - JavaScript (0) | 2023.01.06 |