상세 컨텐츠

본문 제목

JavaScript - balancedBrackets

Programming Language/JavaScript

by Yongari 2023. 1. 26. 10:54

본문

 

 

문제 설명 :

문자열을 입력받아서 문자열 내의 괄호의 짝이 맞는지 여부를 리턴해야합니다. 

 

단계별로 함수를 작성해봅니다.

1. 괄호의 종류를 한가지로 정합니다. 

2. 괄호의 종류를 늘려서 다른 괄호에서도 작동하도록 합니다.

3. 괄호를 제외한 문자열이 포함될 경우에도 동작하도록 합니다.

 

입력

인자 1 : str

  • string 타입의 괄호가 포함된 문자열


출력

  • boolean 타입을 리턴해야 합니다. (true  or false) 


주의사항: 

괄호의 종류는 (), {}, [] 이렇게 3가지입니다.

괄호는 먼저 열리고 "("   열린만큼만 닫혀야합니다.  ")"
예를 들어서 "([])" 이런식으로 구성되어 있어야합니다. "({][{)"

 

 

입출력 예시

let output = balancedBrackets('(');
console.log(output); // // -> false

output2 = balancedBrackets('()');
console.log(output2); // --> true

let output3 = balancedBrackets('[](){}');
console.log(output3); // --> true

output4 = balancedBrackets('[({})]');
console.log(output4); // --> true

let output5 = balancedBrackets('[ ( ] { ) }');
console.log(output5); // --> false

 

 

풀이코드1  설명

 

처음에는 "()" 이 괄호 한가지만 생각하고 다음과 같이 코드를 작성했으나 확장성이나 테스트에 있어서 적절하지 못했습니다. 

const balancedBrackets0  = function (str) {
    // TODO: 여기에 코드를 작성합니다.
    if(str.length===0){
        return true 
    }
    let arr =[];
    //console.log(arr.includes("("))
    for (let i=0; i< str.length; i++){
      //  console.log("i",str[i])
        if(str[i]==="(" &&  arr.includes("(") === false ){
            arr.push(str[i]);
        }
        else if (str[i] === ")" && arr.includes("(") === true && arr.length === 1){
            arr.push(str[i])
        }   

        if(arr[0] === "(" && arr[1] === ")" ){
            arr.pop();
            arr.pop();
        }
    }
    //console.log("arr",arr)

    if(arr.length === 0){
        return true;
    }else{
        return false;
    }

  };

 

 

풀이코드2  설명

두번째 코드는 stack을 활용해서 객체와 closer를 이용한 풀이였습니다.

풀이 단계는 다음과 같습니다. 

 

1. stack 배열 선언

2. opener 객체에 키-값 쌍으로 괄호쌍을 지정

3. closer에 닫히는 괄호를 문자열로 지정
4. 반복문으로 str의 길이만큼 순회

5. opener안에 키값이 있을경우 stack 배열에 삽입

6. str[i]의 값이 closer 중에 있을 경우

7. 스택배열의 마지막값을 뺀 뒤 opener의 키값에 대입해서 밸류를 얻고 그 밸류를 pair로 지정 

8. pair와 str[i]가 같지 않으면 false 리턴

9. 마지막 결과값으로 stack의 길이가 0이면 true 0이 아니면 false 반환

 

const balancedBrackets = function (str){
    const stack = [];
    const opener = {
        "{" : "}",
        "[" : "]",
        "(" : ")",
    };
    const closer = "}])";

    for(let i = 0; i < str.length; i++){
        // str[i] 중에   {, [, ( 이 있을 경우 
        if(str[i] in opener){
            stack.push(str[i])
            //}]) 중 하나라도 포함되어있으면 
        }else if ( closer.includes(str[i])){
            //stack에서 빼냄 
            const top = stack.pop() ;
            const pair = opener[top];
            //pair는 "{,[,("를 키로하는 밸류값 "}, ], )"
            //pair와 str[i]가 같지 않으면 false를 반환 
            console.log("pair",pair)
            if(pair !== str[i]){
                return false; 
            }
        }
    }
    //stack의 길이가 0이면 true, 아니면 false
    return stack.length === 0; 
}

관련글 더보기