s는 여러 괄호들로 이루어진 String 인자입니다. s가 유효한 표현인지 아닌지 true/false로 반환해주세요.
종류는 '(', ')', '[', ']', '{', '}' 으로 총 6개 있습니다. 아래의 경우 유효합니다. 한 번 괄호를 시작했으면, 같은 괄호로 끝내야 한다. 괄호 순서가 맞아야 한다.
예를 들어 아래와 같습니다.
s = "()"
return true
s = "()[]{}"
return true
s = "(]"
return false
s = "([)]"
return false
s = "{[]}"
return true
s = "[]{}"
return true
처음 진행할 때 객체로 같은 종류의 괄호는 같은 값이 라고 지정해준다.
첫번째 괄호에서 같은 값이 두번째, 네번째 처럼 짝수의 값이 같아야지 true 가 나오고 두번째 괄호에서 같은 값이 세번째, 다섯번째 홀수의 값이 나와야지 true가 나오게 진행하는 방법을 생각했다.
하지만 이 함수의 맹점은 처음 i가 0이면 j가 -1 이 나와서 Undefined 가 되어 false 만 출력되게 되었다.
const x = {
'(': 'a',
')': 'a',
'{': 'b',
'}': 'b',
'[': 'c',
']': 'c',
}
for (let i = 0; i < s.length ; i++) {
for (let j = i - 1; j < s.length ; j += 2){
if (i === 0) {
continue;
}
if (x[s[i]] === x[s[j]]) {
return true;
} else {
return false;
}
}
}
시작하기전의 아이디어는 빈 배열을 선언해주고 같은 괄호인 '()', '{}', '[]' 가 연속으로 나오게 되면 배열에서 삭제를 해줘야한다.
let arr = [];
let obj = {
'(': ')',
'[': ']',
'{': '}'
}
for (i = 0; i < s.length; i++) {
let x = s[i];
if (x === '(' || x === '[' || x === '{') {
arr.push(obj[x]);
} else {
let left = arr.pop();
if (x !== left) return false;
}
}
return arr.length === 0 ? true : false;
재성님의 코드를 보고 더 쉬운 방법이 있어서 참고하게 되었다.
가정은 위의 1번 풀이 과정과 동일하나 훨씬 쉽게 작성할 수 있다.
while(s.includes('()')||s.includes('{}'))
s=s.replace('()','')
s=s.replace('{}','')
s=s.replace('[]','')
return s == ''? true : false
참고 및 출처
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Statements/while
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/replace