ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스] 올바른 괄호 Javascript
    Frontend/Algorithm 2022. 3. 17. 21:59

    문제설명

    괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어

    • "()()" 또는 "(())()" 는 올바른 괄호입니다.
    • ")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.

    '(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.

     

    제한사항

    • 문자열 s의 길이 : 100,000 이하의 자연수
    • 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.

    입출력 예

    s answer
    "()()" true
    "(())()" true
    ")()(" false
    "(()(" false

     

    ✏️ 첫 풀이 방식

    function solution(s){
        var answer = true;
        let braces = s.split(",");
        let sum = 0;
        
        braces.forEach((brace) => {
            if(brace[0] === ")"){
                answer = false;
            } else {
                for(let i=0; i < brace.length; i++) {
                    if(brace[i] === "("){
                        sum++;
                    } else {
                        sum--;
                        if(sum <0){
                            answer = false;
                        }
                    }
                }
                if(sum !== 0) {
                    answer = false;
                }
            }
        })
        
        return answer;
    }

    처음 내가 작성한 풀이는 주어진 s를 배열로 만들어 forEach로 순회하여 sum을 구해 sum의 합이 0보다 작을 때 또는 최종 sum이 0이 아닐 때 answer를 false로 반환하도록 했다. 어딘가 간결하지 못하고 중첩문으로 보기 어려운 코드가 되었다. 

     

    🔍 개선된 풀이 방식

    function solution(s){
        let count = 0;
        
        for(const brace of s) {
            if(brace === "("){
                count++;
            } else {
                if(count === 0) {
                    return false;
                }
                count--;
            }
        }
        return count === 0;
    }

    일단 변수명도 sum보다 count가 더 직관적이라는 생각이 들어 수정했다. for... of 문법을 이용해 s를 배열로 변경하는 작업을 하지 않고도더 효율적으로 s를 순회할 수 있었다. 

    처음부터 좋은 코드를 짜긴 어렵지만 이렇게 계속 좋은 코드를 보면서 개선해나가면 언젠가 나도 이렇게 짤 수 있지 않을까🤔

    어떤 알고리즘 방식을 어떻게 효율적으로 사용할 수 있을지 많이 고민해보자!

    반응형

    댓글

Designed by Tistory.