Frontend/Algorithm

[프로그래머스] 올바른 괄호 Javascript

돌잡이개발자 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를 순회할 수 있었다. 

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

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

반응형