\(@^0^@)/

[알고리즘] 재귀를 사용한 stringifyNumbers 본문

알고리즘

[알고리즘] 재귀를 사용한 stringifyNumbers

minjuuu 2022. 6. 22. 15:05
728x90

stringifyNumbers : 모든 values들의 numbers를 strings으로 변환하는 문제.
 출력 값이 제공받은 것과 같게 나왔지만 오답이었다....

/* 내가 작성한 코드 */
function stringifyNumbers(obj) {
    for (let key in obj) {
        if (typeof obj[key] === "object") {
            stringifyNumbers(obj[key]);
        } else if (typeof obj[key] === "number") {
            JSON.stringify(obj[key]);
        }
    }
    return obj;
}

(좌) 제공받은 출력값  /  (우) 나의 출력값

콘솔상으로는 nested object 안의 모든 숫자들을 string으로 변환한 것 같은데,
채점을 돌려보면 그렇지 않은 모양이다ㅠ 분명 1에서 '1'로, 4에서 '4'로 변환되었는데 왜 인식을 못하지?

잘 모르겠어서, 설루션을 보고 코드를 하나하나씩 따라 해 보기로 하였다.

1. newObj이라는 객체 변수 생성.

function stringifyNumbers(obj) {
  let newObj = {};
	for (let key in obj) {
		if (typeof obj[key] === "object") {
			newObj[key] = stringifyNumbers(obj[key]);
		} else if (typeof obj[key] === "number") {
			newObj[key] = JSON.stringify(obj[key]);
		}
	}
	return newObj;
}

test의 array(0)가 사라졌고, info안의 isRight이라는 prosperity도 사라졌음. 당연히 오답.


2. else 문 추가

function stringifyNumbers(obj) {
  let newObj = {};
	for (let key in obj) {
		if (typeof obj[key] === "object") {
			newObj[key] = stringifyNumbers(obj[key]);
		} else if (typeof obj[key] === "number") {
			newObj[key] = JSON.stringify(obj[key]);
		} else {
			newObj[key] = obj[key];
		}
	}
	return newObj;
}

obj [key]를 newObj [key]에 할당해주었기에, isRight 프로퍼티는 할당되었지만,
test에 array(0)는 아직 없는 상태.


3. 마지막으로 Array.isArray(obj [key]) 추가
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray

 

Array.isArray() - JavaScript | MDN

The Array.isArray() method determines whether the passed value is an Array.

developer.mozilla.org

function stringifyNumbers(obj) {
  let newObj = {};
	for (let key in obj) {
		if (typeof obj[key] === "object" && !Array.isArray(obj[key])) {
			newObj[key] = stringifyNumbers(obj[key]);
		} else if (typeof obj[key] === "number") {
			newObj[key] = JSON.stringify(obj[key]);
		} else {
			newObj[key] = obj[key];
		}
	}
	return newObj;
}

obj.test 또는 obj ['test']는 true인데, not연산자 (또는 bang operator)를 이용하여 false로 만들었기에 else 문을 돈다.
따라서 [ ]를 그대로 받음. 그랬더니, 모든 조건을 충족하여 정답이 되었다.



결국 설루션을 모두 따라 하고 다른 점은 strings로 변환할 때, 나는 JSON.stringfiy( )를 사용하였고
설루션 코드는 toString( )를 사용.

/* strings converts 하는 내 코드*/
newObj[key] = stringifyNumbers(obj[key]);

/* strings converts 하는 솔루션코드*/
newObj[key] = obj[key].toString();

하지만, 왜 내가 맨 처음에 짰던 로직이 잘못되었는지는 잘 모르겠다ㅠ
분명, 무엇인가가 빠져있는 코드인 것은 알겠지만 정확히 무엇이 잘 못되었는지는 설명할 수 없다....
object 또는 number가 아닐 때의 예외처리를 안 해주긴 했는데 그것이 문제이려나?
공부하다 보면 알겠지!


출처 : udemy - JavaScript 알고리즘 & 자료구조 마스터클래스

728x90