코딩쌀롱

Mission4 문제해결정리(str to num, arr maxDepth) 본문

개발공부

Mission4 문제해결정리(str to num, arr maxDepth)

이브✱ 2020. 12. 16. 19:40

📌 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를 변수로 만들고 조건연산자를 통해 최대값을 저장하면 된다!

Comments