From 6469ae7bbb67595eaf23c54c332630e1b5bb343c Mon Sep 17 00:00:00 2001 From: suzinlim <122861956+suzinlim@users.noreply.github.com> Date: Wed, 11 Sep 2024 21:40:20 +0900 Subject: [PATCH 1/2] test: fix ex3 test code --- "\354\236\204\354\210\230\354\247\204/ex3.test.js" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/\354\236\204\354\210\230\354\247\204/ex3.test.js" "b/\354\236\204\354\210\230\354\247\204/ex3.test.js" index 6c27a4d..bc37804 100644 --- "a/\354\236\204\354\210\230\354\247\204/ex3.test.js" +++ "b/\354\236\204\354\210\230\354\247\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]); \ No newline at end of file From f0b7dabf7ea5f2b04894385da0ae309d6e1c5950 Mon Sep 17 00:00:00 2001 From: suzinlim <122861956+suzinlim@users.noreply.github.com> Date: Fri, 13 Sep 2024 15:45:16 +0900 Subject: [PATCH 2/2] submit assignment --- package.json | 11 +- .../ex1/assets/images/kakao.png" | Bin 0 -> 11410 bytes .../ex1/assets/images/naver.png" | Bin 0 -> 1136 bytes .../ex1/assets/images/next.js.svg" | 31 + .../ex1/assets/images/onion.jpg" | Bin 0 -> 69697 bytes .../ex1/assets/images/tailwind-css.svg" | 32 + .../ex1/assets/images/youtube.svg" | 1 + .../ex1/book-edit.html" | 0 .../ex1/index.html" | 0 .../ex1/register.html" | 0 .../ex1/src/book-edit.html" | 94 ++ .../ex1/src/index.html" | 153 +++ .../ex1/src/input.css" | 3 + .../ex1/src/output.css" | 1185 +++++++++++++++++ .../ex1/src/register.html" | 82 ++ .../ex1/tailwind.config.js" | 8 + .../ex10.test.ts" | 52 +- .../ex10.ts" | 287 +++- "\354\236\204\354\210\230\354\247\204/ex2.js" | 41 +- "\354\236\204\354\210\230\354\247\204/ex3.js" | 18 +- "\354\236\204\354\210\230\354\247\204/ex4.js" | 70 +- "\354\236\204\354\210\230\354\247\204/ex5.js" | 55 +- .../ex6.test.ts" | 2 +- "\354\236\204\354\210\230\354\247\204/ex6.ts" | 17 +- .../ex7.test.ts" | 53 +- "\354\236\204\354\210\230\354\247\204/ex7.ts" | 62 +- "\354\236\204\354\210\230\354\247\204/ex8.ts" | 25 +- 27 files changed, 2194 insertions(+), 88 deletions(-) create mode 100644 "\354\236\204\354\210\230\354\247\204/ex1/assets/images/kakao.png" create mode 100644 "\354\236\204\354\210\230\354\247\204/ex1/assets/images/naver.png" create mode 100644 "\354\236\204\354\210\230\354\247\204/ex1/assets/images/next.js.svg" create mode 100644 "\354\236\204\354\210\230\354\247\204/ex1/assets/images/onion.jpg" create mode 100644 "\354\236\204\354\210\230\354\247\204/ex1/assets/images/tailwind-css.svg" create mode 100644 "\354\236\204\354\210\230\354\247\204/ex1/assets/images/youtube.svg" delete mode 100644 "\354\236\204\354\210\230\354\247\204/ex1/book-edit.html" delete mode 100644 "\354\236\204\354\210\230\354\247\204/ex1/index.html" delete mode 100644 "\354\236\204\354\210\230\354\247\204/ex1/register.html" create mode 100644 "\354\236\204\354\210\230\354\247\204/ex1/src/book-edit.html" create mode 100644 "\354\236\204\354\210\230\354\247\204/ex1/src/index.html" create mode 100644 "\354\236\204\354\210\230\354\247\204/ex1/src/input.css" create mode 100644 "\354\236\204\354\210\230\354\247\204/ex1/src/output.css" create mode 100644 "\354\236\204\354\210\230\354\247\204/ex1/src/register.html" create mode 100644 "\354\236\204\354\210\230\354\247\204/ex1/tailwind.config.js" diff --git a/package.json b/package.json index c356ea8..0611333 100644 --- a/package.json +++ b/package.json @@ -11,5 +11,14 @@ "TS" ], "author": "indiflex", - "license": "ISC" + "license": "ISC", + "devDependencies": { + "prettier": "^3.3.3", + "prettier-plugin-tailwindcss": "^0.6.6", + "tailwindcss": "^3.4.10" + }, + "dependencies": { + "@types/node": "^22.5.4", + "package.json": "^2.0.1" + } } diff --git "a/\354\236\204\354\210\230\354\247\204/ex1/assets/images/kakao.png" "b/\354\236\204\354\210\230\354\247\204/ex1/assets/images/kakao.png" new file mode 100644 index 0000000000000000000000000000000000000000..5a7ae7934f21a2b4a51acdea0e2affedb7db41bd GIT binary patch literal 11410 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 xUi9kGm#JTaWUqOLE + + + + + + + + + + + + diff --git "a/\354\236\204\354\210\230\354\247\204/ex1/assets/images/onion.jpg" "b/\354\236\204\354\210\230\354\247\204/ex1/assets/images/onion.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..1eecb94aeb2d55cdbd965cc375571abb249b6e5e GIT binary patch literal 69697 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 S38Sae3MVH_Gn)z{pa0pE9Ud|O literal 0 HcmV?d00001 diff --git "a/\354\236\204\354\210\230\354\247\204/ex1/assets/images/tailwind-css.svg" "b/\354\236\204\354\210\230\354\247\204/ex1/assets/images/tailwind-css.svg" new file mode 100644 index 0000000..c7b4103 --- /dev/null +++ "b/\354\236\204\354\210\230\354\247\204/ex1/assets/images/tailwind-css.svg" @@ -0,0 +1,32 @@ + + + + + + + diff --git "a/\354\236\204\354\210\230\354\247\204/ex1/assets/images/youtube.svg" "b/\354\236\204\354\210\230\354\247\204/ex1/assets/images/youtube.svg" new file mode 100644 index 0000000..d3fd48e --- /dev/null +++ "b/\354\236\204\354\210\230\354\247\204/ex1/assets/images/youtube.svg" @@ -0,0 +1 @@ + \ No newline at end of file diff --git "a/\354\236\204\354\210\230\354\247\204/ex1/book-edit.html" "b/\354\236\204\354\210\230\354\247\204/ex1/book-edit.html" deleted file mode 100644 index e69de29..0000000 diff --git "a/\354\236\204\354\210\230\354\247\204/ex1/index.html" "b/\354\236\204\354\210\230\354\247\204/ex1/index.html" deleted file mode 100644 index e69de29..0000000 diff --git "a/\354\236\204\354\210\230\354\247\204/ex1/register.html" "b/\354\236\204\354\210\230\354\247\204/ex1/register.html" deleted file mode 100644 index e69de29..0000000 diff --git "a/\354\236\204\354\210\230\354\247\204/ex1/src/book-edit.html" "b/\354\236\204\354\210\230\354\247\204/ex1/src/book-edit.html" new file mode 100644 index 0000000..d42e5b1 --- /dev/null +++ "b/\354\236\204\354\210\230\354\247\204/ex1/src/book-edit.html" @@ -0,0 +1,94 @@ + + + + + + + 북마크 편집 + + + + + + + +
+ +
+ +
+ +
+ + +
+ + +
+ + +
+ + +
+
+ + +
+ +
+
+ +
+

© Digital Hanaro 5기 임수진. All rights reserved.

+
+ + \ No newline at end of file diff --git "a/\354\236\204\354\210\230\354\247\204/ex1/src/index.html" "b/\354\236\204\354\210\230\354\247\204/ex1/src/index.html" new file mode 100644 index 0000000..5ed3167 --- /dev/null +++ "b/\354\236\204\354\210\230\354\247\204/ex1/src/index.html" @@ -0,0 +1,153 @@ + + + + + + + 북마크 편집 + + + + + + +
+ +
+

BookMark

+ + +
+ +
+
+ image +
+

My BookMark

+

나만의 북마크를 만들어 보세요 :)

+
+
+
+ +
+
+ + +
+
+ naver +
+

네이버

+

네이버 메인에서 다양한 정보와 유용한 컨텐츠를 만나 보세요

+
+
+
+ +
+
+ + + +
+
+ kakao +
+

Kakao

+

기술과 사람으로 더 나은 세상을 만듭니다.

+
+
+
+ +
+
+ + + +
+
+ youtube +
+

Youtube

+

YouTube에서 마음에 드는 동영상과 음악을 감상하고, 직접 만든 콘텐츠를 업로드하여 친구, 가족뿐 아니라 전 세계 사람들과 공유할 수 있습니다.

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

Study

+ + +
+ +
+
+ tailwind +
+

Tailwind CSS

+

Tailwind CSS is a utility-first CSS framework for rapidly building modern websites without ever leaving your HTML.

+
+
+
+ +
+
+ + +
+
+ nextjs +
+

Create Next App

+

Generated by create next app

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

© Digital Hanaro 5기 임수진. All rights reserved.

+
+ + \ No newline at end of file diff --git "a/\354\236\204\354\210\230\354\247\204/ex1/src/input.css" "b/\354\236\204\354\210\230\354\247\204/ex1/src/input.css" new file mode 100644 index 0000000..bd6213e --- /dev/null +++ "b/\354\236\204\354\210\230\354\247\204/ex1/src/input.css" @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; \ No newline at end of file diff --git "a/\354\236\204\354\210\230\354\247\204/ex1/src/output.css" "b/\354\236\204\354\210\230\354\247\204/ex1/src/output.css" new file mode 100644 index 0000000..9c0d472 --- /dev/null +++ "b/\354\236\204\354\210\230\354\247\204/ex1/src/output.css" @@ -0,0 +1,1185 @@ +/* +! tailwindcss v3.4.10 | MIT License | https://tailwindcss.com +*/ + +/* +1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) +2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) +*/ + +*, +::before, +::after { + box-sizing: border-box; + /* 1 */ + border-width: 0; + /* 2 */ + border-style: solid; + /* 2 */ + border-color: #e5e7eb; + /* 2 */ +} + +::before, +::after { + --tw-content: ''; +} + +/* +1. Use a consistent sensible line-height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +3. Use a more readable tab size. +4. Use the user's configured `sans` font-family by default. +5. Use the user's configured `sans` font-feature-settings by default. +6. Use the user's configured `sans` font-variation-settings by default. +7. Disable tap highlights on iOS +*/ + +html, +:host { + line-height: 1.5; + /* 1 */ + -webkit-text-size-adjust: 100%; + /* 2 */ + -moz-tab-size: 4; + /* 3 */ + -o-tab-size: 4; + tab-size: 4; + /* 3 */ + font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + /* 4 */ + font-feature-settings: normal; + /* 5 */ + font-variation-settings: normal; + /* 6 */ + -webkit-tap-highlight-color: transparent; + /* 7 */ +} + +/* +1. Remove the margin in all browsers. +2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. +*/ + +body { + margin: 0; + /* 1 */ + line-height: inherit; + /* 2 */ +} + +/* +1. Add the correct height in Firefox. +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) +3. Ensure horizontal rules are visible by default. +*/ + +hr { + height: 0; + /* 1 */ + color: inherit; + /* 2 */ + border-top-width: 1px; + /* 3 */ +} + +/* +Add the correct text decoration in Chrome, Edge, and Safari. +*/ + +abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} + +/* +Remove the default font size and weight for headings. +*/ + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit; +} + +/* +Reset links to optimize for opt-in styling instead of opt-out. +*/ + +a { + color: inherit; + text-decoration: inherit; +} + +/* +Add the correct font weight in Edge and Safari. +*/ + +b, +strong { + font-weight: bolder; +} + +/* +1. Use the user's configured `mono` font-family by default. +2. Use the user's configured `mono` font-feature-settings by default. +3. Use the user's configured `mono` font-variation-settings by default. +4. Correct the odd `em` font sizing in all browsers. +*/ + +code, +kbd, +samp, +pre { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + /* 1 */ + font-feature-settings: normal; + /* 2 */ + font-variation-settings: normal; + /* 3 */ + font-size: 1em; + /* 4 */ +} + +/* +Add the correct font size in all browsers. +*/ + +small { + font-size: 80%; +} + +/* +Prevent `sub` and `sup` elements from affecting the line height in all browsers. +*/ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) +3. Remove gaps between table borders by default. +*/ + +table { + text-indent: 0; + /* 1 */ + border-color: inherit; + /* 2 */ + border-collapse: collapse; + /* 3 */ +} + +/* +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +3. Remove default padding in all browsers. +*/ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + /* 1 */ + font-feature-settings: inherit; + /* 1 */ + font-variation-settings: inherit; + /* 1 */ + font-size: 100%; + /* 1 */ + font-weight: inherit; + /* 1 */ + line-height: inherit; + /* 1 */ + letter-spacing: inherit; + /* 1 */ + color: inherit; + /* 1 */ + margin: 0; + /* 2 */ + padding: 0; + /* 3 */ +} + +/* +Remove the inheritance of text transform in Edge and Firefox. +*/ + +button, +select { + text-transform: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Remove default button styles. +*/ + +button, +input:where([type='button']), +input:where([type='reset']), +input:where([type='submit']) { + -webkit-appearance: button; + /* 1 */ + background-color: transparent; + /* 2 */ + background-image: none; + /* 2 */ +} + +/* +Use the modern Firefox focus style for all focusable elements. +*/ + +:-moz-focusring { + outline: auto; +} + +/* +Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) +*/ + +:-moz-ui-invalid { + box-shadow: none; +} + +/* +Add the correct vertical alignment in Chrome and Firefox. +*/ + +progress { + vertical-align: baseline; +} + +/* +Correct the cursor style of increment and decrement buttons in Safari. +*/ + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +/* +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ + +[type='search'] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ +} + +/* +Remove the inner padding in Chrome and Safari on macOS. +*/ + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to `inherit` in Safari. +*/ + +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ +} + +/* +Add the correct display in Chrome and Safari. +*/ + +summary { + display: list-item; +} + +/* +Removes the default spacing and border for appropriate elements. +*/ + +blockquote, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +hr, +figure, +p, +pre { + margin: 0; +} + +fieldset { + margin: 0; + padding: 0; +} + +legend { + padding: 0; +} + +ol, +ul, +menu { + list-style: none; + margin: 0; + padding: 0; +} + +/* +Reset default styling for dialogs. +*/ + +dialog { + padding: 0; +} + +/* +Prevent resizing textareas horizontally by default. +*/ + +textarea { + resize: vertical; +} + +/* +1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) +2. Set the default placeholder color to the user's configured gray 400 color. +*/ + +input::-moz-placeholder, textarea::-moz-placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +input::placeholder, +textarea::placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +/* +Set the default cursor for buttons. +*/ + +button, +[role="button"] { + cursor: pointer; +} + +/* +Make sure disabled buttons don't get the pointer cursor. +*/ + +:disabled { + cursor: default; +} + +/* +1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) +2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) + This can trigger a poorly considered lint error in some tools but is included by design. +*/ + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; + /* 1 */ + vertical-align: middle; + /* 2 */ +} + +/* +Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) +*/ + +img, +video { + max-width: 100%; + height: auto; +} + +/* Make elements with the HTML hidden attribute stay hidden by default */ + +[hidden] { + display: none; +} + +*, ::before, ::after { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: ; +} + +::backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-gradient-from-position: ; + --tw-gradient-via-position: ; + --tw-gradient-to-position: ; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; + --tw-contain-size: ; + --tw-contain-layout: ; + --tw-contain-paint: ; + --tw-contain-style: ; +} + +.container { + width: 100%; +} + +@media (min-width: 640px) { + .container { + max-width: 640px; + } +} + +@media (min-width: 768px) { + .container { + max-width: 768px; + } +} + +@media (min-width: 1024px) { + .container { + max-width: 1024px; + } +} + +@media (min-width: 1280px) { + .container { + max-width: 1280px; + } +} + +@media (min-width: 1536px) { + .container { + max-width: 1536px; + } +} + +.fixed { + position: fixed; +} + +.absolute { + position: absolute; +} + +.relative { + position: relative; +} + +.inset-x-0 { + left: 0px; + right: 0px; +} + +.top-0 { + top: 0px; +} + +.z-50 { + z-index: 50; +} + +.-m-1\.5 { + margin: -0.375rem; +} + +.mx-auto { + margin-left: auto; + margin-right: auto; +} + +.mb-10 { + margin-bottom: 2.5rem; +} + +.mb-4 { + margin-bottom: 1rem; +} + +.mb-8 { + margin-bottom: 2rem; +} + +.ml-4 { + margin-left: 1rem; +} + +.ml-6 { + margin-left: 1.5rem; +} + +.mr-10 { + margin-right: 2.5rem; +} + +.mr-2 { + margin-right: 0.5rem; +} + +.mt-2 { + margin-top: 0.5rem; +} + +.mt-20 { + margin-top: 5rem; +} + +.mt-4 { + margin-top: 1rem; +} + +.mt-5 { + margin-top: 1.25rem; +} + +.mt-10 { + margin-top: 2.5rem; +} + +.mb-5 { + margin-bottom: 1.25rem; +} + +.mb-3 { + margin-bottom: 0.75rem; +} + +.block { + display: block; +} + +.flex { + display: flex; +} + +.h-10 { + height: 2.5rem; +} + +.h-20 { + height: 5rem; +} + +.h-5 { + height: 1.25rem; +} + +.h-8 { + height: 2rem; +} + +.h-screen { + height: 100vh; +} + +.max-h-screen { + max-height: 100vh; +} + +.max-h-10 { + max-height: 2.5rem; +} + +.min-h-screen { + min-height: 100vh; +} + +.w-1\/2 { + width: 50%; +} + +.w-10 { + width: 2.5rem; +} + +.w-20 { + width: 5rem; +} + +.w-8 { + width: 2rem; +} + +.w-full { + width: 100%; +} + +.w-max { + width: -moz-max-content; + width: max-content; +} + +.w-11\/12 { + width: 91.666667%; +} + +.w-1\/12 { + width: 8.333333%; +} + +.max-w-md { + max-width: 28rem; +} + +.max-w-xs { + max-width: 20rem; +} + +.max-w-full { + max-width: 100%; +} + +.max-w-52 { + max-width: 13rem; +} + +.max-w-screen-xl { + max-width: 1280px; +} + +.max-w-screen-lg { + max-width: 1024px; +} + +.flex-1 { + flex: 1 1 0%; +} + +.flex-col { + flex-direction: column; +} + +.items-start { + align-items: flex-start; +} + +.items-center { + align-items: center; +} + +.justify-end { + justify-content: flex-end; +} + +.justify-center { + justify-content: center; +} + +.justify-between { + justify-content: space-between; +} + +.justify-around { + justify-content: space-around; +} + +.space-x-10 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(2.5rem * var(--tw-space-x-reverse)); + margin-left: calc(2.5rem * calc(1 - var(--tw-space-x-reverse))); +} + +.space-x-4 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(1rem * var(--tw-space-x-reverse)); + margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse))); +} + +.space-x-6 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(1.5rem * var(--tw-space-x-reverse)); + margin-left: calc(1.5rem * calc(1 - var(--tw-space-x-reverse))); +} + +.space-y-6 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(1.5rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(1.5rem * var(--tw-space-y-reverse)); +} + +.overflow-hidden { + overflow: hidden; +} + +.overflow-x-auto { + overflow-x: auto; +} + +.truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.rounded { + border-radius: 0.25rem; +} + +.rounded-full { + border-radius: 9999px; +} + +.rounded-lg { + border-radius: 0.5rem; +} + +.rounded-md { + border-radius: 0.375rem; +} + +.rounded-sm { + border-radius: 0.125rem; +} + +.border-0 { + border-width: 0px; +} + +.border-l-2 { + border-left-width: 2px; +} + +.border-t { + border-top-width: 1px; +} + +.border-black { + --tw-border-opacity: 1; + border-color: rgb(0 0 0 / var(--tw-border-opacity)); +} + +.border-gray-200 { + --tw-border-opacity: 1; + border-color: rgb(229 231 235 / var(--tw-border-opacity)); +} + +.bg-black { + --tw-bg-opacity: 1; + background-color: rgb(0 0 0 / var(--tw-bg-opacity)); +} + +.bg-gray-100 { + --tw-bg-opacity: 1; + background-color: rgb(243 244 246 / var(--tw-bg-opacity)); +} + +.bg-gray-200 { + --tw-bg-opacity: 1; + background-color: rgb(229 231 235 / var(--tw-bg-opacity)); +} + +.bg-white { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); +} + +.p-1\.5 { + padding: 0.375rem; +} + +.p-2 { + padding: 0.5rem; +} + +.p-4 { + padding: 1rem; +} + +.p-6 { + padding: 1.5rem; +} + +.px-10 { + padding-left: 2.5rem; + padding-right: 2.5rem; +} + +.px-5 { + padding-left: 1.25rem; + padding-right: 1.25rem; +} + +.px-6 { + padding-left: 1.5rem; + padding-right: 1.5rem; +} + +.py-1\.5 { + padding-top: 0.375rem; + padding-bottom: 0.375rem; +} + +.py-10 { + padding-top: 2.5rem; + padding-bottom: 2.5rem; +} + +.py-2 { + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.py-2\.5 { + padding-top: 0.625rem; + padding-bottom: 0.625rem; +} + +.px-4 { + padding-left: 1rem; + padding-right: 1rem; +} + +.pl-1 { + padding-left: 0.25rem; +} + +.pl-4 { + padding-left: 1rem; +} + +.pl-6 { + padding-left: 1.5rem; +} + +.pr-10 { + padding-right: 2.5rem; +} + +.pr-20 { + padding-right: 5rem; +} + +.pt-24 { + padding-top: 6rem; +} + +.pr-4 { + padding-right: 1rem; +} + +.text-center { + text-align: center; +} + +.text-3xl { + font-size: 1.875rem; + line-height: 2.25rem; +} + +.text-4xl { + font-size: 2.25rem; + line-height: 2.5rem; +} + +.text-sm { + font-size: 0.875rem; + line-height: 1.25rem; +} + +.text-xl { + font-size: 1.25rem; + line-height: 1.75rem; +} + +.font-bold { + font-weight: 700; +} + +.font-extrabold { + font-weight: 800; +} + +.font-medium { + font-weight: 500; +} + +.font-semibold { + font-weight: 600; +} + +.leading-6 { + line-height: 1.5rem; +} + +.tracking-tight { + letter-spacing: -0.025em; +} + +.text-black { + --tw-text-opacity: 1; + color: rgb(0 0 0 / var(--tw-text-opacity)); +} + +.text-blue-400 { + --tw-text-opacity: 1; + color: rgb(96 165 250 / var(--tw-text-opacity)); +} + +.text-blue-600 { + --tw-text-opacity: 1; + color: rgb(37 99 235 / var(--tw-text-opacity)); +} + +.text-gray-900 { + --tw-text-opacity: 1; + color: rgb(17 24 39 / var(--tw-text-opacity)); +} + +.text-gray-950 { + --tw-text-opacity: 1; + color: rgb(3 7 18 / var(--tw-text-opacity)); +} + +.text-white { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.shadow { + --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-md { + --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-sm { + --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); + --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.ring-1 { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.ring-inset { + --tw-ring-inset: inset; +} + +.ring-gray-300 { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(209 213 219 / var(--tw-ring-opacity)); +} + +.placeholder\:text-gray-400::-moz-placeholder { + --tw-text-opacity: 1; + color: rgb(156 163 175 / var(--tw-text-opacity)); +} + +.placeholder\:text-gray-400::placeholder { + --tw-text-opacity: 1; + color: rgb(156 163 175 / var(--tw-text-opacity)); +} + +.hover\:bg-blue-500:hover { + --tw-bg-opacity: 1; + background-color: rgb(59 130 246 / var(--tw-bg-opacity)); +} + +.hover\:text-white:hover { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.hover\:underline:hover { + text-decoration-line: underline; +} + +.focus\:ring-2:focus { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.focus\:ring-inset:focus { + --tw-ring-inset: inset; +} + +.focus-visible\:outline:focus-visible { + outline-style: solid; +} + +.focus-visible\:outline-2:focus-visible { + outline-width: 2px; +} + +.focus-visible\:outline-offset-2:focus-visible { + outline-offset: 2px; +} + +@media (min-width: 640px) { + .sm\:mx-auto { + margin-left: auto; + margin-right: auto; + } + + .sm\:w-full { + width: 100%; + } + + .sm\:max-w-sm { + max-width: 24rem; + } + + .sm\:text-5xl { + font-size: 3rem; + line-height: 1; + } + + .sm\:text-sm { + font-size: 0.875rem; + line-height: 1.25rem; + } + + .sm\:leading-6 { + line-height: 1.5rem; + } +} + +@media (min-width: 1024px) { + .lg\:px-8 { + padding-left: 2rem; + padding-right: 2rem; + } +} \ No newline at end of file diff --git "a/\354\236\204\354\210\230\354\247\204/ex1/src/register.html" "b/\354\236\204\354\210\230\354\247\204/ex1/src/register.html" new file mode 100644 index 0000000..661ad62 --- /dev/null +++ "b/\354\236\204\354\210\230\354\247\204/ex1/src/register.html" @@ -0,0 +1,82 @@ + + + + + + + 가입하기 + + + + + + +
+
+
+

Sign up

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

© Digital Hanaro 5기 임수진. All rights reserved.

+
+ + diff --git "a/\354\236\204\354\210\230\354\247\204/ex1/tailwind.config.js" "b/\354\236\204\354\210\230\354\247\204/ex1/tailwind.config.js" new file mode 100644 index 0000000..a0cebb6 --- /dev/null +++ "b/\354\236\204\354\210\230\354\247\204/ex1/tailwind.config.js" @@ -0,0 +1,8 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ["./src/**/*.{html,js}"], + theme: { + extend: {}, + }, + plugins: [], +} \ No newline at end of file diff --git "a/\354\236\204\354\210\230\354\247\204/ex10.test.ts" "b/\354\236\204\354\210\230\354\247\204/ex10.test.ts" index 6218a79..e58144e 100644 --- "a/\354\236\204\354\210\230\354\247\204/ex10.test.ts" +++ "b/\354\236\204\354\210\230\354\247\204/ex10.test.ts" @@ -1,4 +1,54 @@ import { ArrayList } from './ex10'; console.log('🚀 ArrayList:', ArrayList); +import * as assert from 'assert'; -// 여기에 테스트코드를 작성하세요. +// 여기에 테스트코드 +function testArrayList() { + const alist = new ArrayList([1, 2]); + + assert.deepStrictEqual(ArrayList.listToArray({ value: 1, rest: { value: 2, rest: null } }), [1, 2]); + assert.deepStrictEqual(ArrayList.arrayToList([1, 2]), { value: 1, rest: { value: 2, rest: null } }); + + alist.add(3); + assert.deepStrictEqual(alist.toString(), '{ value: 1, rest: { value: 2, rest: { value: 3, rest: null } } }'); + + alist.add(5, 1); + assert.deepStrictEqual(alist.toString(), '{ value: 1, rest: { value: 5, rest: { value: 2, rest: { value: 3, rest: null } } } }'); + + alist.remove(2); + assert.deepStrictEqual(alist.toString(), '{ value: 1, rest: { value: 5, rest: { value: 3, rest: null } } }'); + + alist.add(22, 1); + assert.deepStrictEqual(alist.toString(), '{ value: 1, rest: { value: 22, rest: { value: 5, rest: { value: 3, rest: null } } } }'); + + alist.add(33, 1); + assert.deepStrictEqual(alist.toArray(), [1, 33, 22, 5, 3]); + + assert.deepStrictEqual(alist.toString(), '{ value: 1, rest: { value: 33, rest: { value: 22, rest: { value: 5, rest: { value: 3, rest: null } } } } }'); + + alist.set(1, 300); + alist.get(2); + + assert.strictEqual(alist.get(2), 22); + assert.strictEqual(alist.size(), 5); + assert.strictEqual(alist.indexOf(300), 1); + assert.strictEqual(alist.contains(300), true); + assert.strictEqual(alist.contains(301), false); + assert.strictEqual(alist.isEmpty(), false); + assert.strictEqual(alist.peek(), 1); + + assert.deepStrictEqual(alist.toArray(), [1, 300, 22, 5, 3]); + + const iterator = alist[Symbol.iterator](); + assert.deepStrictEqual(iterator.next(), { value: 1, done: false }); + assert.deepStrictEqual(iterator.next(), { value: 300, done: false }); + assert.deepStrictEqual(iterator.next(), { value: 22, done: false }); + assert.deepStrictEqual(iterator.next(), { value: 5, done: false }); + assert.deepStrictEqual(iterator.next(), { value: 3, done: false }); + assert.deepStrictEqual(iterator.next(), { value: undefined, done: true }); + + alist.clear(); + assert.deepStrictEqual(alist.size(), 0); +} + +testArrayList(); \ No newline at end of file diff --git "a/\354\236\204\354\210\230\354\247\204/ex10.ts" "b/\354\236\204\354\210\230\354\247\204/ex10.ts" index 1ffaef5..4002cde 100644 --- "a/\354\236\204\354\210\230\354\247\204/ex10.ts" +++ "b/\354\236\204\354\210\230\354\247\204/ex10.ts" @@ -1,71 +1,224 @@ -class Collection { - private readonly arr = Array(); - - constructor(...args: T[]) { - this.arr.push(...args); +interface ListNode { + value: T; + rest: ListNode | null; } - - get _arr() { - 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 poll(): T | undefined { - return this.isQueue() ? this.arr.shift() : this.arr.pop(); - } - - remove() { - return this.poll; - } - - get length() { - return this.arr.length; - } - - get isEmpty() { - return !this.arr.length; - } - - clear() { - this.arr.length = 0; - } - - iterator() { - return this[Symbol.iterator](); - } - - // [1, 2, 3] - *[Symbol.iterator]() { - for (let i = this.length - 1; i >= 0; i -= 1) { - yield this.toArray()[i]; + + class Collection { + protected items: T[] = []; + + push(...args: T[]): T[] { + this.items.push(...args); + return this.items; + } + + get _arr(): T[] { + return this.items; } } - - toArray() { - return this.isQueue() ? this.arr.toReversed() : this.arr; - } - - print() { - console.log(`<${this.constructor.name}: [${this.toArray()}]>`); - } - - private isQueue() { - return this instanceof Queue; + + class ArrayList extends Collection { + private node: ListNode | null = null; + + constructor(arr: T[] = []) { + super(); + this.push(...arr); + this.node = this.arrayToLinkedNode(this._arr); + } + + public static arrayToList(array: T[]): ListNode | null { + if (array.length === 0) return null; + let result: ListNode = { value: array[0], rest: null }; + let current = result; + for (let i = 1; i < array.length; i++) { + current.rest = { value: array[i], rest: null }; + current = current.rest; + } + return result; + } + + public static listToArray(list: ListNode | null): T[] { + const result: T[] = []; + let current = list; + while (current) { + result.push(current.value); + current = current.rest || null; + } + return result; + } + + arrayToLinkedNode(arr: T[]): ListNode | null { + if (arr.length === 0) return null; + let node: ListNode = { value: arr[0], rest: null }; + let current = node; + for (let i = 1; i < arr.length; i++) { + current.rest = { value: arr[i], rest: null }; + current = current.rest; + } + return node; + } + + add(item: T, index?: number): ListNode { + if (index === undefined) { + let lst = this.node; + if (!lst) { + this.node = { value: item, rest: null }; + return this.node; + } + while (lst.rest !== null) { + lst = lst.rest as ListNode; + } + lst.rest = { value: item, rest: null }; + } else { + if (index < 0) throw new Error('Index must be greater than or equal to 0'); + if (index === 0) { + this.node = { value: item, rest: this.node }; + return this.node; + } + + let current = this.node; + let depth = 0; + while (current?.rest !== null && depth < index - 1) { + if (current) current = current.rest; + + depth++; + } + + if (!current) throw new Error('Index is out of range'); + current.rest = { value: item, rest: current.rest }; + } + return this.node as ListNode; + } + + size(): number { + let current = this.node; + let count = 0; + while (current !== null) { + count++; + current = current.rest; + } + return count; + } + + remove(item: T): ListNode | null { + if (!this.node) return null; + if (this.node.value === item) { + this.node = this.node.rest || null; + return this.node; + } + + let current = this.node; + while (current.rest !== null) { + if (current.rest.value === item) { + current.rest = current.rest.rest; + return this.node; + } + current = current.rest; + } + return this.node; + } + + removeByIndex(index: number): ListNode | null { + if (!this.node) return null; + if (index === 0) { + this.node = this.node.rest || null; + return this.node; + } + + let current = this.node; + let depth = 0; + while (current?.rest !== null && depth < index - 1) { + current = current.rest; + depth++; + } + + if (!current?.rest) throw new Error('Index is out of range'); + current.rest = current.rest.rest; + return this.node; + } + + set(index: number, item: T): ListNode | null { + if (!this.node) throw new Error('Array is empty'); + let current = this.node; + let depth = 0; + while (depth < index) { + if (!current?.rest) throw new Error('Index is out of range'); + current = current.rest; + depth++; + } + current.value = item; + return this.node; + } + + get(index: number): T | undefined { + if (!this.node) return undefined; + let current = this.node; + let depth = 0; + while (depth < index) { + if (!current?.rest) return undefined; + current = current.rest; + depth++; + } + return current?.value; + } + + toArray(): T[] { + return ArrayList.listToArray(this.node); + } + + toString(): string { + const listToString = (node: ListNode | null): string => { + if (!node) return 'null'; + return `{ value: ${node.value}, rest: ${listToString(node.rest || null)} }`; + }; + return listToString(this.node); + } + + clear(): void { + this.node = null; + } + + isEmpty(): boolean { + return this.node === null; + } + + contains(item: T): boolean { + let current = this.node; + while (current) { + if (current.value === item) return true; + current = current.rest; + } + return false; + } + + indexOf(item: T): number | null { + let current = this.node; + let index = 0; + while (current) { + if (current.value === item) return index; + current = current.rest; + index++; + } + return -1; + } + + peek(): T | null { + return this.node?.value || null; + } + + [Symbol.iterator](): Iterator { + let current = this.node; + return { + next(): IteratorResult { + if (!current) { + return { value: undefined, done: true }; + } + let value = current.value; + current = current.rest || null; + return { value, done: false }; + }, + }; + } } -} - -class Stack extends Collection {} -class Queue extends Collection {} - -// ArrayList 클래스를 작성하세요. -class ArrayList extends Collection {} - -export { Stack, Queue, ArrayList }; + + export { ArrayList, Collection }; + \ No newline at end of file diff --git "a/\354\236\204\354\210\230\354\247\204/ex2.js" "b/\354\236\204\354\210\230\354\247\204/ex2.js" index 6b95f04..7ca42f5 100644 --- "a/\354\236\204\354\210\230\354\247\204/ex2.js" +++ "b/\354\236\204\354\210\230\354\247\204/ex2.js" @@ -1,4 +1,39 @@ -// range 함수를 작성하세요. -const range = (start, end, step = start > end ? -1 : 1) => { }; +const range = (start, end, step = start > end ? -1 : 1) => { -module.exports = { range }; + const result = []; + const EPSILON = 1e-10; // 부동 소수점 오차를 보정하기 위한 아주 작은 값 + const DECIMALS = 10; // 소수점 자리수 + + if (step === 0 || start === end) return [start]; + + // end가 없을 경우 + if (end === undefined) { + if (start > 0) { + end = start; + start = 1; + } else if (start < 0) { + end = -1; + } else { + // start가 0일 경우 + result.push(start); + } + } + + // 예외 + if ((start - end) * step > 0) return []; + + if (step > 0) { + for (let i = start; i <= end + EPSILON; i += step) { + if (i > end + EPSILON) break; // 범위를 초과할 경우 종료 + result.push(parseFloat(i.toFixed(DECIMALS))); + } + } else { + for (let i = start; i >= end - EPSILON; i += step) { + if (i < end - EPSILON) break; // 범위를 초과할 경우 종료 + result.push(parseFloat(i.toFixed(DECIMALS))); + } + } + return result; +}; + +module.exports = { range }; \ No newline at end of file diff --git "a/\354\236\204\354\210\230\354\247\204/ex3.js" "b/\354\236\204\354\210\230\354\247\204/ex3.js" index b1b0d75..76c87f3 100644 --- "a/\354\236\204\354\210\230\354\247\204/ex3.js" +++ "b/\354\236\204\354\210\230\354\247\204/ex3.js" @@ -1,3 +1,17 @@ Array.prototype.sortBy = function (sortProp = '') { - return this; -}; + const sortArray = sortProp.split(','); + + // 각 기준을 [sortKey, order] 형태로 변환 + const sortPairs = sortArray.map(value => { + const [sortKey, order] = value.split(':'); + return [sortKey, order || 'asc']; // order가 비어있을 경우 기본값 'asc'로 설정 + }); + + return this.slice().sort((a, b) => { + for (const [sortKey, order] of sortPairs) { + if (a[sortKey] > b[sortKey]) return order === 'desc' ? -1 : 1; + if (a[sortKey] < b[sortKey]) return order === 'desc' ? 1 : -1; + } + return 0; + }); +}; \ No newline at end of file diff --git "a/\354\236\204\354\210\230\354\247\204/ex4.js" "b/\354\236\204\354\210\230\354\247\204/ex4.js" index 9ede02f..8bc2d29 100644 --- "a/\354\236\204\354\210\230\354\247\204/ex4.js" +++ "b/\354\236\204\354\210\230\354\247\204/ex4.js" @@ -1,3 +1,69 @@ -function deepCopy(obj) {} +function deepCopy(obj, references = new WeakMap()) { -module.exports = { deepCopy }; + // 기본형이거나 함수일 경우, 그대로 반환 + if (typeof obj !== 'object' || obj === null) { + return obj; + } + + // 이미 참조한 객체가 있을 경우, 복사된 객체를 반환 + if (references.has(obj)) { + return references.get(obj); + } + + // 배열일 경우 + if (Array.isArray(obj)) { + const copy = []; + references.set(obj, copy); // 원본 객체 저장 + + for (let i = 0; i < obj.length; i++) { + copy[i] = deepCopy(obj[i], references); + } + return copy; + } + + // Set일 경우 + if (obj instanceof Set) { + const copy = new Set(); + references.set(obj, copy); // 원본 객체랑 복사본을 WeakSet에 저장 + for (let item of obj) { + copy.add(deepCopy(item, references)); // 각 값을 재귀적으로 복사 + } + return copy; + } + + // Map일 경우 + if (obj instanceof Map) { + const copyMap = new Map(); + references.set(obj, copyMap); // 원본 객체랑 복사본을 WeakMap에 저장 + for (let [key, value] of obj) { + copyMap.set(deepCopy(key, references), deepCopy(value, references)); // 키-값을 재귀적으로 복사 + } + return copyMap; + } + + // WeakSet과 WeakMap일 경우, 그대로 반환 (참조형) + if (obj instanceof WeakSet || obj instanceof WeakMap) { + return obj; + } + + // 일반 객체일 경우 + const result = {}; + references.set(obj, result); // 원본 객체를 WeakMap에 저장 + + // 1) 객체의 심볼 속성 복사 + const symbols = Object.getOwnPropertySymbols(obj); + for (let i = 0; i < symbols.length; i++) { + const symbol = symbols[i]; + result[symbol] = deepCopy(obj[symbol], references); + } + + // 2) 객체의 일반 속성 복사 + for (const key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + result[key] = deepCopy(obj[key], references); + } + } + return result; +} + +module.exports = { deepCopy }; \ No newline at end of file diff --git "a/\354\236\204\354\210\230\354\247\204/ex5.js" "b/\354\236\204\354\210\230\354\247\204/ex5.js" index 464a05a..0158319 100644 --- "a/\354\236\204\354\210\230\354\247\204/ex5.js" +++ "b/\354\236\204\354\210\230\354\247\204/ex5.js" @@ -1,3 +1,54 @@ module.exports = { - searchByKoreanInitialSound: (data, firstSounds) => {}, -}; + searchByKoreanInitialSound(data, firstSounds) { + // 한글 유니코드 시작값과 끝값 + const HANGUL_START_CHARCODE = '가'.charCodeAt(0); + const HANGUL_END_CHARCODE = '힣'.charCodeAt(0); + + // 초성 + 중성 + 종성 조합의 합 + const TOTAL_SYLLABLE_COMBINATIONS = 588; + + const initialConsonants = [ + 'ㄱ', 'ㄲ', 'ㄴ', 'ㄷ', 'ㄸ', + 'ㄹ', 'ㅁ', 'ㅂ','ㅃ', 'ㅅ', + 'ㅆ', 'ㅇ', 'ㅈ', 'ㅉ', 'ㅊ', + 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ' + ] + + // 초성 가져오기 + const getInitialSound = (char) => { + const code = char.charCodeAt(0); + if (code >= HANGUL_START_CHARCODE && code <= HANGUL_END_CHARCODE) { + // 한글 음절의 초성 반환 + const index = Math.floor((code - HANGUL_START_CHARCODE) / TOTAL_SYLLABLE_COMBINATIONS); + return initialConsonants[index] || ''; + } else { + // 한글이 아닐 경우, 그대로 반환 + return char; + } + }; + + // 초성 정규식 패턴 생성 함수 + const getInitialSoundRegex = (firstSounds) => { + const pattern = firstSounds.split('').map(char => { + if (initialConsonants.includes(char)) { + // 초성 문자는 [char]로 패턴 생성 + return `[${char}]`; + } else { + // 숫자나 기타 문자는 그대로 사용 + return char; + } + }).join(''); + return new RegExp(pattern, 'u'); // 'u' 플래그를 사용하여 유니코드 문자 인식 + }; + + // 초성 정규식 패턴을 생성 + const regex = getInitialSoundRegex(firstSounds); + + // 데이터 필터링 + return data.filter(element => { + // 문자열에서 초성 추출 + const extractedInitialSounds = Array.from(element).map(getInitialSound).join(''); + return regex.test(extractedInitialSounds); + }); + } +}; \ No newline at end of file diff --git "a/\354\236\204\354\210\230\354\247\204/ex6.test.ts" "b/\354\236\204\354\210\230\354\247\204/ex6.test.ts" index 680c5e6..9a96794 100644 --- "a/\354\236\204\354\210\230\354\247\204/ex6.test.ts" +++ "b/\354\236\204\354\210\230\354\247\204/ex6.test.ts" @@ -21,4 +21,4 @@ import { promiseAllSettled, randTime } from './ex6'; randTime(33), ]) ); -})(); +})(); \ No newline at end of file diff --git "a/\354\236\204\354\210\230\354\247\204/ex6.ts" "b/\354\236\204\354\210\230\354\247\204/ex6.ts" index 424ca54..4ef8dd8 100644 --- "a/\354\236\204\354\210\230\354\247\204/ex6.ts" +++ "b/\354\236\204\354\210\230\354\247\204/ex6.ts" @@ -1,4 +1,17 @@ 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> { + // 모든 프로미스의 결과를 담을 배열 + const results: Array<{ status: 'fulfilled' | 'rejected'; value?: T; reason?: any }> = []; + + // 모든 프로미스의 상태를 추적 + const wrappedPromises = promises.map(promise => + promise + .then(value => ({ status: 'fulfilled', value } as { status: 'fulfilled'; value: T })) + .catch(reason => ({ status: 'rejected', reason } as { status: 'rejected'; reason: any })) + ); + + // 모든 프로미스가 처리될 때까지 기다리고 결과를 반환 + return Promise.all(wrappedPromises); +} \ No newline at end of file diff --git "a/\354\236\204\354\210\230\354\247\204/ex7.test.ts" "b/\354\236\204\354\210\230\354\247\204/ex7.test.ts" index 62b881d..c445b6a 100644 --- "a/\354\236\204\354\210\230\354\247\204/ex7.test.ts" +++ "b/\354\236\204\354\210\230\354\247\204/ex7.test.ts" @@ -64,7 +64,56 @@ async function test(userId: string | number) { ], }); - // 추가 테스트 코드를 작성하시오. + // 추가 테스트 코드 + assert.strictEqual(posts?.at(0)?.title, 'sunt aut facere repellat provident occaecati excepturi optio reprehenderit'); + assert.strictEqual(posts?.at(2)?.comments[2].email,'Kariane@jadyn.tv'); + assert.deepStrictEqual(posts[3].comments, [ + { + postId: 4, + id: 16, + email: 'Christine@ayana.info', + body: 'iste ut laborum aliquid velit facere itaque\n' + + 'quo ut soluta dicta voluptate\n' + + 'error tempore aut et\n' + + 'sequi reiciendis dignissimos expedita consequuntur libero sed fugiat facilis' + }, + { + postId: 4, + id: 17, + email: 'Preston_Hudson@blaise.tv', + body: 'consequatur necessitatibus totam sed sit dolorum\n' + + 'recusandae quae odio excepturi voluptatum harum voluptas\n' + + 'quisquam sit ad eveniet delectus\n' + + 'doloribus odio qui non labore' + }, + { + postId: 4, + id: 18, + email: 'Vincenza_Klocko@albertha.name', + body: 'veritatis voluptates necessitatibus maiores corrupti\n' + + 'neque et exercitationem amet sit et\n' + + 'ullam velit sit magnam laborum\n' + + 'magni ut molestias' + }, + { + postId: 4, + id: 19, + email: 'Madelynn.Gorczany@darion.biz', + body: 'doloribus est illo sed minima aperiam\n' + + 'ut dignissimos accusantium tempore atque et aut molestiae\n' + + 'magni ut accusamus voluptatem quos ut voluptates\n' + + 'quisquam porro sed architecto ut' + }, + { + postId: 4, + id: 20, + email: 'Mariana_Orn@preston.org', + body: 'qui harum consequatur fugiat\n' + + 'et eligendi perferendis at molestiae commodi ducimus\n' + + 'doloremque asperiores numquam qui\n' + + 'ut sit dignissimos reprehenderit tempore' + } + ]); } -test(1); +test(1); \ No newline at end of file diff --git "a/\354\236\204\354\210\230\354\247\204/ex7.ts" "b/\354\236\204\354\210\230\354\247\204/ex7.ts" index 62812ac..c579ebb 100644 --- "a/\354\236\204\354\210\230\354\247\204/ex7.ts" +++ "b/\354\236\204\354\210\230\354\247\204/ex7.ts" @@ -1,3 +1,63 @@ const POST_URL = 'https://jsonplaceholder.typicode.com/posts'; -export async function getPosts(userId: number | string) {} +interface Post { + userId: number; + id: number; + title: String; + body: String; +} + +interface Comment { + postId: number; + id: number; + email: String; + body: String; +} + +interface CommentResponse extends Comment { + name: String; +} + +interface PostComment { + postId: number; + title: String; + comments: Comment[]; +} + +export async function getPosts(userId: number | string): Promise { + try { + // userId로 게시글 조회 + const postResponse = await fetch(`${POST_URL}?userId=${userId}`); + const posts: Post[] = (await postResponse.json()) as Post[]; + + // 결과 반환할 객체 배열 + const postComments: PostComment[] = await Promise.all( + posts.map(async (post: Post) => { + const commentResponse = await fetch(`${POST_URL}/${post.id}/comments`); + const comments: CommentResponse[] = + (await commentResponse.json()) as CommentResponse[]; + + // 결과 반환할 객체 + let postComment: PostComment = { + postId: post.id, + title: post.title, + comments: [], + }; + + comments.forEach((comment: Comment) => { + postComment.comments.push({ + postId: comment.postId, + id: comment.id, + email: comment.email, + body: comment.body, + }); + }); + return postComment; + }) + ); + return postComments; + } catch (error) { + console.error('에러 나요ㅠ.ㅠ:', error); + return []; + } +} \ No newline at end of file diff --git "a/\354\236\204\354\210\230\354\247\204/ex8.ts" "b/\354\236\204\354\210\230\354\247\204/ex8.ts" index a67a2d2..08397e8 100644 --- "a/\354\236\204\354\210\230\354\247\204/ex8.ts" +++ "b/\354\236\204\354\210\230\354\247\204/ex8.ts" @@ -1,8 +1,25 @@ -// dummy(mock)입니다. 올바르게 수정하세요. -const debounce = (cb: any, delay: number) => (i: number) => {}; -const throttle = (cb: any, delay: number) => (i: number) => {}; +// debounce 함수 +const debounce = (cb: (i: number) => void, delay: number) => { + let timeoutId: NodeJS.Timeout | null = null; + return (i: number) => { + if (timeoutId) clearTimeout(timeoutId); + timeoutId = setTimeout(() => cb(i), delay); + }; +}; -// function throttle... +// throttle 함수 +const throttle = (cb: (i: number) => void, delay: number) => { + let isThrottled = false; + return (i: number) => { + if (!isThrottled) { + cb(i); + isThrottled = true; + setTimeout(() => { + isThrottled = false; + }, delay); + } + }; +}; const debo = debounce((a: number) => console.log(a + 1), 500); for (let i = 10; i < 15; i++) debo(i); // 15 출력