기초다지기/JS 코딩테스트
javascript 괄호 일치 문제 해결하기 ("(){}[]")
by 김빵그
2023. 10. 28.
문제
주어진 문자열 s에 포함된 괄호 문자열이 유효한지 확인 (), {}, []
코드 풀이 1
var isValid = function(s) {
var stack = [];
var start = "({[";
var end = ")}]";
if(s.length % 2 !== 0 || end.includes(s[0])) {
return false;
}
for (let c of s) {
if(start.includes(c)) {
stack.push(c);
}else {
const last = stack.pop();
const exp = end[start.indexOf(last)];
if (c !== exp) {
return false;
}
}
}
return stack.length == 0;
};
- stack : 빈 배열
- start 와 end는 각각 열린 괄호와 닫힌 괄호를 정의한다
- 문자열 s의 길이가 홀수이거나 문자열의 첫번째 글자가 end 닫힌 괄호로 시작하는 경우 false 처리
- 문자열 s의 각 글자를 비교한다
- 만약 start에 들어있는 글자일시 stack에 추가
- last : stack 배열에서 마지막으로 pop된 열린괄호 문자
- exp : 열린괄호 last에 대응하는 닫힌 괄호로 닫힌괄호[start.indexOf(last)] 로 얻을 수 있다
- 각 글자와 닫힌괄호가 맞지 않으면 false
코드 풀이 2
var isValid = function(s) {
var stack = [];
var arr = {
"(" : ")",
"{" : "}",
"[" : "]"
}
for (let c of s) {
if(arr[c]) {
stack.push(c);
}else {
if (stack.length === 0 || arr[stack.pop()] !== c) {
return false;
}
}
}
return stack.length == 0;
};
- stact 빈 배열
- arr 각 열린 괄호와 닫힌 괄호의 짝
- arr 객체에 c가 존재하고 열린괄호라면 stack에 c를 추가
- 그렇지 않으면 닫힌괄호
- stack 길이가 0 열린 괄호와 대응하는 닫힌 괄호가 없는 것이므로 false
- arr[stack.pop()] ! == c 는 스택에서 가장 최근에 추가된 열린 괄호를 비교해 닫힌괄호 c와 짝이 맞지 않는 경우 false