function solution(s){
if(s[0] === ')'){
return false;
}
if(s[s.length - 1] === '('){
return false;
}
let stack = [];
for(let i = 0; i < s.length; i++){
stack.push(s[i]);
if(stack[stack.length - 2] === '(' && stack[stack.length - 1] === ')'){
stack.pop();
stack.pop();
}
}
if(stack.length > 0){
return false;
}
return true;
}
스택을 활용하는 문제이다.
(
문자와 )
로 감싸져야만 올바른 문자이다.
만약, 주어진 문자가 )
로 시작하면 이는 어떻게 해도 올바르지 않으므로 예외 처리한다.
또한, 주어진 문자가 (
로 끝나면 어떻게 해도 올바르지 않으므로 예외 처리한다.
stack
에 (
문자가 들어온 뒤 )
문자가 이어지면 바로 stack
에서 제거한다.
이 과정을 주어진 문자열에 대하여 전부 진행한다.
마지막 문자열까지 연산이 끝난 뒤 stack
을 확인한다.
올바른 문자라면 stack
에는 남는 것이 없어야한다.
따라서 stack
의 길이가 0보다 크면 올바르지 않은 문자이므로 false
를 반환한다.
function solution(s){
if(s[0] === ')'){
return false;
}
if(s[s.length - 1] === '('){
return false;
}
let cum = 0
for (let paren of s) {
cum += paren === '('? 1: -1
if(cum < 0) {
return false
}
}
return cum === 0? true: false;
}
다른 분 풀이 중 참신한게 있어서 가져왔다.
그대로 복붙해봤더니 효율성 테스트에서 시간초과가 걸려서 필자 풀이 중 예외 처리 부분을 적용했다.
그랬더니 효율성 테스트에서 필자의 풀이보다 1ms 정도 빨랐다.
스택 구조의 push()
와 pop()
을 1과 -1로 표현하신 것 같다.