\(@^0^@)/
[알고리즘] 재귀를 사용한 stringifyNumbers 본문
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
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 알고리즘 & 자료구조 마스터클래스
'알고리즘' 카테고리의 다른 글
[알고리즘] leetcode - Pascal's Triangle II (0) | 2022.07.03 |
---|---|
[알고리즘] leetcode - rotate array (0) | 2022.07.02 |
[알고리즘] 스택(Stack)과 구현 메서드 (0) | 2022.05.09 |
[알고리즘] 이중 연결 리스트(Double LinkedList)와 구현 메서드 (0) | 2022.05.04 |
[알고리즘] 연결 리스트(LinkedList)와 구현 메서드 (0) | 2022.05.03 |