FE PARADISE

프로그래머스 - 괄호 회전하기 ( 자바스크립트 코드 & 풀이 ) 본문

자료구조 & 알고리즘

프로그래머스 - 괄호 회전하기 ( 자바스크립트 코드 & 풀이 )

PARADISE247 2025. 1. 12. 12:32
반응형

「문제 하나 풀면서 현란한 퍼포먼스 보여주기」 를 시전하는 나

 

프로그래머스

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;
}

 

반응형