프로그래머스 올바른 괄호 자바스크립트 알고리즘 풀이
문제
나의 풀이
아이디어
올바른 괄호가 되지 않을 경우를 먼저 생각해보면,
- 문자열이 닫힌 괄호로 시작했거나, 열린 괄호로 끝나버리면 무조건 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문으로 빼지 않고 카운트가 마이너스 될 경우만 생각하면 되었다는 사실도 알 수 있었다.