코딩쌀롱
Mission4 문제해결정리(str to num, arr maxDepth) 본문
📌 String to Number
( typeof NaN === 'number' → true의 문제 )
// 숫자, [, ] → 이것들만 골라내기 위해 만든 함수
// (boolean값 반환 - 다른 함수에서 filter로 걸러서 배열 만듦)
braceNumFilter(item) {
return item === '[' || item === ']' ||
(typeof parseInt(item) === 'number' && isFinite(parseInt(item)) );
}
배열 안에 string 자료형인 숫자 거르기!
1. typeof item === 'number'
처음에 자료형이 string인 거 생각 못하고 이렇게 함.
2. typeof (item * 1) === 'number'
typeof Number(item) === 'number'
typeof parseInt(item) === 'number'
숫자만 걸러지지 않고 특수문자 공백문자 다 나오길래 디버깅을 해 봤더니
typeof NaN === 'number'
가 true
로 나옴. number, NaN 모두 true가 돼서 모든 값이 다 반환된 것.
3. (item * 1)
Number(item)
parseInt(item)
그런데 이 세 가지 값이 item = ' '
공백문자일 때 다른 결과가 나옴.
*1, Number()를 하면 0이 반환되고, parseInt()에는 NaN이 반환된다.
그래서 parseInt()를 써서 공백문자도 NaN으로 반환되게 했다.
4. isFinite(parseInt(item))
NaN과 number를 구별해 줄 조건을 추가했다.
isFinite(NaN) === false
isFinite(string) === false
isFinite(number) === true
📌 maxDepth(배열의 깊이) 구하기
문제 발생
처음에는 braceArr(괄호만 모아놓은 배열) / 2
로 배열의 깊이를 구했댜. 그런데 이렇게 하면 원소가 병렬로 있을 때까지도 괄호를 깊이로 계산한다는 문제가 생긴다. 예를 들면 [1,[2],[3]]
이런 경우 실제의 깊이는 2이지만 (괄호의 개수 / 2)를 하게 되면 깊이가 3이 나오게 된다.
해결 방법
// 변수나 객체의 속성으로 미리 선언
depth = 0;
maxDepth = 0;
// braceChecker 함수가 실행될 때 값 변화 주기
// [ 여는 괄호일 때
depth++;
maxDepth = maxDepth < depth ? depth : maxDepth;
// ] 닫는 괄호일 때
depth--;
문제를 해결하기 위해서는 '['일 때 더해주고 ']'일 때 빼줘야한다.
그런데 괄호 매칭이 다 맞을 경우 결국 0이 되기 때문에 depth값 중 최대값이 배열의 깊이가 된다.
따라서 maxDepth를 변수로 만들고 조건연산자를 통해 최대값을 저장하면 된다!
'개발공부' 카테고리의 다른 글
Mission6 (bubbling, capturing, target) (0) | 2020.12.16 |
---|---|
Mission5 문제해결정리(bind, event delegation, template tag) (0) | 2020.12.16 |
Mission4 (parsing, destructuring) (0) | 2020.12.16 |
Mission3 (Map) (0) | 2020.12.16 |