본문 바로가기
Algorithm/Programmers

[Programmers] 올바른 괄호(JavaScript)

by 백승전 2022. 8. 9.

 

알림

 

본 포스팅은 공부 목적으로 작성된 글이며 상업적 목적으로 절대 사용되지 않았음을 밝힙니다.

 

문제

 

https://school.programmers.co.kr/learn/courses/30/lessons/12909

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

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

예를 들어,
"()()" 또는 "(())()" 는 올바른 괄호입니다.
")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.

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

 

코드

 

function solution(s){
    let answer = 0;
    for(let i = 0; i < s.length; i++){
        if(s[i] == '(') answer += 1;
        if(s[i] == ')') answer -= 1;
        if(answer < 0) return false;
    }
    return answer == 0 ? true : false;
}

 

풀이

 

문자열이 '('일 땐 1을 더하고, ')'일 땐 1을 빼서, 최종적으로 0이라면 true를, 아니라면 false를 리턴해 주도록 합니다.

 

하지만, 다음과 같은 경우의 수가 존재하기 때문에 조건문을 한 줄 더 추가해줘야 하는데요.

바로 첫 번째로 첫 괄호가 ')'인 경우와, 두 번째로 같은 괄호가 연속으로 사용될 경우입니다.

 

첫 번째 경우는 '('와 ')'의 개수가 같아서 합이 0이 나오더라도,

처음이 닫혀있고 마지막이 열려있기 때문에 올바른 괄호가 성립되지 않을 수 있습니다.

 

하지만 여기서 1번의 경우만 보고 무작정 s의 첫 번째 요소가 ')'로 시작하면 바로 false를 리턴하면 안 되는데요.

왜냐하면 '())('처럼 합이 0이면서 첫 번째 요소도 '('이지만 올바른 괄호가 아닌 테스트 케이스가 존재하기 때문입니다.

 

만약 괄호가 연속으로 사용됐다면, 양수일 경우('(')는 최종적으로 0이 되면 결국 올바른 괄호이기 때문에 결국 음수가 되는 경우(')')만 찾아내면 됩니다.

 

따라서 마지막 조건문은 누적합을 담은 변수가 0보다 작아진다면 바로 false를 리턴하도록 작성하시면 됩니다.

댓글