본문 바로가기
코딩테스트

알고리즘 84-괄호 회전하기

by GREEN나무 2025. 2. 28.
728x90

URL : https://school.programmers.co.kr/learn/courses/30/lessons/76502

JS

문제

더보기

다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.

(), [], {} 는 모두 올바른 괄호 문자열입니다.

만약 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

 

입출력 예 설명

입출력 예 #1

다음 표는 "[](){}" 를 회전시킨 모습을 나타낸 것입니다.

x s를 왼쪽으로 x칸만큼 회전 올바른 괄호 문자열?
0 "[](){}" O
1 "](){}[" X
2 "(){}[]" O
3 "){}[](" X
4 "{}[]()" O
5 "}[](){" X

올바른 괄호 문자열이 되는 x3개이므로, 3return 해야 합니다.

입출력 예 #2

다음 표는 "}]()[{" 를 회전시킨 모습을 나타낸 것입니다.

x s를 왼쪽으로 x칸만큼 회전 올바른 괄호 문자열?
0 "}]()[{" X
1 "]()[{}" X
2 "()[{}]" O
3 ")[{}](" X
4 "[{}]()" O
5 "{}]()[" X

올바른 괄호 문자열이 되는 x2개이므로, 2return 해야 합니다.

입출력 예 #3

s를 어떻게 회전하더라도 올바른 괄호 문자열을 만들 수 없으므로, 0return 해야 합니다.

입출력 예 #4

s를 어떻게 회전하더라도 올바른 괄호 문자열을 만들 수 없으므로, 0return 해야 합니다.

 


계획

S의 맨 앞문자를 맨 뒤로 이동시키면서 한바퀴를 도는 동안 '올바른 괄호 문자'가 되는 회수를 반환한다.

'올바른 괄호 문자'는 문자열에서 (), {}, [] 로 감싸인 문자를 빼는 것을 반복했을 때 아무것도 남지 않는 경우 임니다(너무 많이 돌리는데?)

 


참고, 풀이

 


function solution(s) {
    let count = 0;
    const isValid = (str) => {
        const stack = [];
        const pairs = { ')': '(', ']': '[', '}': '{' };
        
        for (let char of str) {
            if (char === '(' || char === '[' || char === '{') {
                stack.push(char);
            } else {
                if (stack.length === 0 || stack.pop() !== pairs[char]) {
                    return false;
                }
            }
        }
        return stack.length === 0;
    };
    
    for (let i = 0; i < s.length; i++) {
        if (isValid(s)) count++;
        s = s.slice(1) + s[0]; // 왼쪽으로 한 칸 회전
    }
    
    return count;
}

코드 간략화하기

function solution(s) {
    const isValid = (str) => {
        const stack = [];
        for (let c of str) {
            if ('({['.includes(c)) stack.push(c);
            else if (stack.pop() !== {')':'(', ']':'[', '}':'{'}[c]) return false;
        }
        return !stack.length;
    };
    
    let count = 0;
    for (let i = 0; i < s.length; i++) {
        if (isValid(s)) count++;
        s = s.slice(1) + s[0];
    }
    return count;
}

다른사람 답

function solution(s) {
    var answer = 0;

    for (let i = 0; i < s.length; i++) {
        s = s.slice(1, s.length)+s[0];

        let string = s;

        for (let j = 0; j < Math.floor(s.length/2); j++) {
            string = string.replace(/([\[][\]]|[\{][\}]|[\(][\)])+/g, "");

            if (!string) break;
        }

        answer += !string ? 1 : 0;
    }

    return answer;
}

 


참고