코딩테스트
[JS] 괄호 회전하기
미안하다 강림이 좀 늦었다
2023. 12. 5. 22:06
난이도: Lv.2
문제: https://school.programmers.co.kr/learn/courses/30/lessons/76502
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
알고리즘
1. 모든 종류의 여는 괄호는 stack에 push한다.
2. 닫는 괄호가 나오면 stack의 맨 윗 원소의 괄호 종류와 일치하는지 확인한다. 종류가 일치하지 않으면 올바른 괄호 문자열이 아니기 때문에 false를 반환하고, 종류가 일치하다면 stack 맨 윗 원소를 pop한다. 예를 들자면 stack에 "[({"가 있다. 이번 괄호가 ')'라면 틀린 괄호 문자열이 된다는 뜻이다.
3. 끝까지 진행했을 때 stack에 원소가 남아있다면 괄호 쌍의 개수가 맞지 않으므로 올바른 괄호 문자열이 아니다. stack이 비어있다면 올바른 괄호 문자열이므로 true를 반환한다.
코드
function solution(s) {
var answer = 0;
if (isValid(s)) { answer++; }
for (let x = 0; x < s.length - 1; x++) {
s = s.substring(1, s.length) + s.substring(0, 1);
if (isValid(s)) { answer++; }
}
return answer;
}
const isValid = (s) => {
const stack = [];
for (let bracket of s) {
switch (bracket) {
case ')':
if (stack[stack.length - 1] === '(') { stack.pop(); break; }
else { return false; }
case '}':
if (stack[stack.length - 1] === '{') { stack.pop(); break; }
else { return false; }
case ']':
if (stack[stack.length - 1] === '[') { stack.pop(); break; }
else { return false; }
default:
stack.push(bracket);
}
}
if (stack.length) { return false; }
return true;
}
주저리
올바른 괄호 문제랑 비슷한 문제인데 처음에 테스트케이스 마지막 문제만 통과 못했었다. 생각해보니까 "[{(})]" 이런 문자열을 틀렸다고 거르지 못해서 푸는데 당황 좀 했다.