프로그래머스 - 괄호 회전하기 ( 자바스크립트 코드 & 풀이 )
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
풀이
우선 변수를 선언하자.
answer : 올바른 괄호 문자열이 되게 하는 회전 수 x의 개수
p : 회전 수 (문제대로 변수명을 "x"로 선언해도 좋을 것 같다. 나는 문자열의 몇번째 포인트의 글자를 맨 앞글자로 두는지를 중점으로 변수명을 선언했다.)
let answer = 0, p = 0;
이제 회전을 해보자. while문으로 회전을 해볼 것이다. 문자열의 길이 - 1 만큼 회전할 것이므로 while문 조건은 다음과 같다.
while(p < s.length)
스택을 이용해서 각 회전에 대한 문자열을 담아보자. 이 때, 열린 괄호가 자기 짝에 맞는 닫힌 괄호를 만나면 stack에서 pop해주려 한다.
그 후, 마지막에 stack에 남은 문자열이 있다면 ( stack.length > 0 ) 그 회전 수는 문자열 내의 모든 괄호가 제대로 짝지어지지 않은 것으로 판단한다. 만약 stack에 남은 문자열이 없다면 ( stack.length === 0 ) 그 회전 수는 올바른 괄호 문자열을 만들었으므로 answer + 1 ( answer++ )을 해준다.
이에 대한 코드는 다음과 같다.
while(p < s.length){
let stack = [s[p]];
for(let i = p + 1; i <= p + s.length - 1; i++){
let index = i >= s.length ? i - s.length : i;
let bracket = s[index], last = stack.at(-1);
if((bracket === "]" && last === "[") || (bracket === "}" && last === "{") || (bracket === ")" && last === "(") ) stack.pop();
else stack.push(bracket);
}
if(stack.length === 0) answer++;
p++;
}
위의 설명대로 stack이란 변수를 선언한다. stack의 초기값은 첫번째 문자를 담고 있다. for문을 돌면서 해당 인덱스의 바로 전 인덱스에 위치한 문자가 해당 인덱스의 문자와 짝이 맞는 괄호인지 확인하기 위해서는 배열에 비교 가능한 문자가 담겨있어야 하기 때문이다.
let stack = [s[p]];
for문을 살펴보자.
bracket: 해당 인덱스의 문자
last: stack에 가장 최근에 담긴 문자
for(let i = p + 1; i <= p + s.length - 1; i++){
let index = i >= s.length ? i - s.length : i;
let bracket = s[index], last = stack.at(-1);
if((bracket === "]" && last === "[") || (bracket === "}" && last === "{") || (bracket === ")" && last === "(") ) stack.pop();
else stack.push(bracket);
}
각 인덱스에 해당하는 문자와 stack의 마지막 문자를 비교해 짝이 맞는 괄호라면 stack에서 마지막 문자를 지우고 ( stack.pop() ) 아니라면 stack에 해당 인덱스의 문자를 추가한다 stack.push(해당 인덱스의 문자).
이제 answer을 반환해주면 끝이다.
return answer;
전체 코드
function solution(s) {
let answer = 0, p = 0;
while(p < s.length){
let stack = [s[p]];
for(let i = p + 1; i <= p + s.length - 1; i++){
let index = i >= s.length ? i - s.length : i;
let bracket = s[index], last = stack.at(-1);
if((bracket === "]" && last === "[") || (bracket === "}" && last === "{") || (bracket === ")" && last === "(") ) stack.pop();
else stack.push(bracket);
}
if(stack.length === 0) answer++;
p++;
}
return answer;
}