[프로그래머스 | Javascript] - 괄호 회전하기

임홍원·2023년 10월 26일
post-thumbnail

프로그래머스 | 괄호 회전하기

📍문제 설명📍
다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.
(), [], {} 는 모두 올바른 괄호 문자열입니다.
만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열입니다. 예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다.
만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다. 예를 들어, {} 와 ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호 문자열입니다.
대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.


❗실패한 풀이❗

function solution(s) {
    var answer = 0;
    let str = s;
    
    for(let i = 0; i < s.length; i++) {
        let first = str.slice(0,1);
        let newStr = (str + first).slice(1);
        
        let bucket = str.split("");
        for(let i = 0; i < bucket.length; i++) {
            if(bucket[i] === ')' && bucket[i - 1] === '(') {
                bucket.splice(i - 1, i + 1);
                i = 0;
            }
            
            if(bucket[i] === '}' && bucket[i - 1] === '{') {
                bucket.splice(i - 1, i + 1);
                i = 0;
            }
            
            if(bucket[i] === ']' && bucket[i - 1] === '[') {
                bucket.splice(i - 1, i + 1);
                i = 0;
            }
            
            if(bucket.length === 0) answer++;
        }
        
        str = newStr
    }
    
    return answer;
}

💯성공한 풀이💯

function solution(s) {
    var answer = 0;
    let bucket = [];
    
    if(s.length % 2 === 1) return 0;
    
    for(let i = 0; i < s.length; i++) {
        let str = s.slice(i) + s.slice(0, i);
        let rightWord = true;
        for(let word of str) {
            if(word === '(' || word === '{' || word ==='[') {
                bucket.push(word);
            }else {
                let w = bucket.pop();
                if(word === ')' && w === '(') continue;
                if(word === '}' && w === '{') continue;
                if(word === ']' && w === '[') continue;
                rightWord = false;
                break;
            }
        }
        if(rightWord) answer++;
    }
    return answer;
}

처음 방식으로 했던 풀이에서는 bucket만 비교하여 계속 틀린 값이 나왔었다.
아마 아침이라 그냥 정신없이 풀었었다.

두번째 방식으로 다시 풀었을때에는 스택에 왼쪽 괄호이면 하나씩 넣고, 아닐경우 오른쪽 괄호를 만났을때, pop한 값이 왼쪽 괄호와 맞는 괄호일 경우 continue를하여 계속 진행한다.
올바른 괄호 문자열일 경우 answer 가 증가한다.

문자열의 길이가 홀 수 이면 무슨짓을 하더라도 올바른 문자열이 될 수 없으므로 예외처리 해주었다.

profile
Frontend Developer

0개의 댓글