728x90
반응형
괄호 회전하기
❓ 문제설명
다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.
- (), [], {} 는 모두 올바른 괄호 문자열입니다.
- 만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열입니다. 예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다.
- 만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다. 예를 들어, {} 와 ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호 문자열입니다.
대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.
🚫 제한조건
s의 길이는 1 이상 1,000 이하입니다.
✔ 입출력 예
s | result |
"[](){}" | 3 |
"}]()[{" | 2 |
"[)(]" | 0 |
"}}}" | 0 |
💡 풀이
function solution(s) {
// 문자열 길이가 홀수 인 경우 불가능
if (s.length % 2 === 1) return 0
// 소.중.대 괄호 짝을 찾는 함수(닫힘 문자일 경우만 확인)
const pair = (c) => {
switch(c) {
case ')':
return '('
case '}':
return '{'
case ']':
return '['
default:
return ''
}
}
// 회전시키면서 확인 -> 문자열 2번 합쳐서 시작 index와 마지막 index만 변경하며 반복
let answer = 0
const queue = s + s
for (let i=0; i < s.length; i++) {
// 첫 시작문자가 닫힘 문자일 경우 다음 문자열로
if (queue.charAt(i) === ')' || queue.charAt(i) === '}' || queue.charAt(i) === ']') continue
// 일반적인 괄호문자 체크 반복문
const stack = []
for (let j=i; j < i + s.length; j++) {
const q = queue.charAt(j)
if (stack.length <= 0) {
stack.push(q)
} else {
if ((q === ')' || q === '}' || q === ']') && pair(q) === stack[stack.length - 1]) {
stack.pop()
} else {
stack.push(q)
}
}
}
if (stack.length <= 0) answer++
}
return answer
}
📝 해설
원형배열 문제와 마찬가지로 입력받은 문자열을 2번 반복한 문자열을 문자열의 길이와 동일한 부분문자열을 반복하여 확인하며 조건에 맞는 경우를 모두 더한 값을 출력하였다.
조건을 확인하는 방법은 현재 확인 중인 문자열을 문자단위로 확인하며 직전 문자와 올바른 괄호 문자열이라면 stack에서 빼고 그 외의 경우 stack 에 쌓고 마지막에 stack 이 비어있다면 올바른 괄호 이므로 answer 에 1을 더해서 마지막에 answer를 출력하였다.
📚 참고자료
- https://kimby.tistory.com/48 (Array 메소드)
728x90
반응형