Last active
April 17, 2021 05:05
-
-
Save jjori-master/8d252788b53e1c2e5ed9ae966eecabec to your computer and use it in GitHub Desktop.
코드스피츠 3주차 과제
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
if (1) { | |
const stringCheck = [ | |
[/[\r\n\l]/g, "\\n"], | |
[/"/g, '\\"', [/\t/g, "\\t"]], | |
]; | |
const el = { | |
number: (v) => v.toString(), | |
boolean: (v) => v.toString(), | |
string: (v) => { | |
for (let i = 0; i < stringCheck.length; i++) { | |
v = v.replace(stringCheck[0], stringCheck[1]); | |
} | |
return v; | |
}, | |
stringify(v) { | |
return this[typeof v]?.(v) ?? "null"; | |
}, | |
}; | |
const arrToString = (arr) => { | |
let str = ""; | |
for (const v of arr) str += `,${v}`; | |
return `[${str.substr(1)}]`; | |
}; | |
const recursive = (arr, acc, i, stack) => { | |
if (i < arr.length) { | |
if (Array.isArray(arr[i])) { | |
stack.push([arr, acc, i + 1]); | |
return recursive(arr[i], [], 0, stack); | |
} else { | |
acc.push(el.stringify(arr[i])); | |
return recursive(arr, acc, i + 1, stack); | |
} | |
} else { | |
const accStr = arrToString(acc); | |
const pre = stack.pop(); | |
// stack을 쓰기로 했으면 length 따위는 쓰지 않는다. | |
// 링크드리스트의 스택을 사용한다면 원래 length에 의존적이지 않다. | |
if (pre) { | |
const [prevArr, prevAcc, prevIndex] = pre; | |
prevAcc.push(accStr); | |
recursive(prevArr, prevAcc, prevIndex, stack); | |
} else { | |
debugger; | |
return accStr; | |
} | |
} | |
}; | |
const stringify = (arr) => { | |
if (!Array.isArray(arr)) throw "Invalid arr"; | |
return recursive(arr, [], 0, []); | |
}; | |
const res = stringify([1, 2, [4, 5, 6], 3]); | |
debugger; | |
console.log(res); | |
// JSON.stringify([1, 2, [4, 5, 6], 3]) == stringify([1, 2, [4, 5, 6], 3]); | |
// stringify([1, 2, [4, 5, 6], 3, [7, 8, 9]]); | |
// JSON.stringify([1, 2, [4, 5, [10, 11, 12], 6], 3, [7, 8, 9]]) == | |
// stringify([1, 2, [4, 5, [10, 11, 12], 6], 3, [7, 8, 9]]); | |
} | |
if (1) { | |
// while 문입니다. | |
const stringCheck = [ | |
[/[\r\n\l]/g, "\\n"], | |
[/"/g, '\\"', [/\t/g, "\\t"]], | |
]; | |
const el = { | |
number: (v) => v.toString(), | |
boolean: (v) => v.toString(), | |
string: (v) => { | |
for (let i = 0; i < stringCheck.length; i++) { | |
v = v.replace(stringCheck[0], stringCheck[1]); | |
} | |
return v; | |
}, | |
stringify(v) { | |
return this[typeof v]?.(v) ?? "null"; | |
}, | |
}; | |
const EMPTY = {}; | |
const stringify = (arr) => { | |
if (!Array.isArray(arr)) throw "Invalid arr"; | |
let result = EMPTY; | |
if (arr.length == 0) { | |
result = "[]"; | |
} else { | |
let index = 0; | |
let accu = ""; | |
const stack = []; | |
while (true) { | |
if (index == arr.length) { | |
if (stack.length == 0) { | |
break; | |
} else { | |
const { _arr, _index } = stack.pop(); | |
arr = _arr; | |
index = _index + 1; | |
accu = accu + "]"; | |
} | |
} else { | |
if (Array.isArray(arr[index])) { | |
stack.push({ | |
_index: index, | |
_arr: arr, | |
}); | |
arr = arr[index]; | |
index = 0; | |
accu = accu + ",["; | |
} else { | |
accu = `${accu},${el.stringify(arr[index])}`; | |
index = index + 1; | |
} | |
} | |
} | |
result = `[${accu}]`.replaceAll("[,", "["); | |
} | |
if (result == EMPTY) throw "io exception"; | |
return result; | |
}; | |
JSON.stringify([1, 2, [4, 5, 6], 3]) == stringify([1, 2, [4, 5, 6], 3]); | |
stringify([1, 2, [4, 5, 6], 3, [7, 8, 9]]); | |
JSON.stringify([1, 2, [4, 5, [10, 11, 12], 6], 3, [7, 8, 9]]) == | |
stringify([1, 2, [4, 5, [10, 11, 12], 6], 3, [7, 8, 9]]); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment