기초다지기/JS 코딩테스트
javascript 괄호 문자열 짝 맞추기
by 김빵그
2023. 10. 28.
문제
랜덤한 괄호 문자열이 주어질 때 서로 짝지어서 올바른 괄호 문자열이면 true 아니면 false
나의 풀이 1 (런타임 오류)
while(s.includes('()')) {
s = s.replaceAll("()", '');
}
return s.length == 0 ? true : false;
- includes() : 주어진 문자열 ()이 s안에 존재하는지에 따라 모든 '()' 문자를 반복적으로 제거한다.
- 올바른 문자열일 경우 s는 빈 문자열이 되며 종료
- 문제는 맞았지만 2문제나 런타임 오류가 발생했다
- 이유 : 문자열에서 '()'를 찾아 계속 제거하면서 문자열을 수정하는 작업은 문자열 길이가 길어질수록 성능 문제를 일으킬 수 있다 문자열을 반복적으로 수정하기 때문에 에러가 남
나의 풀이 2 (런타임 오류)
function solution(s){
if(s.length % 2 !== 0 || s[0] == ')' ) {
return false;
}else {
var arr = [];
for(let i = 0 ; i < s.length; i++) {
if(s[i] === "(") {
arr.push(s[i]);
}else if (s[i] === ")") {
arr.length == 0 ? false : arr.pop();
}
}
return arr.length == 0;
}
}
- 괄호의 개수가 홀수거나 시작 문자가 ")"인 경우 선 처리해서 false로 거른다
- 배열 arr를 사용하여 열린 괄호 "("를 스택에 push 하고 닫힌 괄호 ")"를 스택에서 pop 하며 괄호의 짝을 확인한다
- 런타임 에러 1문제
나의 풀이 3
function solution(s){
if(s.length % 2 !== 0 || s[0] == ')' ) {
return false;
}else {
var arr = [];
for(let i = 0 ; i < s.length; i++) {
if(s[i] === "(") {
arr.push(s[i]);
}else if (s[i] === ")") {
if (arr.length === 0) {
return false;
} else {
arr.pop();
}
}
}
return arr.length == 0;
}
}
- 위의 코드를 좀 더 가독성있게 코드를 수정하니 제출이 완료되었다
- 3항이 좀 더 오래 걸리는 걸까..?
다른 풀이
1) for .. of
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;
}
- 누적 변수 cum을 사용한다
- for를 사용하여 문자열을 순회하면서 여는 괄호가 "(" 일때 cum을 1 증가하고
- 닫는괄호 ")" 일 때 cum 을 1 감소시킨다
- cum이 음수가 되면 올바르지 않는 문자열이라고 판단하려 false 반환
2) match
function is_pair(s){
var result = s.match(/(\(|\))/g);
return result[0] == '(' && result.length % 2 == 0 ? true : false
}
- 정규식 표현을 사용하여 주어질 문자열에서 괄호 ( )를 찾아 배열로 반환
- 반환된 배열의 첫번째 요소가 "("인지 확인하고 배열의 길이가 짝수인지 검사하여 문자열 판단