LeetCode Weekly Contest Question#1 Review 🤓
문제출처: https://leetcode.com/contest/weekly-contest-210/problems/maximum-nesting-depth-of-the-parentheses/
A string is a valid parentheses string (denoted VPS) if it meets one of the following:
""
, or a single character not equal to "("
or ")"
,AB
(A
concatenated with B
), where A
and B
are VPS's, or(A)
, where A
is a VPS.We can similarly define the nesting depth depth(S)
of any VPS S
as follows:
depth("") = 0
depth(A + B) = max(depth(A), depth(B))
, where A
and B
are VPS'sdepth("(" + A + ")") = 1 + depth(A)
, where A
is a VPS.For example, ""
, "()()"
, and "()(()())"
are VPS's (with nesting depths 0, 1, and 2), and ")("
and "(()"
are not VPS's.
Given a VPS represented as string s
, return the nesting depth of s
.
1 <= s.length <= 100
s
consists of digits 0-9
and characters '+'
, '-'
, '*'
, '/'
, '('
, and ')'
.s
is a VPS.//s의 깊이를 반환하는 문제.
//즉, s안에서 ()가 몇 쌍이 들어있는지 판단해야함.
//(가 나오면 +, )가 나오면 -를 해서 카운트할 것.
//)가 (에 연달아서 나오면 숫자가 감소해야하고, (에 똑같은 (가 연달아서 나오면 숫자가 증가해야한다.
var maxDepth = function(s) {
let countOpenPer = 0; // -1해야함.
let countAll = 0; //0으로 돌아오는 경우에만 countOpenPer반환할 것.
let arrDepth = [];
for (var i = 0; i < s.length; i++) {
console.log("s[i]", s[i]);
if (s[i] === "("){
countOpenPer++;
arrDepth.push(countOpenPer);
countAll++;
}
if (s[i] === ")"){
countAll--;
if (countAll === 0){
//'(' 카운트 초기화
countOpenPer = 0;
}
}
// if (countOpenPer > maximumCount){
// maximumCount = countOpenPer;
// console.log("maximumCount:", maximumCount);
// }
}
if (countAll === 0){
console.log("Math.max.apply(null, arrDepth) ", Math.max.apply(null, arrDepth) );
return Math.max.apply(null, arrDepth) === -Infinity ? 0 : (Math.max.apply(null, arrDepth));
}
//나머지의 경우 (쌍이 맞지 않는 경우)
return 0;
};
⬆️ 위 오답에서 방황하고 있는 사이, contest의 제한시간이 모두 지나버렸다... 😂
다 내려놓고 처음부터 다시 풀어보았더니 아래 코드로 Pass 됐다!
//s의 깊이를 반환하는 문제.
//즉, s안에서 ()가 몇 쌍이 들어있는지 판단해야함.
//'('가 나오면 push, ')'가 나오면 pop를 해서 요소를 추가/제거.
var maxDepth = function(s) {
let arrCount = [];
let maximumLength = 0;
for(var i = 0; i < s.length; i++){
if (s[i] === "("){
arrCount.push(0);
} else if (s[i] === ")"){
arrCount.pop();
}
if (maximumLength < arrCount.length){
maximumLength = arrCount.length;
}
}
return maximumLength;
};
push
& pop
메소드를 이용하는 것이 좋다. 스택배열 구조를 활용하지 않고 괄호의 갯수를 담는 변수를 만들어 카운트할 경우, 여러 가지 test case를 모두 충족하는 조건문을 추가로 작성해야하는 번거로움이 따라온다. let arrDepth = [];
)까지는 해보았으나, push
와 pop
메소드를 사용해 스택을 구현할 수 있다는 생각에는 미치지 못했었다.push
연산, pop
연산을 이용하면 어렵지않게 스택을 코드화 할 수 있다.