https://school.programmers.co.kr/learn/courses/30/lessons/76502
1. 문제에 대한 이해
- 우리가 풀어야 할 문제는 무엇인가?
- 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return - 주어진 자료는 무엇인가?
- 대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s - 조건은 무엇인가?
- s의 길이는 1 이상 1,000 이하
2. 계획
- 괄호들을 맵핑해둔다.
- 문자열을 쪼개고 순회하면서 스택에 넣는다.
- 스택에 있는 괄호가 맵핑이 된다면 pop한다. 맵핑이 안된다면 false 맵핑이 다 되었다면 true
- true인 결과들만 세어준다.
- 한번 순회했으면 첫번째 문자열을 자르고 맨 뒤에 붙인다.
3. 실행
- 풀이 계획을 실행하고, 각 단계가 올바른지 점검하라.
const solution = (s) => {
const strArr = s.split('');
let result = 0;
for (let i = 0; i < s.length; i++) {
if (compare(strArr)) {
result += 1;
}
strArr.push(strArr.shift());
}
return result;
}
const compare = (strArr) => {
const bracket = { ')': '(', '}': '{', ']': '[' };
const stack = [];
for (let i = 0; i < strArr.length; i++) {
const str = strArr[i]
if (bracket[str] === undefined) {
stack.push(str)
} else {
if (stack[stack.length - 1] !== bracket[str]) {
return false
}
stack.pop()
}
}
if (stack.length) {
return false
}
return true
}
test('', () => {
expect(solution(')')).toEqual(0);
expect(solution('}}}')).toEqual(0);
expect(solution('[)(]')).toEqual(0);
expect(solution('()')).toEqual(1);
expect(solution('(()')).toEqual(0);
expect(solution(')(')).toEqual(1);
expect(solution('([)')).toEqual(0);
expect(solution('([])')).toEqual(1);
expect(solution('[]')).toEqual(1);
expect(solution("{}[]")).toEqual(2);
expect(solution("[](){}")).toEqual(3);
});
'코테연습' 카테고리의 다른 글
166. 124 나라의 숫자 Javascript (0) | 2022.09.22 |
---|---|
165. 튜플 Javascript (1) | 2022.09.21 |
163. H-Index Javascript (0) | 2022.09.20 |
162. 행렬의 곱셈 Javascript (0) | 2022.09.19 |
161. 파괴되지 않은 건물 Javascript (0) | 2022.09.19 |
댓글