s는 여러 괄호들로 이루어진 String 인자입니다.
s가 유효한 표현인지 아닌지 true/false로 반환해주세요.
종류는 (
, )
, [
, ]
, {
, }
으로 총 6개 있습니다.
아래의 경우 유효합니다.
한 번 괄호를 시작했으면, 같은 괄호로 끝내야 한다.
괄호 순서가 맞아야 한다.
예를 들어 아래와 같습니다.
s = "()"
return true
s = "()[]{}"
return true
s = "(]"
return false
s = "([)]"
return false
s = "{[]}"
return true
추상 자료형
어떤 데이터의 구체적인 구현 방식은 생략한 채,
데이터의 추상적 형태와 그 데이터를 다루는 방법
따라서 데이터를 넣고 빼는 곳이 동일한 선형 자료형 stack의 배열 만들고
여는 괄호가 나오면 → push해서 데이터가 추가하고
닫는 괄호가 나오면 → pop으로 데이터를 꺼내면서 반환된 값은 배열 객체의 키값으로 지정한다
따라서 정상적인 괄호만나면 최종적으로 남는것이없다
(())()
이처럼 여는 괄호가 더 많은 경우
스택에 남게 되서 비어있지 않으면 false
(()))(
처럼 순서가 맞지 않아도
닫는괄호가 나오면 자기 짝을 pop 처리를 해줘야되는데
)
이 괄호가 나왔을 때에는 해당하는 여는괄호 (짝) 이 stack에 없기 때문에
정상적인 괄호가 아니라 false가 된다
따라서 스택의 제일 상단에 짝이 있어야 pop을 해줄 수 있다
function isValid(s) {
let result = true;
let stack = [];
let map = {
'(': ')',
'[': ']',
'{': '}'
}
for (let i = 0; i < s.length; i++) {
if (s[i] === "(" || s[i] === "[" || s[i] === "{") {
stack.push(s[i]);
} else {
let s_key = stack.pop();
if (s[i] !== map[s_key])
result = false;
}
}
if (stack.length !== 0)
result = false;
return result;
}
let result = true;
// 이후에는 정상적이지 않은 괄호형태만 false로 지정하도록 한다
let stack = [];
let map = {
'(': ')',
'[': ']',
'{': '}'
}
for (let i = 0; i < s.length; i++) {
}
if (s[i] === "(" || s[i] === "[" || s[i] === "{") {
stack.push(s[i]);
}
예를 들어 stack 배열에는 "(" 가 있고, 해당하는 값이 "]"이라면
s_key = "("
map[s_key] = ")"
s[i] = "]"
이기 때문에 result 에는 false 값이 들어간다
else {
let s_key = stack.pop();
if (s[i] !== map[s_key])
result = false;
}
if (stack.length !== 0) result = false;
function isValid(s) {
let arr = s.slice();
for (let i = 0; i < s.length / 2; i++) {
for (let j = 0; j < s.length; j++) {
let match = arr[j] + arr[j + 1];
if (match === '()' || match === '{}' || match === '[]') {
arr = arr
.replace(arr[j], '')
.replace(arr[j + 1], '');
}
}
}
if (arr === '')
return true;
else
return false;
}
문자열에 split()을 해도 동일한 문자열인데 무슨차이일까...
arr대신에 s자체로 코드를 작성하면 틀린다고 나온다
let arr = s.slice();
i < s.length / 2;
라고적어주는데 범위를 동일하게 s.length 라고 잡아줘도 잘 작동한다for (let i = 0; i < s.length / 2; i++) {
for (let j = 0; j < s.length; j++) {}
}
let match = arr[j] + arr[j + 1];
if (match === '()' || match === '{}' || match === '[]') {
arr = arr
.replace(arr[j], '')
.replace(arr[j + 1], '');
}
for문을 이용해서 괄호 열고 닫는거를 세트로 삭제하고 나면
{[]}()
→ {
일 때 }
만나서 삭제 → [
일 때 ]
만나서 삭제 → (
일 때 )
만나서 삭제
if (arr === '') return true;
else return false;