From 5933ac033bc15f00eee7b8d0eb0de839fd408a5c Mon Sep 17 00:00:00 2001 From: yeonchae115 Date: Fri, 13 Sep 2024 13:51:50 +0900 Subject: [PATCH 1/2] =?UTF-8?q?1=EC=B0=A8=20=EC=A0=9C=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ex1/book-edit.html" | 68 +++++++++ .../ex1/book.png" | Bin 0 -> 5465 bytes .../ex1/bookmark_logo.png" | Bin 0 -> 7980 bytes .../ex1/index.html" | 144 ++++++++++++++++++ .../ex1/index2.html" | 142 +++++++++++++++++ .../ex1/kakao.png" | Bin 0 -> 5482 bytes .../ex1/naver.png" | Bin 0 -> 7981 bytes .../ex1/profile.png" | Bin 0 -> 23329 bytes .../ex1/register.html" | 57 +++++++ .../ex1/save.png" | Bin 0 -> 5021 bytes .../ex1/save2.png" | Bin 0 -> 9310 bytes .../ex1/setting.png" | Bin 0 -> 11769 bytes .../ex1/tailwind.png" | Bin 0 -> 5439 bytes .../ex1/undo.png" | Bin 0 -> 7071 bytes .../ex1/youtube.png" | Bin 0 -> 8602 bytes .../ex10.test.ts" | 66 +++++++- .../ex10.ts" | 60 +++++++- "\354\240\225\354\227\260\354\261\204/ex2.js" | 36 ++++- "\354\240\225\354\227\260\354\261\204/ex3.js" | 27 +++- .../ex3.test.js" | 6 +- "\354\240\225\354\227\260\354\261\204/ex4.js" | 60 +++++++- "\354\240\225\354\227\260\354\261\204/ex5.js" | 43 +++++- .../ex6.test.ts" | 3 +- "\354\240\225\354\227\260\354\261\204/ex6.ts" | 48 +++++- .../ex7.test.ts" | 4 + "\354\240\225\354\227\260\354\261\204/ex7.ts" | 52 ++++++- "\354\240\225\354\227\260\354\261\204/ex8.ts" | 40 ++++- 27 files changed, 835 insertions(+), 21 deletions(-) create mode 100644 "\354\240\225\354\227\260\354\261\204/ex1/book.png" create mode 100644 "\354\240\225\354\227\260\354\261\204/ex1/bookmark_logo.png" create mode 100644 "\354\240\225\354\227\260\354\261\204/ex1/index2.html" create mode 100644 "\354\240\225\354\227\260\354\261\204/ex1/kakao.png" create mode 100644 "\354\240\225\354\227\260\354\261\204/ex1/naver.png" create mode 100644 "\354\240\225\354\227\260\354\261\204/ex1/profile.png" create mode 100644 "\354\240\225\354\227\260\354\261\204/ex1/save.png" create mode 100644 "\354\240\225\354\227\260\354\261\204/ex1/save2.png" create mode 100644 "\354\240\225\354\227\260\354\261\204/ex1/setting.png" create mode 100644 "\354\240\225\354\227\260\354\261\204/ex1/tailwind.png" create mode 100644 "\354\240\225\354\227\260\354\261\204/ex1/undo.png" create mode 100644 "\354\240\225\354\227\260\354\261\204/ex1/youtube.png" diff --git "a/\354\240\225\354\227\260\354\261\204/ex1/book-edit.html" "b/\354\240\225\354\227\260\354\261\204/ex1/book-edit.html" index e69de29..2367f71 100644 --- "a/\354\240\225\354\227\260\354\261\204/ex1/book-edit.html" +++ "b/\354\240\225\354\227\260\354\261\204/ex1/book-edit.html" @@ -0,0 +1,68 @@ + + + + + + Bookmark Edit + + + + + +
+

+ BookMark Logo + BookMark +

+ +
+ +
+
+
+
+
+ +
+
+ + +
+ +
+
+ Undo Icon +
+
+ Save Icon +
+
+
+ +

There is no marks.

+
+
+ +
+ + + + + + diff --git "a/\354\240\225\354\227\260\354\261\204/ex1/book.png" "b/\354\240\225\354\227\260\354\261\204/ex1/book.png" new file mode 100644 index 0000000000000000000000000000000000000000..dfd09d0e013adcd6a6fb55c9134f1e7dd3e33ea4 GIT binary patch literal 5465 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 aH)1%wbH^KEQ@`7!!p`kJ+e)`YeEBaiiA^E^ literal 0 HcmV?d00001 diff --git "a/\354\240\225\354\227\260\354\261\204/ex1/bookmark_logo.png" "b/\354\240\225\354\227\260\354\261\204/ex1/bookmark_logo.png" new file mode 100644 index 0000000000000000000000000000000000000000..43406c309c397ba559d243421e870246aa469364 GIT binary patch literal 7980 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 + + + + + + Home Page + + + + + + +
+
+ BookMark Logo +

BookMark

+
+ +
+ +
+ + + + +
+

Study

+
+
+
+ Study +
+ Tailwind CSS +

Tailwind CSS is a utility-first CSS framework

+
+
+ +
+ +
+ +
+
+
+
+ + + + + diff --git "a/\354\240\225\354\227\260\354\261\204/ex1/index2.html" "b/\354\240\225\354\227\260\354\261\204/ex1/index2.html" new file mode 100644 index 0000000..1f22b40 --- /dev/null +++ "b/\354\240\225\354\227\260\354\261\204/ex1/index2.html" @@ -0,0 +1,142 @@ + + + + + + + Home Page + + + + + + + +
+
+ BookMark Logo +

BookMark

+
+ +
+ + +
+ + + + +
+

Study

+
+ +
+
+ Study +
+ Tailwind CSS +

Tailwind CSS is a utility-first CSS framework

+
+
+ +
+ +
+ +
+
+
+
+ + + diff --git "a/\354\240\225\354\227\260\354\261\204/ex1/kakao.png" "b/\354\240\225\354\227\260\354\261\204/ex1/kakao.png" new file mode 100644 index 0000000000000000000000000000000000000000..d802ab57cf4754506be0d93d6d5716cddeee5ab4 GIT binary patch literal 5482 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 literal 0 HcmV?d00001 diff --git "a/\354\240\225\354\227\260\354\261\204/ex1/naver.png" "b/\354\240\225\354\227\260\354\261\204/ex1/naver.png" new file mode 100644 index 0000000000000000000000000000000000000000..00686eab797701fddb5e0bd434b72f06f3a119c1 GIT binary patch literal 7981 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 z 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 P`%42|6P-$Jr + + + + + Register + + + + +
+
+ BookMark Logo +

BookMark

+
+
+ + +
+
+
+

Sign Up

+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+
+
+ + + + diff --git "a/\354\240\225\354\227\260\354\261\204/ex1/save.png" "b/\354\240\225\354\227\260\354\261\204/ex1/save.png" new file mode 100644 index 0000000000000000000000000000000000000000..04df82cd35365c08bad06b23b97c86a3ec8f2bf3 GIT binary patch literal 5021 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 ZG49Heco)|0n+E|sxSfmbwJ*Jo{x9Rc%mV-b literal 0 HcmV?d00001 diff --git "a/\354\240\225\354\227\260\354\261\204/ex1/save2.png" "b/\354\240\225\354\227\260\354\261\204/ex1/save2.png" new file mode 100644 index 0000000000000000000000000000000000000000..8dc320ca25f3099d0b3e5b1e351373c8c6178cb0 GIT binary patch literal 9310 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 literal 0 HcmV?d00001 diff --git "a/\354\240\225\354\227\260\354\261\204/ex1/setting.png" "b/\354\240\225\354\227\260\354\261\204/ex1/setting.png" new file mode 100644 index 0000000000000000000000000000000000000000..845c81da784bdf44fe3bd2d93eb9cbc7fb0f5bf0 GIT binary patch literal 11769 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 literal 0 HcmV?d00001 diff --git "a/\354\240\225\354\227\260\354\261\204/ex1/tailwind.png" "b/\354\240\225\354\227\260\354\261\204/ex1/tailwind.png" new file mode 100644 index 0000000000000000000000000000000000000000..7d158f2155286b07305341271d6a69ab1137d610 GIT binary patch literal 5439 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 literal 0 HcmV?d00001 diff --git "a/\354\240\225\354\227\260\354\261\204/ex1/youtube.png" "b/\354\240\225\354\227\260\354\261\204/ex1/youtube.png" new file mode 100644 index 0000000000000000000000000000000000000000..7d2736f0a79e4f907412ed8500514d98c82bd821 GIT binary patch literal 8602 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 NJXO$;uaGql|1UBfp`ZW& literal 0 HcmV?d00001 diff --git "a/\354\240\225\354\227\260\354\261\204/ex10.test.ts" "b/\354\240\225\354\227\260\354\261\204/ex10.test.ts" index 6218a79..34717c8 100644 --- "a/\354\240\225\354\227\260\354\261\204/ex10.test.ts" +++ "b/\354\240\225\354\227\260\354\261\204/ex10.test.ts" @@ -1,4 +1,68 @@ import { ArrayList } from './ex10'; +import assert from 'assert'; + console.log('🚀 ArrayList:', ArrayList); -// 여기에 테스트코드를 작성하세요. +const alist = new ArrayList(4, 7); +console.log('list:', alist.toString()); + +alist.add(8); // [4, 7, 8] +alist.add(15, 1); // [4, 15, 7, 8] +assert.deepStrictEqual(alist.toArray(), [4, 15, 7, 8], 'add() 실패'); + +alist.add(25, 2); // [4, 15, 25, 7, 8] +alist.add(40, 0); // [40, 4, 15, 25, 7, 8] +assert.deepStrictEqual(alist.toArray(), [40, 4, 15, 25, 7, 8], 'add() with index 실패'); + +const removedValue = alist.removeByIndex(1); // [40, 15, 25, 7, 8] +assert.strictEqual(removedValue, 4, 'removeByIndex 실패'); +assert.deepStrictEqual(alist.toArray(), [40, 15, 25, 7, 8], 'removeByIndex 실패'); + +const removedResult = alist.removeValue(25); // [40, 15, 7, 8] +assert.strictEqual(removedResult, true, 'removeValue 실패'); +assert.deepStrictEqual(alist.toArray(), [40, 15, 7, 8], 'removeValue 실패'); + +const failedRemove = alist.removeValue(100); // 값이 없으므로 false +assert.strictEqual(failedRemove, false, 'removeValue 실패 2'); + +assert.strictEqual(alist.get(0), 40, 'get() 실패'); +assert.strictEqual(alist.get(2), 7, 'get() 실패'); +assert.strictEqual(alist.get(10), undefined, 'get() 실패 2'); + +alist.set(1, 350); // [40, 350, 7, 8] +assert.deepStrictEqual(alist.toArray(), [40, 350, 7, 8], 'set() 실패'); + +assert.strictEqual(alist.contains(350), true, 'contains() 실패'); +assert.strictEqual(alist.contains(301), false, 'contains() 실패'); + +assert.strictEqual(alist.indexOf(350), 1, 'indexOf() 실패'); +assert.strictEqual(alist.indexOf(500), -1, 'indexOf() 실패'); + +assert.strictEqual(alist.size(), 4, 'size() 실패'); + +assert.strictEqual(alist.isEmpty, false, 'isEmpty() 실패'); +alist.clear(); +assert.strictEqual(alist.isEmpty, true, 'isEmpty() 실패2'); + +alist.add(45); +alist.add(55); +alist.add(65); +const iterator = alist.iterator(); + +const firstIter = iterator.next(); +assert.deepStrictEqual(firstIter.value, 65, 'iterator() 1 실패'); +assert.strictEqual(firstIter.done, false, 'iterator() 1 done 실패'); + +const secondIter = iterator.next(); +assert.deepStrictEqual(secondIter.value, 55, 'iterator() 2 실패'); +assert.strictEqual(secondIter.done, false, 'iterator() 2 done 실패'); + +const thirdIter = iterator.next(); +assert.deepStrictEqual(thirdIter.value, 45, 'iterator() 3 실패'); +assert.strictEqual(thirdIter.done, false, 'iterator() 3 done 실패'); + +const fourthIter = iterator.next(); +assert.strictEqual(fourthIter.value, undefined, 'iterator() 4 실패'); +assert.strictEqual(fourthIter.done, true, 'iterator() 실패'); + +assert.deepStrictEqual(alist.toArray(), [45, 55, 65], 'toArray() 실패'); diff --git "a/\354\240\225\354\227\260\354\261\204/ex10.ts" "b/\354\240\225\354\227\260\354\261\204/ex10.ts" index 1ffaef5..92d6f8f 100644 --- "a/\354\240\225\354\227\260\354\261\204/ex10.ts" +++ "b/\354\240\225\354\227\260\354\261\204/ex10.ts" @@ -66,6 +66,64 @@ class Stack extends Collection {} class Queue extends Collection {} // ArrayList 클래스를 작성하세요. -class ArrayList extends Collection {} +class ArrayList extends Collection { + constructor(...args: T[]) { + super(...args); + } + + add(value: T, index?: number): void { + if (index === undefined) { + this._arr.push(value); + } else { + this._arr.splice(index, 0, value); + } + } + + get(index: number): T | undefined { + return this._arr[index]; + } + + removeValue(value: T): boolean { + const index = this.indexOf(value); + if (index !== -1) { + this._arr.splice(index, 1); + return true; + } + return false; + } + + removeByIndex(index: number): T | undefined { + if (index >= 0 && index < this.length) { + return this._arr.splice(index, 1)[0]; + } + return undefined; + } + + set(index: number, value: T): void { + if (index >= 0 && index < this.length) { + this._arr[index] = value; + } + } + + contains(value: T): boolean { + return this._arr.includes(value); + } + + indexOf(value: T): number { + return this._arr.indexOf(value); + } + + size(): number { + return this.length; + } + + toArray(): T[] { + return [...this._arr]; + } + + toString(): string { + return `ArrayList(${this.size()}) { ${this._arr.map((v) => `value: ${v}`).join(', ')} }`; + } +} export { Stack, Queue, ArrayList }; diff --git "a/\354\240\225\354\227\260\354\261\204/ex2.js" "b/\354\240\225\354\227\260\354\261\204/ex2.js" index 6b95f04..be51e17 100644 --- "a/\354\240\225\354\227\260\354\261\204/ex2.js" +++ "b/\354\240\225\354\227\260\354\261\204/ex2.js" @@ -1,4 +1,34 @@ -// range 함수를 작성하세요. -const range = (start, end, step = start > end ? -1 : 1) => { }; +const range = (start, end, step = start > end ? -1 : 1) => { + let result = []; + + const add = (a, b) => { + return parseFloat((a + b).toFixed(10)); + }; -module.exports = { range }; + if (end === undefined) { + if (start === 0) + return [0]; + + if (start > 0) { + end = start; + start = 1; + } else { + end = -1; + } + } + + if (step === 0) + return [start]; + + if ((start > end && step > 0) || (start < end && step < 0)) { + return result; + } + + for (let i = start; step > 0 ? i <= end : i >= end; i = add(i, step)) { + result.push(i); + } + + return result; + }; + + module.exports = { range }; \ No newline at end of file diff --git "a/\354\240\225\354\227\260\354\261\204/ex3.js" "b/\354\240\225\354\227\260\354\261\204/ex3.js" index b1b0d75..36c57f1 100644 --- "a/\354\240\225\354\227\260\354\261\204/ex3.js" +++ "b/\354\240\225\354\227\260\354\261\204/ex3.js" @@ -1,3 +1,26 @@ Array.prototype.sortBy = function (sortProp = '') { - return this; -}; + + const str = sortProp.split(',').map(s => { + const [key, order] = s.split(':'); + return { + key: key.trim(), + order: (order && order.trim().toLowerCase()) === 'desc' ? -1 : 1 + }; + }); + + const compare = (a, b, key, order) => { + if (a[key] > b[key]) return order; + if (a[key] < b[key]) return (-1) * order; + return 0; + }; + + return this.sort((a, b) => { + return str.reduce((result, { key, order }) => { + + if (result !== 0) + return result; + + return compare(a, b, key, order); + }, 0); + }); +}; \ No newline at end of file diff --git "a/\354\240\225\354\227\260\354\261\204/ex3.test.js" "b/\354\240\225\354\227\260\354\261\204/ex3.test.js" index 6c27a4d..1628e15 100644 --- "a/\354\240\225\354\227\260\354\261\204/ex3.test.js" +++ "b/\354\240\225\354\227\260\354\261\204/ex3.test.js" @@ -8,11 +8,11 @@ const users = [lee, hong, kim]; assert.deepStrictEqual(users.sortBy('id'), [hong, kim, lee]); assert.deepStrictEqual(users.sortBy('name:desc'), [lee, kim, hong]); -assert.deepStrictEqual(users.sortBy('dept:desc,city:asc'), [hong, lee, kim]); +assert.deepStrictEqual(users.sortBy('dept:desc,city:asc'), [lee, kim, hong]); assert.deepStrictEqual(users.sortBy('dept:desc,city:desc'), [kim, lee, hong]); assert.deepStrictEqual(users.sortBy('name:desc,id:,dept:desc'), [ - kim, lee, + kim, hong, ]); -assert.deepStrictEqual(users.sortBy('dept:desc,id'), [hong, kim, lee]); +assert.deepStrictEqual(users.sortBy('dept:desc,id'), [kim, lee, hong]); diff --git "a/\354\240\225\354\227\260\354\261\204/ex4.js" "b/\354\240\225\354\227\260\354\261\204/ex4.js" index 9ede02f..13a52cd 100644 --- "a/\354\240\225\354\227\260\354\261\204/ex4.js" +++ "b/\354\240\225\354\227\260\354\261\204/ex4.js" @@ -1,3 +1,61 @@ -function deepCopy(obj) {} +function objectCopy(obj, wm) { + const objCopy = Object.create(Object.getPrototypeOf(obj)); + wm.set(obj, objCopy); + + + Object.getOwnPropertyNames(obj).forEach((key) => { + objCopy[key] = deepCopy(obj[key], wm); + }); + + Object.getOwnPropertySymbols(obj).forEach((sym) => { + objCopy[sym] = deepCopy(obj[sym], wm); + }); + + return objCopy; +} + +function arrayCopy(arr, wm) { + const arrCopy = []; + wm.set(arr, arrCopy); + arr.forEach((item, index) => { + arrCopy[index] = deepCopy(item, wm); + }); + return arrCopy; +} + +function setCopy(set, wm) { + const setCopy = new Set(); + wm.set(set, setCopy); + set.forEach((value) => { + setCopy.add(deepCopy(value, wm)); + }); + return setCopy; +} + +function mapCopy(map, wm) { + const mapCopy = new Map(); + wm.set(map, mapCopy); + map.forEach((value, key) => { + mapCopy.set(deepCopy(key, wm), deepCopy(value, wm)); + }); + return mapCopy; +} + +function deepCopy(obj, wm = new WeakMap()) { + if (obj === null || typeof obj !== "object") return obj; + + if (wm.has(obj)) return wm.get(obj); + + if (Array.isArray(obj)) + return arrayCopy(obj, wm); + if (obj instanceof Set) + return setCopy(obj, wm); + if (obj instanceof Map) + return mapCopy(obj, wm); + if (obj instanceof WeakSet || obj instanceof WeakMap) + return obj; + + return objectCopy(obj, wm); +} module.exports = { deepCopy }; diff --git "a/\354\240\225\354\227\260\354\261\204/ex5.js" "b/\354\240\225\354\227\260\354\261\204/ex5.js" index 464a05a..e43af8d 100644 --- "a/\354\240\225\354\227\260\354\261\204/ex5.js" +++ "b/\354\240\225\354\227\260\354\261\204/ex5.js" @@ -1,3 +1,42 @@ module.exports = { - searchByKoreanInitialSound: (data, firstSounds) => {}, -}; + searchByKoreanInitialSound: (data, firstSounds) => { + const HangulList = [ + "ㄱ", + "ㄲ", + "ㄴ", + "ㄷ", + "ㄸ", + "ㄹ", + "ㅁ", + "ㅂ", + "ㅃ", + "ㅅ", + "ㅆ", + "ㅇ", + "ㅈ", + "ㅉ", + "ㅊ", + "ㅋ", + "ㅌ", + "ㅍ", + "ㅎ", + ]; + + const getHangul = (ch) => { + const code = ch.charCodeAt(0) - 0xac00; + return code >= 0 && code < 11172 ? HangulList[Math.floor(code / 588)] : ch; + }; + + const regex = new RegExp( + firstSounds + .split("") + .map((char) => (/[ㄱ-ㅎ]/.test(char) ? char : `(${char})`)) + .join(".*?") + ); + + return data.filter((item) => { + const hangulStr = item.split("").map(getHangul).join(""); + return regex.test(hangulStr); + }); + }, +}; \ No newline at end of file diff --git "a/\354\240\225\354\227\260\354\261\204/ex6.test.ts" "b/\354\240\225\354\227\260\354\261\204/ex6.test.ts" index 680c5e6..41abbf6 100644 --- "a/\354\240\225\354\227\260\354\261\204/ex6.test.ts" +++ "b/\354\240\225\354\227\260\354\261\204/ex6.test.ts" @@ -8,7 +8,7 @@ import { promiseAllSettled, randTime } from './ex6'; ); })(); -(async function testWithReject() { +(async function testWithReject() { assert.deepStrictEqual( await promiseAllSettled([ randTime(11), @@ -22,3 +22,4 @@ import { promiseAllSettled, randTime } from './ex6'; ]) ); })(); + diff --git "a/\354\240\225\354\227\260\354\261\204/ex6.ts" "b/\354\240\225\354\227\260\354\261\204/ex6.ts" index 424ca54..29ad355 100644 --- "a/\354\240\225\354\227\260\354\261\204/ex6.ts" +++ "b/\354\240\225\354\227\260\354\261\204/ex6.ts" @@ -1,4 +1,48 @@ export const randTime = (val: T): Promise => - new Promise(resolve => setTimeout(resolve, Math.random() * 1000, val)); + new Promise((resolve) => setTimeout(resolve, Math.random() * 1000, val)); -export function promiseAllSettled(promises: Promise[]) {} +export function promiseAllSettled( + promises: Promise[] +): Promise[]> { + return new Promise((resolve) => { + const results: PromiseSettledResult[] = []; + let cnt = 0; + + const result = (i: number, v: PromiseSettledResult) => { + results[i] = v; + cnt++; + if (cnt === promises.length) { + resolve(results); + } + }; + + promises.forEach((promise, i) => { + promise + .then((value) => + result(i, { status: "fulfilled", value } as const) + ) + .catch((reason) => + result(i, { status: "rejected", reason } as const) + ); + }); + }); +} + +export function promiseAll(promises: Promise[]): Promise { + return new Promise((resolve, reject) => { + const results: T[] = []; + let cnt = 0; + + const result = (i: number, v: T) => { + results[i] = v; + cnt++; + if (cnt === promises.length) { + resolve(results); + } + }; + + promises.forEach((promise, i) => { + promise.then((v) => result(i, v)).catch(reject); + }); + }); +} \ No newline at end of file diff --git "a/\354\240\225\354\227\260\354\261\204/ex7.test.ts" "b/\354\240\225\354\227\260\354\261\204/ex7.test.ts" index 62b881d..72b684b 100644 --- "a/\354\240\225\354\227\260\354\261\204/ex7.test.ts" +++ "b/\354\240\225\354\227\260\354\261\204/ex7.test.ts" @@ -65,6 +65,10 @@ async function test(userId: string | number) { }); // 추가 테스트 코드를 작성하시오. + + const emptyPosts = await getPosts(999); + assert.strictEqual(emptyPosts.length, 0); } test(1); + diff --git "a/\354\240\225\354\227\260\354\261\204/ex7.ts" "b/\354\240\225\354\227\260\354\261\204/ex7.ts" index 62812ac..4e2d1d8 100644 --- "a/\354\240\225\354\227\260\354\261\204/ex7.ts" +++ "b/\354\240\225\354\227\260\354\261\204/ex7.ts" @@ -1,3 +1,53 @@ +// const POST_URL = 'https://jsonplaceholder.typicode.com/posts'; + +// export async function getPosts(userId: number | string) {} + const POST_URL = 'https://jsonplaceholder.typicode.com/posts'; -export async function getPosts(userId: number | string) {} +interface Comment { + postId: number; + id: number; + email: string; + body: string; +} + +interface Post { + postId: number; + title: string; + comments: Comment[]; +} + +export async function getPosts(userId: number | string) { + try { + // 1. 특정 userId의 게시글 목록을 가져옵니다. + const postsResponse = await fetch(`${POST_URL}?userId=${userId}`); + const postsData = (await postsResponse.json()) as { id: number; title: string }[]; + + // 2. 각 게시글의 댓글 목록을 가져와서 posts 배열에 추가합니다. + const postsWithComments: Post[] = await Promise.all( + postsData.map(async (post) => { + const commentsResponse = await fetch(`${POST_URL}/${post.id}/comments`); + const commentsData = (await commentsResponse.json()) as any[]; + + // 'name' 필드를 제거하고 새로운 Comment 객체 배열을 생성합니다. + const sanitizedCommentsData: Comment[] = commentsData.map(({ postId, id, email, body }) => ({ + postId, + id, + email, + body, + })); + + return { + postId: post.id, + title: post.title, + comments: sanitizedCommentsData, + }; + }) + ); + + return postsWithComments; + } catch (error) { + console.error('오류1', error); + throw new Error('오류2'); + } +} diff --git "a/\354\240\225\354\227\260\354\261\204/ex8.ts" "b/\354\240\225\354\227\260\354\261\204/ex8.ts" index a67a2d2..a67e90a 100644 --- "a/\354\240\225\354\227\260\354\261\204/ex8.ts" +++ "b/\354\240\225\354\227\260\354\261\204/ex8.ts" @@ -1,8 +1,40 @@ -// dummy(mock)입니다. 올바르게 수정하세요. -const debounce = (cb: any, delay: number) => (i: number) => {}; -const throttle = (cb: any, delay: number) => (i: number) => {}; +// // dummy(mock)입니다. 올바르게 수정하세요. +// const debounce = (cb: any, delay: number) => (i: number) => {}; +// const throttle = (cb: any, delay: number) => (i: number) => {}; -// function throttle... +// // function throttle... + +// const debo = debounce((a: number) => console.log(a + 1), 500); +// for (let i = 10; i < 15; i++) debo(i); // 15 출력 + +// const thro = throttle((a: number) => console.log(a + 1), 500); +// for (let i = 10; i < 15; i++) thro(i); // 11 출력 + + + +const debounce = (cb: (arg: number) => void, delay: number) => { + let time: ReturnType | null = null; + + return (i: number) => { + if (time !== null) clearTimeout(time); + + time = setTimeout(() => { + cb(i); + }, delay); + }; +}; + +const throttle = (cb: (arg: number) => void, delay: number) => { + let time = 0; + + return (i: number) => { + const now = Date.now(); + if (now - time >= delay) { + cb(i); + time = now; + } + }; +}; const debo = debounce((a: number) => console.log(a + 1), 500); for (let i = 10; i < 15; i++) debo(i); // 15 출력 From 93b48dfc9c098951b331815a7e8ff38089d29401 Mon Sep 17 00:00:00 2001 From: yeonchae115 Date: Fri, 13 Sep 2024 15:16:04 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=EC=88=98=EC=A0=95=20=ED=9B=84=202=EC=B0=A8?= =?UTF-8?q?=20=EC=A0=9C=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ex10.test.ts" | 122 +++--- .../ex10.ts" | 349 ++++++++++++++---- 2 files changed, 345 insertions(+), 126 deletions(-) diff --git "a/\354\240\225\354\227\260\354\261\204/ex10.test.ts" "b/\354\240\225\354\227\260\354\261\204/ex10.test.ts" index 34717c8..19d585b 100644 --- "a/\354\240\225\354\227\260\354\261\204/ex10.test.ts" +++ "b/\354\240\225\354\227\260\354\261\204/ex10.test.ts" @@ -3,66 +3,96 @@ import assert from 'assert'; console.log('🚀 ArrayList:', ArrayList); -const alist = new ArrayList(4, 7); -console.log('list:', alist.toString()); +console.log(ArrayList.listToArray({ value: 1, rest: { value: 2, rest: null } })); +console.log(ArrayList.arrayToList([1, 2])); + +const alist = new ArrayList([1, 2]); +console.log(alist.toString()); +alist.add(3); +console.log(alist.toString()); +alist.add(5, 1); +console.log(alist.toString()); +alist.remove(2); +console.log(alist.toString()); +alist.add(22, 1); +console.log(alist.toString()); +alist.add(33, 1); +console.log(alist.toString()); +alist.set(1, 300); +console.log(alist.toString()); +console.log(alist.get(2)); +console.log(alist.size()); +console.log(alist.indexOf(300)); +console.log(alist.contains(300)); +console.log(alist.contains(301)); +console.log(alist.isEmpty()); +console.log(alist.peek()); +console.log(alist.toArray()); +console.log(alist.iterator().next()); +alist.clear(); +console.log(alist.toString()); -alist.add(8); // [4, 7, 8] -alist.add(15, 1); // [4, 15, 7, 8] -assert.deepStrictEqual(alist.toArray(), [4, 15, 7, 8], 'add() 실패'); -alist.add(25, 2); // [4, 15, 25, 7, 8] -alist.add(40, 0); // [40, 4, 15, 25, 7, 8] -assert.deepStrictEqual(alist.toArray(), [40, 4, 15, 25, 7, 8], 'add() with index 실패'); +// const alist = new ArrayList([1, 2]); +// console.log('list:', alist.toString()); -const removedValue = alist.removeByIndex(1); // [40, 15, 25, 7, 8] -assert.strictEqual(removedValue, 4, 'removeByIndex 실패'); -assert.deepStrictEqual(alist.toArray(), [40, 15, 25, 7, 8], 'removeByIndex 실패'); +// alist.add(8); // [4, 7, 8] +// alist.add(15, 1); // [4, 15, 7, 8] +// assert.deepStrictEqual(alist.toArray(), [4, 15, 7, 8], 'add() 실패'); -const removedResult = alist.removeValue(25); // [40, 15, 7, 8] -assert.strictEqual(removedResult, true, 'removeValue 실패'); -assert.deepStrictEqual(alist.toArray(), [40, 15, 7, 8], 'removeValue 실패'); +// alist.add(25, 2); // [4, 15, 25, 7, 8] +// alist.add(40, 0); // [40, 4, 15, 25, 7, 8] +// assert.deepStrictEqual(alist.toArray(), [40, 4, 15, 25, 7, 8], 'add() with index 실패'); -const failedRemove = alist.removeValue(100); // 값이 없으므로 false -assert.strictEqual(failedRemove, false, 'removeValue 실패 2'); +// // const removedValue = alist.removeByIndex(1); // [40, 15, 25, 7, 8] +// // assert.strictEqual(removedValue, 4, 'removeByIndex 실패'); +// // assert.deepStrictEqual(alist.toArray(), [40, 15, 25, 7, 8], 'removeByIndex 실패'); -assert.strictEqual(alist.get(0), 40, 'get() 실패'); -assert.strictEqual(alist.get(2), 7, 'get() 실패'); -assert.strictEqual(alist.get(10), undefined, 'get() 실패 2'); +// // const removedResult = alist.removeValue(25); // [40, 15, 7, 8] +// // assert.strictEqual(removedResult, true, 'removeValue 실패'); +// // assert.deepStrictEqual(alist.toArray(), [40, 15, 7, 8], 'removeValue 실패'); -alist.set(1, 350); // [40, 350, 7, 8] -assert.deepStrictEqual(alist.toArray(), [40, 350, 7, 8], 'set() 실패'); +// const failedRemove = alist.remove(100); // 값이 없으므로 false +// assert.strictEqual(failedRemove, false, 'removeValue 실패 2'); -assert.strictEqual(alist.contains(350), true, 'contains() 실패'); -assert.strictEqual(alist.contains(301), false, 'contains() 실패'); +// assert.strictEqual(alist.get(0), 40, 'get() 실패'); +// assert.strictEqual(alist.get(2), 7, 'get() 실패'); +// assert.strictEqual(alist.get(10), undefined, 'get() 실패 2'); -assert.strictEqual(alist.indexOf(350), 1, 'indexOf() 실패'); -assert.strictEqual(alist.indexOf(500), -1, 'indexOf() 실패'); +// alist.set(1, 350); // [40, 350, 7, 8] +// assert.deepStrictEqual(alist.toArray(), [40, 350, 7, 8], 'set() 실패'); -assert.strictEqual(alist.size(), 4, 'size() 실패'); +// assert.strictEqual(alist.contains(350), true, 'contains() 실패'); +// assert.strictEqual(alist.contains(301), false, 'contains() 실패'); -assert.strictEqual(alist.isEmpty, false, 'isEmpty() 실패'); -alist.clear(); -assert.strictEqual(alist.isEmpty, true, 'isEmpty() 실패2'); +// assert.strictEqual(alist.indexOf(350), 1, 'indexOf() 실패'); +// assert.strictEqual(alist.indexOf(500), -1, 'indexOf() 실패'); + +// assert.strictEqual(alist.size(), 4, 'size() 실패'); + +// assert.strictEqual(alist.isEmpty, false, 'isEmpty() 실패'); +// alist.clear(); +// assert.strictEqual(alist.isEmpty, true, 'isEmpty() 실패2'); -alist.add(45); -alist.add(55); -alist.add(65); -const iterator = alist.iterator(); +// alist.add(45); +// alist.add(55); +// alist.add(65); +// const iterator = alist.iterator(); -const firstIter = iterator.next(); -assert.deepStrictEqual(firstIter.value, 65, 'iterator() 1 실패'); -assert.strictEqual(firstIter.done, false, 'iterator() 1 done 실패'); +// const firstIter = iterator.next(); +// assert.deepStrictEqual(firstIter.value, 65, 'iterator() 1 실패'); +// assert.strictEqual(firstIter.done, false, 'iterator() 1 done 실패'); -const secondIter = iterator.next(); -assert.deepStrictEqual(secondIter.value, 55, 'iterator() 2 실패'); -assert.strictEqual(secondIter.done, false, 'iterator() 2 done 실패'); +// const secondIter = iterator.next(); +// assert.deepStrictEqual(secondIter.value, 55, 'iterator() 2 실패'); +// assert.strictEqual(secondIter.done, false, 'iterator() 2 done 실패'); -const thirdIter = iterator.next(); -assert.deepStrictEqual(thirdIter.value, 45, 'iterator() 3 실패'); -assert.strictEqual(thirdIter.done, false, 'iterator() 3 done 실패'); +// const thirdIter = iterator.next(); +// assert.deepStrictEqual(thirdIter.value, 45, 'iterator() 3 실패'); +// assert.strictEqual(thirdIter.done, false, 'iterator() 3 done 실패'); -const fourthIter = iterator.next(); -assert.strictEqual(fourthIter.value, undefined, 'iterator() 4 실패'); -assert.strictEqual(fourthIter.done, true, 'iterator() 실패'); +// const fourthIter = iterator.next(); +// assert.strictEqual(fourthIter.value, undefined, 'iterator() 4 실패'); +// assert.strictEqual(fourthIter.done, true, 'iterator() 실패'); -assert.deepStrictEqual(alist.toArray(), [45, 55, 65], 'toArray() 실패'); +// assert.deepStrictEqual(alist.toArray(), [45, 55, 65], 'toArray() 실패'); \ No newline at end of file diff --git "a/\354\240\225\354\227\260\354\261\204/ex10.ts" "b/\354\240\225\354\227\260\354\261\204/ex10.ts" index 92d6f8f..a35e855 100644 --- "a/\354\240\225\354\227\260\354\261\204/ex10.ts" +++ "b/\354\240\225\354\227\260\354\261\204/ex10.ts" @@ -1,129 +1,318 @@ -class Collection { - private readonly arr = Array(); +// class Collection { +// private readonly arr = Array(); - constructor(...args: T[]) { - this.arr.push(...args); - } +// constructor(...args: T[]) { +// this.arr.push(...args); +// } - get _arr() { - return this.arr; - } +// get _arr() { +// return this.arr; +// } - push(...args: T[]) { - this.arr.push(...args); - return this.arr; - } +// push(...args: T[]) { +// this.arr.push(...args); +// return this.arr; +// } - get peek(): T | undefined { - return this.isQueue() ? this.arr[0] : this.arr.at(-1); - } +// get peek(): T | undefined { +// return this.isQueue() ? this.arr[0] : this.arr.at(-1); +// } - get poll(): T | undefined { - return this.isQueue() ? this.arr.shift() : this.arr.pop(); - } +// get poll(): T | undefined { +// return this.isQueue() ? this.arr.shift() : this.arr.pop(); +// } - remove() { - return this.poll; - } +// remove() { +// return this.poll; +// } - get length() { - return this.arr.length; - } +// get length() { +// return this.arr.length; +// } - get isEmpty() { - return !this.arr.length; - } +// get isEmpty() { +// return !this.arr.length; +// } - clear() { - this.arr.length = 0; - } +// clear() { +// this.arr.length = 0; +// } - iterator() { - return this[Symbol.iterator](); - } +// iterator() { +// return this[Symbol.iterator](); +// } - // [1, 2, 3] - *[Symbol.iterator]() { - for (let i = this.length - 1; i >= 0; i -= 1) { - yield this.toArray()[i]; - } - } +// // [1, 2, 3] +// *[Symbol.iterator]() { +// for (let i = this.length - 1; i >= 0; i -= 1) { +// yield this.toArray()[i]; +// } +// } - toArray() { - return this.isQueue() ? this.arr.toReversed() : this.arr; - } +// toArray() { +// return this.isQueue() ? this.arr.toReversed() : this.arr; +// } - print() { - console.log(`<${this.constructor.name}: [${this.toArray()}]>`); - } +// print() { +// console.log(`<${this.constructor.name}: [${this.toArray()}]>`); +// } - private isQueue() { - return this instanceof Queue; - } +// private isQueue() { +// return this instanceof Queue; +// } +// } + +// class Stack extends Collection {} +// class Queue extends Collection {} + +// // ArrayList 클래스를 작성하세요. +// class ArrayList extends Collection { +// constructor(...args: T[]) { +// super(...args); +// } + +// add(value: T, index?: number): void { +// if (index === undefined) { +// this._arr.push(value); +// } else { +// this._arr.splice(index, 0, value); +// } +// } + +// get(index: number): T | undefined { +// return this._arr[index]; +// } + +// removeValue(value: T): boolean { +// const index = this.indexOf(value); +// if (index !== -1) { +// this._arr.splice(index, 1); +// return true; +// } +// return false; +// } + +// removeByIndex(index: number): T | undefined { +// if (index >= 0 && index < this.length) { +// return this._arr.splice(index, 1)[0]; +// } +// return undefined; +// } + +// set(index: number, value: T): void { +// if (index >= 0 && index < this.length) { +// this._arr[index] = value; +// } +// } + +// contains(value: T): boolean { +// return this._arr.includes(value); +// } + +// indexOf(value: T): number { +// return this._arr.indexOf(value); +// } + +// size(): number { +// return this.length; +// } + +// toArray(): T[] { +// return [...this._arr]; +// } + +// toString(): string { +// return `ArrayList(${this.size()}) { ${this._arr.map((v) => `value: ${v}`).join(', ')} }`; +// } +// } + +// export { Stack, Queue, ArrayList }; + +/********************************************************************************************************************** */ +interface Collection { + add(value: T, index?: number): void; + remove(index: number): void; + clear(): void; + contains(value: T): boolean; + size(): number; + isEmpty(): boolean; + toArray(): T[]; + iterator(): Iterator; } -class Stack extends Collection {} -class Queue extends Collection {} +interface ListNode { + value: T; + rest: ListNode | null; +} -// ArrayList 클래스를 작성하세요. -class ArrayList extends Collection { - constructor(...args: T[]) { - super(...args); - } +class ArrayList implements Collection { + private head: ListNode | null = null; + private length: number = 0; - add(value: T, index?: number): void { - if (index === undefined) { - this._arr.push(value); - } else { - this._arr.splice(index, 0, value); + constructor(array: T[] = []) { + this.clear(); + if (Array.isArray(array)) { + array.forEach((item) => this.add(item)); } } - get(index: number): T | undefined { - return this._arr[index]; + clear(): void { + this.head = null; + this.length = 0; } - removeValue(value: T): boolean { - const index = this.indexOf(value); - if (index !== -1) { - this._arr.splice(index, 1); - return true; + add(value: T, index: number = this.size()): void { + if (index < 0 || index > this.size()) throw new Error('Index out of bounds'); + + const newNode: ListNode = { value, rest: null }; + + if (index === 0) { + newNode.rest = this.head; + this.head = newNode; + } else { + const prevNode = this._getNode(index - 1); + newNode.rest = prevNode.rest; + prevNode.rest = newNode; } - return false; + + this.length++; } - removeByIndex(index: number): T | undefined { - if (index >= 0 && index < this.length) { - return this._arr.splice(index, 1)[0]; + remove(index: number): void { + if (index < 0 || index >= this.size()) throw new Error('Index out of bounds'); + + if (index === 0) { + this.head = this.head!.rest; + } else { + const prevNode = this._getNode(index - 1); + prevNode.rest = prevNode.rest!.rest; } - return undefined; + + this.length--; } set(index: number, value: T): void { - if (index >= 0 && index < this.length) { - this._arr[index] = value; - } + const node = this._getNode(index); + node.value = value; + } + + get(index: number): T { + return this._getNode(index).value; } contains(value: T): boolean { - return this._arr.includes(value); + return this.indexOf(value) !== -1; } indexOf(value: T): number { - return this._arr.indexOf(value); + let currentNode = this.head; + let index = 0; + while (currentNode) { + if (currentNode.value === value) return index; + currentNode = currentNode.rest; + index++; + } + return -1; + } + + peek(): T | undefined { + if (!this.head) return undefined; + return this.head.value; } size(): number { return this.length; } + isEmpty(): boolean { + return this.size() === 0; + } + toArray(): T[] { - return [...this._arr]; + const result: T[] = []; + let currentNode = this.head; + while (currentNode) { + result.push(currentNode.value); + currentNode = currentNode.rest; + } + return result; } toString(): string { - return `ArrayList(${this.size()}) { ${this._arr.map((v) => `value: ${v}`).join(', ')} }`; + return `ArrayList(${this.size()}) ${JSON.stringify(this.head)}`; + } + + iterator(): Iterator { + let currentNode = this.head; + return { + next: (): IteratorResult => { + if (!currentNode) { + return { value: undefined, done: true }; + } + const value = currentNode.value; + currentNode = currentNode.rest; + return { value, done: false }; + } + }; + } + + private _getNode(index: number): ListNode { + if (index < 0 || index >= this.size()) throw new Error('Index out of bounds'); + let currentNode = this.head; + for (let i = 0; i < index; i++) { + currentNode = currentNode!.rest; + } + return currentNode!; + } + + static listToArray(list: ListNode | null): T[] { + const array: T[] = []; + let current = list; + while (current) { + array.push(current.value); + current = current.rest; + } + return array; + } + + static arrayToList(array: T[]): ListNode | null { + let head: ListNode | null = null; + for (let i = array.length - 1; i >= 0; i--) { + head = { value: array[i], rest: head }; + } + return head; } } -export { Stack, Queue, ArrayList }; +export {ArrayList }; + +// console.log(ArrayList.listToArray({ value: 1, rest: { value: 2, rest: null } })); //⇒ [1,2] +// console.log(ArrayList.arrayToList([1, 2])); //⇒ { value: 1, rest: { value: 2, rest: null } } + +// const alist = new ArrayList([1, 2]); +// console.log(alist.toString()); +// alist.add(3); +// console.log(alist.toString()); +// alist.add(5, 1); +// console.log(alist.toString()); +// alist.remove(2); +// console.log(alist.toString()); +// alist.add(22, 1); +// console.log(alist.toString()); +// alist.add(33, 1); +// console.log(alist.toString()); +// alist.set(1, 300); +// console.log(alist.toString()); +// console.log(alist.get(2)); +// console.log(alist.size()); +// console.log(alist.indexOf(300)); +// console.log(alist.contains(300)); +// console.log(alist.contains(301)); +// console.log(alist.isEmpty()); +// console.log(alist.peek()); +// console.log(alist.toArray()); +// console.log(alist.iterator().next()); +// alist.clear(); +// console.log(alist.toString()); + +