๐ช Programming
[Next.js] API ๋ผ์ฐํธ ๋ณดํธํ๊ธฐ - Unkey
[Next.js] API ๋ผ์ฐํธ ๋ณดํธํ๊ธฐ - Unkey
2025.03.30OpenAI ๊ฐ์ LLM(๋ํ ์ธ์ด ๋ชจ๋ธ) ๊ธฐ๋ฐ API๋ก ๊ธฐ๋ฅ์ ๊ฐ๋ฐํ๋ค ๋ณด๋ฉด, ์์ฐ์ค๋ฝ๊ฒ ์ฌ์ฉ๋ ์ ํ์ด ํ์ํด์ง๋ค. Unkey๋ผ๋ API ๊ด๋ฆฌ ํ๋ซํผ์ ์ด์ฉํ๋ฉด API ํค ๊ด๋ฆฌ, ์์ฒญ ๋น๋ ์ ํ, ์ฌ์ฉ๋ ๋ถ์ ๊ฐ์ ๊ธฐ๋ฅ์ ์์ฝ๊ฒ ๊ตฌํํ ์ ์๋ค. API ์๋ํฌ์ธํธ๋ณ๋ก ์์ฒญ๋์ ์ ํํ๊ฑฐ๋ ์ฌ์ฉ์๋ง๋ค ๋ค๋ฅธ ์ ํ ์ ์ฑ
์ ์ค์ ํ ์๋ ์๋ค. Unkey ๋ฌด๋ฃ ์๊ธ์ (Free Tier)๋ API ํค 1000๊ฐ, ์ 15๋ง ๊ฑด์ ์์ฒญ๊น์ง ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ธ ํ๋ก์ ํธ์ ์ฌ์ฉํ๊ธฐ ๋ฑ ์ข๋ค. Next.js๋ฅผ ์ฌ์ฉํ๋ค๋ฉด Unkey์์ ์ ๊ณตํ๋ SDK๋ฅผ ์ด์ฉํด์ ๋ ํธํ๊ฒ ํตํฉํ ์ ์๋ค. ์๋ฅผ ๋ค์ด ์๋ฒ ์ก์
์ด๋ API ๋ผ์ฐํธ์ ๋ฏธ๋ค์จ์ด์ฒ๋ผ ์ ์ฉํ์ฌ ์ธ์ฆ๋ ์์ฒญ๋ง ์ฒ๋ฆฌํ๊ฑฐ๋ ์ฌ์ฉ๋ ์ ํ์ ์ ์ฉํ ์ ์๋ค. Unk..
[Next.js] dnd-kit์ ํ์ฉํ ์นธ๋ฐ(Kanban) ๋ณด๋ ๋๋๊ทธ ์ค ๋๋กญ ๊ตฌํ
[Next.js] dnd-kit์ ํ์ฉํ ์นธ๋ฐ(Kanban) ๋ณด๋ ๋๋๊ทธ ์ค ๋๋กญ ๊ตฌํ
2025.03.18์ผ๋ฐ์ ์ผ๋ก ์นธ๋ฐ ๋ณด๋๋ ๋๋๊ทธ ์ค ๋๋กญ์ ํตํด ์ปฌ๋ผ์ด๋ ํ์คํฌ ์นด๋์ ์์๋ฅผ ์์ ๋กญ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ค. ์ด๋ฌํ ๋๋๊ทธ ์ค ๋๋กญ ์ํธ์์ฉ์ dnd-kit ์ด๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํ๋ Sortable ํ๋ฆฌ์
์ ์ด์ฉํ๋ฉด ๋ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ค. dnd-kit์ ์ฝ์ด ํฌ๊ธฐ๊ฐ 10kb ์ ๋๋ก ๊ฐ๋ณ๊ณ ์ธ๋ถ ์์กด์ฑ์ด ์๋ ์ฅ์ ์ด ์๋ค. ๋๋๊ทธ ์ ํ, ์ ๋๋ฉ์ด์
, ์ถฉ๋ ๊ฐ์ง ๋ฑ์ ์ปค์คํฐ๋ง์ด์ง ํ ์๋ ์๋ค. dnd-kit์ ์ด์ฉํด ์นธ๋ฐ ๋ณด๋๋ฅผ ๊ตฌํํ๋ฉด์ ๋น๊ต์ ๊น๋ค๋กญ๋ค๊ณ ๋๊ผ๋ ๋ถ๋ถ๋ค์ ์ ๋ฆฌํด ๋ดค๋ค. ์ฝ๋๋ ์๋ ๋ ํฌ์งํ ๋ฆฌ์์ ํ์ธํ ์ ์๋ค.๋ ํฌ์งํ ๋ฆฌ: https://github.com/romantech/simple-kanban๋ฐ๋ชจ ํ์ด์ง: https://kanban.romantech.net ์นธ๋ฐ ๋ฐ์ดํฐ ๋ชจ..
[UI] Shadcn DropdownMenu์์ Dialog ์๋ ๋ซํ ๋ฌธ์ ํด๊ฒฐ
[UI] Shadcn DropdownMenu์์ Dialog ์๋ ๋ซํ ๋ฌธ์ ํด๊ฒฐ
2025.03.09Shadcn์ ๋๋กญ๋ค์ด(Dropdown)์ ํน์ ๋์์ด๋ ๊ธฐ๋ฅ ๋ฑ์ Popover ํํ๋ก ํ์ํ๋ ์ปดํฌ๋ํธ๋ค. ๋๋กญ๋ค์ด ๋ฉ๋ด ์์ดํ
(DropdownMenuItem)์ ํด๋ฆญํ์ ๋ ๋ค์ด์ผ๋ก๊ทธ(ํน์ AlertDialog)๋ฅผ ๋์ฐ๋ ค๋ ์๋๋ก ๋ฉ๋ด ์์ดํ
์ ์์์ผ๋ก ๋ค์ด์ผ๋ก๊ทธ๋ฅผ ์ถ๊ฐํ ์ ์๋ค. ํ์ง๋ง ์ด๋ ๊ฒ ์์ฑํ๋ฉด ๋ค์ด์ผ๋ก๊ทธ๊ฐ ์ ๋๋ก ์ด๋ฆฌ์ง ์๋๋ค. ๋ฉ๋ด ์ด๊ธฐ {/* ... */} ; Radix์ ๋ฉ๋ด ์์ดํ
์ ํด๋ฆญํ์ ๋ ๋๋กญ๋ค์ด์ด ์๋์ผ๋ก ๋ซํ๋๋ก ์ค๊ณ๋์ด ์๋ค. ๋๋ฌธ์ ๋ค์ด์ผ๋ก๊ทธ๋ฅผ ๋์ฐ๋ ๋ฉ๋ด ์์ดํ
์ ํด๋ฆญํ๋ฉด, ๋๋กญ๋ค์ด์ด ๋ซํ๋ ๊ธฐ๋ณธ ๋์์ ์ํด ๋ค์ด์ผ๋ก๊ทธ๊ฐ ์ด๋ฆฌ์ง ๋ง์ ๋ซํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ์ ๋ฌธ์ ๋ก StackOverFlow๋ฅผ ์ฐพ์๋ณด๋ฉด Dr..
[CSS] :focus, :focus-visible ์ฐจ์ด์
[CSS] :focus, :focus-visible ์ฐจ์ด์
2025.03.06focus, focus-visible:focus: ๋ชจ๋ ํฌ์ปค์ค ์ํฉ(ํค๋ณด๋, ๋ง์ฐ์ค, ํฐ์น)์ ์ ์ฉ:focus-visible: ํค๋ณด๋ ํฌ์ปค์ค ๋๋ ๋ธ๋ผ์ฐ์ ์์ ํฌ์ปค์ค ํ์๊ฐ ํ์ํ๋ค๊ณ ํ๋จํ ๋๋ง ์ ์ฉTab ํค๋ก ํฌ์ปค์ค ์ด๋ ์(ํค๋ณด๋ ํฌ์ปค์ค)ํค๋ณด๋ ์
๋ ฅ์ ์ง์ํ๋ ์์(ํ
์คํธ ์
๋ ฅ ํ๋ ๋ฑ)… ์ผ๋ฐ์ ์ผ๋ก ๋ง์ฐ์ค ์ฌ์ฉ์์๊ฒ ๋ถํ์ํ ์ธ๊ณฝ์ ์ ์จ๊ธฐ๋ฉด์ ํค๋ณด๋ ์ฌ์ฉ์์ ์ ๊ทผ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด :focus์ :focus-visible ์ ํ์๋ฅผ ์กฐํฉํด์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค./* ๊ธฐ๋ณธ ํฌ์ปค์ค ์คํ์ผ ๋ฆฌ์
*/button:focus { outline: none;}/* ํค๋ณด๋ ํฌ์ปค์ค ์ ์คํ์ผ ์ ์ฉ */button:focus-visible { outline: 2px solid green;} outline, r..
[JS] ์๋ฐ์คํฌ๋ฆฝํธ ๋๋ค ์์(Random Color) ์์ฑํ๊ธฐ
[JS] ์๋ฐ์คํฌ๋ฆฝํธ ๋๋ค ์์(Random Color) ์์ฑํ๊ธฐ
2025.03.04HEX ์์ ์ฝ๋๋ RGB ์์์ RRGGBB ํ์์ 16์ง์๋ก ํํํ๋ค. HEX ์ฝ๋์ ์ต์ ๊ฐ์ #000000(๊ฒ์์, 10์ง์ 0), ์ต๋๊ฐ์ #FFFFFF(ํฐ์, 10์ง์ 16777215)์ด๊ธฐ ๋๋ฌธ์ 0~16777215 ์ฌ์ด์ ๋๋ค ์ซ์๋ฅผ 16์ง์๋ก ๋ณํํ๊ณ #๋ฅผ ๋ถ์ด๋ฉด ๋๋คํ HEX ์์ ์ฝ๋๊ฐ ๋๋ค.export const getRandomColor = ({ transparent = false, transProbability = 0.2,} = {}) => { // transProbability ํ๋ฅ ๋ก(๊ธฐ๋ณธ๊ฐ 20%) ํฌ๋ช
๊ฐ ๋ฐํ if (transparent && Math.random() Math.random() ๋ฉ์๋๋ 0 ์ด์ 1 ๋ฏธ๋ง(0 ≤ x approximately uniform..
[CSS] ์์ ๋งฅ๋ฝ Stacking Context
[CSS] ์์ ๋งฅ๋ฝ Stacking Context
2025.02.26TL;DR๊ธฐ๋ณธ์ ์ผ๋ก ์์๋ค์ DOM ์์์ ๋ฐ๋ผ ์์ธ๋ค.positioned(position ≠ static) ์์๋ non-positioned(position = static) ์์๋ณด๋ค ์์ ์์ธ๋ค.positioned ์์๋ค ์ค z-index ๊ฐ์ด ๋์์๋ก ์์ ์์ธ๋ค.์๋ก์ด ์์ ๋งฅ๋ฝ์ด ์์ฑ๋๋ฉด ์์ ์์๋ ํด๋น ๋งฅ๋ฝ ์์์ ์์๊ฐ ๊ฒฐ์ ๋๋ค. ์ค๋ช
์์ ๋งฅ๋ฝ(Stacking Context)์ HTML ์์๋ค์ ๊ฐ์์ z์ถ(๊น์ด) ๋ฐฉํฅ์ผ๋ก ๋ฐฐ์นํ๋ ๊ฐ๋
์ด๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์์๋ค์ DOM ์์์ ๋ฐ๋ผ ์์ธ๋ค. ์ฆ, ๋ค์ ์ ์ํ ์์์ผ์๋ก ํ๋ฉด์์ ์์ ์์นํ๋ค. position์ ์ ์ฉํ ์์(positioned)๋ position์ ์ ์ฉํ์ง ์์ ์์(non-positioned)๋ณด๋ค ์์ ์์ธ๋ค. posit..
[React] ๋ฆฌ์กํธ 19 ์
๋ฐ์ดํธ ๋ด์ฉ ํบ์๋ณด๊ธฐ
[React] ๋ฆฌ์กํธ 19 ์ ๋ฐ์ดํธ ๋ด์ฉ ํบ์๋ณด๊ธฐ
2025.02.082024๋
12์ React 19์ stable ๋ฒ์ ์ด ์ถ์๋๋ค. ๋ฆฌ์กํธ ๊ณต์ ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํด์ React 19์ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ์ ๋ฆฌํด ๋ดค๋ค. ์๋กญ๊ฒ ์ ๋ณด์ธ ํ
์ ๊ฐ์ข
๋ฌธ์์ ์์ ๋ฅผ ์ฐธ๊ณ ํด์ ์ดํดํ๊ธฐ ์ฝ๋๋ก ๋ถ์ฐ ์ค๋ช
์ ๋ง๋ถ์๋ค. ๊ณต์๋ฌธ์์ ๊ธฐ์กด ์ฌ์ฉ์๋ฅผ ์ํ ๋ง์ด๊ทธ๋ ์ด์
๊ฐ์ด๋๋ ์์ธํ๊ฒ ๋์์์ผ๋ ์ฐธ๊ณ ํ์. useTransitionuseTransition์ ์ฃผ๋ก ๋ฌด๊ฑฐ์ด ์์
์ ์ํ ์
๋ฐ์ดํธ๋ฅผ ๋ฎ์ ์ฐ์ ์์๋ก ์ง์ ํ์ฌ UI ๋ธ๋กํน์ ๋ฐฉ์งํ ๋ ์ฌ์ฉํ๋ค. React 18 ๋ฒ์ ๊น์ง startTransition ์ฝ๋ฐฑ์ ํญ์ ๋๊ธฐ์ ์ด์ด์ผ ํ๋ ์ ์ฝ์ด ์์๋ค. ๋๋ฌธ์ ์ฝ๋ฐฑ ์์์ ๋น๋๊ธฐ ํธ์ถ ๊ฐ์ ์์
์ ์ํํ ์ ์์๋ค. React 19๋ถํด startTransition ์ฝ๋ฐฑ ์์์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ ๊ฐ๋ฅํด์ก..
[Next.js] Dynamic Routes ๋ค์ด๋๋ฏน ๋ผ์ฐํธ
[Next.js] Dynamic Routes ๋ค์ด๋๋ฏน ๋ผ์ฐํธ
2025.01.31TL;DR[slug] : ๋จ์ผ ๊ฒฝ๋ก ์ธ๊ทธ๋จผํธ ํฌ์ฐฉ[...slug] : ๋ค์ค ๊ฒฝ๋ก ์ธ๊ทธ๋จผํธ ํฌ์ฐฉ(Catch-All)[[...slug]] : ๋ฃจํธ ๊ฒฝ๋ก๋ฅผ ํฌํจํ ๋ชจ๋ ๊ฒฝ๋ก๋ฅผ ์ ํ์ ์ผ๋ก ํฌ์ฐฉ(Optional Catch-All) Dynamic Segments์ ํํ ์ธ๊ทธ๋จผํธ ์ด๋ฆ์ ๋ฏธ๋ฆฌ ์ ์ ์์ ๋ ํด๋ ์ด๋ฆ์ ๋๊ดํธ๋ก ๊ฐ์ธ๋ฉด ๋ค์ด๋๋ฏน ์ธ๊ทธ๋จผํธ๋ก ์๋. ์ธ๊ทธ๋จผํธ ์ด๋ฆ์ layout, page ๋๋ route ํ์ผ์์ params ํ๋กญ์ผ๋ก ๊ฐ ์กฐํ ๊ฐ๋ฅ. RouteURL ExampleParamsapp/blog/[slug]/page.js/blog/a{ slug: 'a' }app/blog/[slug]/page.js/blog/b{ slug: 'b' }๋ฃจํธ ๊ฒฝ๋ก(blog/)์ ํ์ด์ง ์์ผ๋ฉด ์ ๊ทผ ๋ถ๊ฐ. Catch-..
[Next.js] App Router ๊ณต์ ํํ ๋ฆฌ์ผ ํบ์๋ณด๊ธฐ
[Next.js] App Router ๊ณต์ ํํ ๋ฆฌ์ผ ํบ์๋ณด๊ธฐ
2025.01.30Next.js์์ ์ ๊ณตํ๋ Learn Next.js App Router ํํ ๋ฆฌ์ผ์ ๋ถ์ฐ ์ค๋ช
๊ณผ ํจ๊ป ํ๊ตญ์ด๋ก ์ ๋ฆฌํด ๋ดค๋ค. ๊ณต์ ๊ฐ์ด๋๋ ์ด 16๊ฐ ์ฑํฐ๋ก ๊ตฌ์ฑ๋์ด ์์ง๋ง, ์ด๋ฒ ํฌ์คํ
์์ ํ๋ก์ ํธ ์ธํ
์ ๋ค๋ฃจ๋ ์ฑํฐ 1๊ณผ CSS ์คํ์ผ๋ง ๋ฐฉ๋ฒ์ ์ค๋ช
ํ๋ ์ฑํฐ 2๋ ์๋ตํ๋ค. Optimizing Fonts and ImagesCumulative Layout Shift(CLS, ๋์ ๋ ์ด์์ ์ด๋)๋ ๊ตฌ๊ธ์ด ์น์ฌ์ดํธ์ ์ฑ๋ฅ๊ณผ ์ฌ์ฉ์ ๊ฒฝํ์ ํ๊ฐํ๋ ๋ฐ ์ฌ์ฉํ๋ ์งํ๋ก, ํ์ด์ง ๋ก๋ ์ค ๋ ์ด์์ ์ด๋์ผ๋ก ์ธํด ๋ฐ์ํ๋ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ถํธํจ์ ์ธก์ ํ๋ค. ์๋ฅผ ๋ค์ด, ๋ธ๋ผ์ฐ์ ๊ฐ ํด๋ฐฑ(fallback) ํฐํธ๋ ์์คํ
ํฐํธ๋ก ํ
์คํธ๋ฅผ ๋จผ์ ๋ ๋๋ง ํ ๋ค ์ฌ์ฉ์ ์ง์ ํฐํธ๋ก ๊ต์ฒดํ ๋ ํ
์คํธ ํฌ๊ธฐ, ๊ฐ๊ฒฉ ๋๋ ๋ ์ด์..
[Dev] ์๋งจํฑ ๋ฒ์ ๋ Semantic Versioning
[Dev] ์๋งจํฑ ๋ฒ์ ๋ Semantic Versioning
2025.01.27์ํํธ์จ์ด์ ๋ฒ์ ์ ์ผ๋ฐ์ ์ผ๋ก 20.12.2 ๊ฐ์ ํ์์ผ๋ก ํ๊ธฐํ๋ค. ์ด๋ ์ํํธ์จ์ด ๋ฒ์ ๋ฒํธ๋ฅผ ๊ด๋ฆฌํ๋ ์๋งจํฑ ๋ฒ์ ๋(Semantic Versioning)์ด๋ผ๋ ๊ท์น์ ๋ฐ๋ฅธ ๊ฒ์ผ๋ก, ๋ฉ์ด์ .๋ง์ด๋.ํจ์น ํ์์ผ๋ก ๊ตฌ์ฑ๋์ด ๊ฐ ์ซ์๊ฐ ํน์ ํ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ค.Semantic Versioning์ ์ค์ฌ์ SemVer๋ผ๊ณ ๋ ๋ถ๋ฆฐ๋ค. ๋ฉ์ด์ ๋ฒ์ ์ ํธํ์ฑ์ ์ํฅ์ ๋ฏธ์น๋ ํฐ ๋ณํ๊ฐ ์์ ๋ ์ฆ๊ฐํ๋ฉฐ, ๋ง์ด๋ ๋ฒ์ ์ ํธํ์ฑ์ ์ ์งํ๋ฉด์ ์๋ก์ด ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋ ๋ ์ฆ๊ฐํ๋ค. ํจ์น ๋ฒ์ ์ ์ฃผ๋ก ๋ฒ๊ทธ ์์ ์ด๋ ์ฑ๋ฅ ๊ฐ์ ๊ณผ ๊ฐ์ ์์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํ๋ธ๋ค. ์ด๋ฌํ ๋ฒ์ ๊ด๋ฆฌ ๋ฐฉ์์ ์ํํธ์จ์ด์ ๋ณ๊ฒฝ ์ฌํญ์ ์ฒด๊ณ์ ์ผ๋ก ์ ๋ฌํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํ๋ค. ์๋งจํฑ ๋ฒ์ ๋: ์ํํธ์จ์ด์ ๋ฒ์ ๋ฒํธ๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ผ๋ก, ..
[React] ๋ฆฌ์กํธ์ ์ฌ๋ฐ๋ฅธ useEffect ์ฌ์ฉํ
[React] ๋ฆฌ์กํธ์ ์ฌ๋ฐ๋ฅธ useEffect ์ฌ์ฉํ
2025.01.21๋ฆฌ์กํธ์ useEffect๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ, ๊ตฌ๋
๊ด๋ฆฌ, DOM ์
๋ฐ์ดํธ, ์ฌ์ด๋ ์ดํํธ ์ฒ๋ฆฌ ๋ฑ ๋ค์ํ ์์
์ ์ฌ์ฉ๋๋ค. ๊ทธ๋ฌ๋ useEffect๋ฅผ ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ ์ ํ, ๋ถํ์ํ ๋ ๋๋ง, ๋๋ฒ๊น
์ ๋ณต์ก์ฑ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. "Leave useEffect Alone!" ๋ผ๋ ๊ฐ์ด๋ ๊ธ์ ์ฐธ๊ณ ํ์ฌ ์ฌ๋ฐ๋ฅธ useEffect ์ฌ์ฉ๋ฒ์ ๋ํ ์ถ๊ฐ ์ค๋ช
์ ๋ง๋ถ์ฌ์ ์ ๋ฆฌํด ๋ดค๋ค. ๊ฒฝ์ ์ํ(Race Condition) โญ๊ฒฝ์ ์ํ๋ ์ฌ๋ฌ ๋น๋๊ธฐ ์์
์ด ๋์์ ์คํ๋ ๋, ์คํ ์์๋ ๊ฒฐ๊ณผ๊ฐ ์์ธกํ์ง ์์ ๋ฐฉ์์ผ๋ก ์๋ํ๋ ํ์์ ๊ฐ๋ฆฌํจ๋ค. ์๋ ์ฝ๋์์ ๋ฒํผ์ ์ฌ๋ฌ ๋ฒ ํด๋ฆญํ๋ฉด counter ๊ฐ์ด ์ฆ๊ฐํ๊ณ , ๊ฐ ์์ฒญ์ ๋๋คํ ์๊ฐ๋งํผ ๋๊ธฐํ ํ response ์ํ๋ฅผ ์
๋ฐ์ดํธํ๋ค. ํ์ง๋ง ์ด..
[JS] ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ์ต์ ํ ๊ธฐ๋ฒ ๋ชจ์
[JS] ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ์ต์ ํ ๊ธฐ๋ฒ ๋ชจ์
2024.12.07"Optimizing Javascript for fun and for profit"๋ผ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ต์ ํ ๊ด๋ จ ๊ธ์ ์์ด ์๋ฌธ๊ณผ ๋ฒ์ญ๋ณธ์ ๋ฐํ์ผ๋ก, ๋ถ๊ฐ์ ์ธ ์ค๋ช
์ ์ถ๊ฐํ๊ณ ์ดํดํ๊ธฐ ์ฌ์ด ์ธ์ด๋ก ์ ๋ฆฌํด ๋ดค๋ค. ์์ ์ฝ๋๋ ์กฐ๊ธ ๋ ๋ค๋ฌ์ด์ ๊ฐ์ ํ๋ค. ๋ฌธ์์ด ๋น๊ต ํผํ๊ธฐ Avoid string comparisons๋ฌธ์์ด ๋น๊ต๋ ๊ฐ ๋ฌธ์๋ฅผ ์์ฐจ์ ์ผ๋ก ๋น๊ตํด์ผ ํ๋ฏ๋ก O(n) ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ๋๋ค. ํนํ ๋ฌธ์์ด enum์ ์ฌ์ฉํ๋ ๊ฒ์ ์ฑ๋ฅ ์ต์ ํ ๊ด์ ์์ ํผํด์ผ ํ ํจํด ์ค ํ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์์ ์ ์(Integer)๋ ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ผ๋ก ์ ๋ฌ๋๋ฉฐ, ๋น๊ต ์ฐ์ฐ ์ ๋ฐ๋ก ๊ฐ์ ํ์ธํ ์ ์์ด ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค. ๋ฐ๋ฉด ๋ฌธ์์ด์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ ์์น(ํฌ์ธํฐ)๋ฅผ ์ฐธ์กฐํด ๊ฐ์ ๊ฐ์ ธ์จ ํ ๋น๊ตํ๊ธฐ ๋๋ฌธ์ ..