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

Mincho·2023년 5월 30일
0
post-thumbnail

🔴 괄호 회전하기

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

👉입출력 예

sresult
"{}"3
"}]()[{"2
"[)(]"0
"}}}"0



😶나의 풀이


  문자열의 길이가 홀수면은 괄호의 짝이 안맞기 때문에 바로 0을 return해주었다.문자열을 배열로 만들어 놓고 for문안에서 `큐의 형태`로 앞에 문자열을 빼서 그대로 뒤에 push하면서 탐색하였다.

  탐색하는 함수를 calculate함수로 빼서 넣어주었다. calculate함수는 주어진 배열이 조건을 만족하는지를 판별하고 조건을 만족하면 1을 아니면 0을 리턴해주었다. 이 곳에서도 열어주는 괄호는 push해주고 짝이 맞으면 바로 pop을 이용해 빼주었다.


const calculate = (arr, number) =>{
    const stack = []
        for(let i = 0 ; i < arr.length ; ++i){
           
            if(arr[i] === "(" || arr[i] === "[" || arr[i] === "{" ){
                stack.push(arr[i])       
        }else if(arr[i] === ")" && stack[stack.length-1] === "("){
            stack.pop()
        }else if (arr[i] === "]" && stack[stack.length-1] === "["){
            stack.pop()
        }else if (arr[i] === "}" && stack[stack.length-1] === "{"){
            stack.pop()
        }
            
    }
    return stack.length === 0 ? 1 : 0
}

function solution(s) {
    var answer = 0;
    if(s.length % 2 === 1) return answer = 0
    
    const newArr = s.split("")
    
 for(let i = 0 ; i < newArr.length ; ++i){
    
    const result = calculate(newArr,i) 
    answer += result
    const string = newArr.shift()
    newArr.push(string)

 }
    return answer;
}

  이렇게 문제를 해결했지만 하나하나 판별해주다보니 코드가 길어져 비효율적인 부분이 있다고 생각은 했다. 하지만 해결방안이 생각나지 않았다.


😉다른분들의 풀이

function solution(s) {
    if(s.length % 2 === 1) return 0;

    let answer = 0;
    const mapping = { "}" : "{", "]" : "[", ")" : "("};

    for(let i = 0; i < s.length; i++) {
        const stack = [];
        const rotate = s.slice(i) + s.slice(0, i);
        let flag = true;

        for(let j = 0; j < s.length; j++) {
            if(rotate[j] === "[" || rotate[j] === "(" || rotate[j] === "{" )
                stack.push(rotate[j]);
            else {
                const last = stack.pop();
                if(last !== mapping[rotate[j]]) {
                    flag = false
                    break;
                }
            }
        }

        if(flag) answer++;
    }

    return answer;
}

객체형식으로 mapping해서 풀어준게 인상적이였다. 또한 회전할때마다 만들어주는 문자를 slice메서드를 이용해주었다.

👍올바른 피드백은 언제든지 환영입니다~!

profile
사진찍는 개발자.

0개의 댓글