Skip to content

Instantly share code, notes, and snippets.

@jjori-master
Last active April 17, 2021 05:05
Show Gist options
  • Save jjori-master/8d252788b53e1c2e5ed9ae966eecabec to your computer and use it in GitHub Desktop.
Save jjori-master/8d252788b53e1c2e5ed9ae966eecabec to your computer and use it in GitHub Desktop.
코드스피츠 3주차 과제
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