문제

문제 링크
image

나의 풀이

아이디어

올바른 괄호가 되지 않을 경우를 먼저 생각해보면,

  • 문자열이 닫힌 괄호로 시작했거나, 열린 괄호로 끝나버리면 무조건 false
  • 문자열이 끝났는데 열린 괄호가 다 닫히지 않을 경우
  • 열린 괄호가 없는 상태에서 닫는 괄호가 나올 경우 가 된다.

두 번째, 세 번째 경우를 검증하기 위해서, 열려있는 괄호를 카운트하고 닫는 괄호가 나올 경우 다시 카운트를 줄이는 방식을 쓰기로 했다.

코드

function solution(s){
    if(s.at(0) === ')' || s.at(-1) === '(') return false;
    let cnt = 0;
    for(let i = 0; i < s.length; ++i){
        if(s.at(i) === '(') ++cnt; // 괄호 열기. ++카운트
        else {
            if(cnt === 0) return false; // 열린 괄호가 없는데 닫는 괄호가 나올 경우 false
            else --cnt; // 괄호 닫기. --카운트
        }
    }
    return cnt === 0 ? true : false; // 문자열이 끝났는데 열린 괄호가 다 닫히지 않았을 경우 false
}

다른 사람 풀이

function solution(s){
    let cum = 0
    for (let paren of s) {
        cum += paren === '('? 1: -1
        if(cum < 0) {
            return false
        }
    }
    return cum === 0? true: false;
}

같은 로직인데 굉장히 깔끔하게 정리된 풀이.
생각해보니 나같은 경우 시작 문자, 끝문자를 먼저 체크했는데 중복되는 로직이었다는 걸 이 풀이 덕에 깨달을 수 있었다.
또한 열린 괄호가 없을 경우를 굳이 if문으로 빼지 않고 카운트가 마이너스 될 경우만 생각하면 되었다는 사실도 알 수 있었다.