์ „์ฒด ๊ธ€

์„ฑ์žฅํ•˜๊ธฐ ์œ„ํ•œ ๊ธ€์„ ์ž‘์„ฑํ•˜๋ ค๊ณ  ๋…ธ๋ ฅ์ค‘ ์ž…๋‹ˆ๋‹ค
ํŒŒ์ด์ฌ์œผ๋กœ ํ‘ผ ์ด์œ ๋Š” ๊ฐ‘์ž๊ธฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ’€๊ณ  ์‹ถ์–ด์„œ ํ’€๋‹ค๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ž…์ถœ๋ ฅํ•˜๊ธฐ ๊ท€์ฐฎ์•„์„œ์ด๋‹ค. n = int(input()) time = [] for _ in range(n): time.append(tuple(map(int, input().split()))) # print(time) time = sorted(time, key=lambda x: (x[0], x[1])) # print(time) cnt = 0 while len(time) > 0: start = time[0][0] end = time[0][1] del time[0] for i in range(len(time)): if time[i][0] >= end: start = time[i][0] end = time[i][1] del time[i] b..
ํŒ€์› ๋ถ„์˜ ํ—ค๋” ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„ ํ•œ ํŒ€์› ๋ถ„๊ป˜์„œ ์œ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ๋งก์œผ์…จ๋‹ค. ๊ฐ„๋‹จํ•ด๋ณด์ด์ง€๋งŒ ์‚ฌ์‹ค ๊ฐ„๋‹จํ•˜์ง€ ์•Š๋‹ค. ๋กœ๊ทธ์ธ ๋กœ๊ทธ์•„์›ƒ ์œ ๋ฌด๋„ ๊ทธ๋ ‡๊ณ  search ํ•˜๋Š” ๋ถ€๋ถ„๋„ ๊ทธ๋ ‡๊ณ  ๋ฌด์—‡๋ณด๋‹ค ์ € notification. ํ—ค๋” ๋งจ ์˜ค๋ฅธ์ชฝ ์ž๊ทธ๋งˆํ•œ ์•„์ด์ฝ˜์„ ๋ˆ„๋ฅด๋ฉด ๋œจ๋Š” ์ปดํฌ๋„ŒํŠธ์ด๋‹ค. ํŒ€์›๋ถ„์ด ์—ฌ๊ธฐ์„œ ์–ด๋ ค์šด ๋ถ€๋ถ„์ด ์žˆ์œผ์…จ๋Š”๋ฐ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ํƒ€์ž… ์ชฝ์€ ๋‚ด๊ฐ€ ์ž๋ฃŒ๋ฅผ ์ฐพ์•„์„œ ๊ถ๊ธˆ์ฆ์„ ํ•ด์†Œ์‹œ์ผœ๋“œ๋ ธ๊ณ  ์ฒซ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋ฉด ๋ชจ๋“  ์•Œ๋ฆผ์„ ์ฝ์Œ ์ฒ˜๋ฆฌํ–ˆ์„๋•Œ ์ž๋™์œผ๋กœ ์•Œ๋ฆผ์ฐฝ์ด ๋‹ซํžˆ๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ์…จ๋‹ค๊ณ  ํ–ˆ๋‹ค. ๋œจ๊ฑฐ์šด ํ† ๋ก  ํ˜„์žฅ ์ด์— ๋Œ€ํ•ด์„œ ์ด ํŒ€์› ๋ถ„๊ณผ ๋งŽ์€ ์–˜๊ธฐ๋ฅผ ๋‚˜๋ˆด๋‹ค. ๋‚˜๋„ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉฐ ๋ฌธ์ œ์ ์„ ์ฐพ๊ธฐ ์ •๋ง ์–ด๋ ค์› ์ง€๋งŒ ๊ฒฐ๊ตญ์—” ์ฐพ์•„๋‚ด์—ˆ๋Š”๋ฐ ์ฒ˜์Œ์—๋Š” race condition ์ด์Šˆ์ธ๊ฐ€(?) ํ•˜๋‹ค๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋™์ž‘ ์›๋ฆฌ ๋•Œ๋ฌธ์ž„์„ ..
๊ธฐ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ ๋ถ„์„ ํ”ผ๊ทธ๋งˆ์—์„œ ๊ฐ€์ ธ์™”๋‹ค. ์œ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ํŽ˜์ด์ง€๊ฐ€ ์ตœ๋Œ€ 7๊ฐœ๋งŒ ๋ณด์—ฌ์ ธ์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๊ณ , ์„ ํƒ๋œ ํŽ˜์ด์ง€๋ฅผ ๊ฐ€์šด๋ฐ์— ์˜ค๋„๋ก ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ตฌํ˜„ export default function Pagination({ currentPage, setCurrentPage, allDataCount, perPageDataCount }: Props) { const pageCount = Math.ceil(allDataCount / perPageDataCount); const pageNumberList = createPageNumberList(currentPage, pageCount); return ( {pageCount > PAGE_LIMIT && ( setCurrentPage(current..
์ฝ”๋”ฉ ์ปจ๋ฒค์…˜ ์กฐ์œจ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜์„ ์ œ๋Œ€๋กœ ๋งž์ถ”์–ด ๋ณธ ์ ์ด ์—†์—ˆ๋‹ค. ์ด๋ฒˆ์— ์Šคํ”„๋ฆฐํŠธ์—์„œ ์ค‘๊ธ‰ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉฐ ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜์„ ํ™•์‹คํ•˜๊ฒŒ ์ •ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ์ด๋ฅผ ์ž˜ ์ง€ํ‚ค๋ ค๊ณ  ๋…ธ๋ ฅ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค. ๋Œ€์ถฉ ์ด์ •๋„๋กœ ์ •ํ–ˆ๋Š”๋ฐ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” airbnb ๋ฃฐ์—์„œ ์–ด๋Š์ •๋„ ์ปจ๋ฒค์…˜์„ ํ†ต์ผ์‹œ์ผœ์ฃผ๊ณ  ์ฒ˜์Œ๋ถ€ํ„ฐ ์„ธ์„ธํ•˜๊ฒŒ ์žก๊ณ  ๊ฐ€๊ธฐ์—๋Š” ์‹œ๊ฐ„์ด ์—†์œผ๋ฏ€๋กœ ๋‚˜๋จธ์ง€ ์ปจ๋ฒค์…˜์€ ์ถ”ํ›„ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•ด๋‚˜๊ฐ€๋ฉด์„œ ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. ์—ญํ• ๋ถ„๋ฐฐ ์ด์ „์— ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ ์ž‘์—… ๋ถ„๋ฐฐ ๋‚˜๋Š” ์ถ”ํ›„์— ์ด ํ”„๋กœ์ ํŠธ์—์„œ ๊ณต๊ณ  ๋ฆฌ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์™€์„œ ์บ์‹ฑํ•˜๋Š” ์ž‘์—…(ํŽ˜์ด์ง€๋„ค์ด์…˜ ์ด์šฉ)์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹ถ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ์—์„œ pagination์„ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๊ณ  ํŒ€์›๋“ค์—๊ฒŒ ์–ดํ•„์„ ํ•˜์˜€๋‹ค. ๋‹คํ–‰ํžˆ๋„ ๋‚ด ์˜๊ฒฌ์„ ๋ฐ›์•„๋“ค์—ฌ์ฃผ์…”์„œ pagination ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋˜..
eslint ์„ค์ • airbnb๋ฃฐ์„ ๋”ฐ๋ฅด๊ธฐ๋กœ ํ–ˆ๋‹ค. yarn add -D eslint-config-airbnb eslint-config-airbnb-typescript yarn add -D eslint-plugin-import eslint-plugin-jsx-a11y eslint-plugin-react eslint-plugin-react-hooks @typescript-eslint/eslint-plugin yarn add -D @typescript-eslint/parser yarn add -D prettier eslint-config-prettier eslint-plugin-prettier ์œ„ ๊ฐ™์ด ์„ค์น˜๋ฅผ ์ง„ํ–‰ํ›„, { "env": { "browser": true, "es6": true }, "extends..
์ž…์‚ฌ๊ณผ์ œ๋ฅผ ๋ฐ›๋‹ค..! ์ง€์ธ ์ถ”์ฒœ์„ ํ†ตํ•ด ์ž‘์€ ์Šคํƒ€ํŠธ์—…์—์„œ Next.js์™€ ts๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ์ง๋ฌด์— ์ฑ„์šฉ๋  ๊ธฐํšŒ๋ฅผ ์–ป์—ˆ์—ˆ๋‹ค. ์—ฐ๋ฝํ•œ์ง€ ์–ผ๋งˆ ๋˜์ง€ ์•Š์•„ ์ž…์‚ฌ๊ณผ์ œ๋ฅผ ๋ฐ›๊ฒŒ ๋˜์—ˆ๋‹ค ์ผ์„ ํ‚ค์šฐ๋‹ค ์ž…์‚ฌ๊ณผ์ œ๋Š” ํฌํŠธํด๋ฆฌ์˜ค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด์—ˆ๋Š”๋ฐ ๊ฐ„๋‹จํ•œ ๊ณผ์ œ์ด์ง€๋งŒ ๋””์ž์ธ ์‹œ์•ˆ์ด ์ฃผ์–ด์ง€์ง€ ์•Š๊ณ  ํ‰๊ฐ€ํ•ญ๋ชฉ์—๋Š” ์ฐฝ์˜์„ฑ์„ ๊ฐ•์กฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€์ถฉ ๋งŒ๋“ค๋‹ค๊ฐ€๋Š” ๋ˆˆ์— ๋„์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์•˜๋‹ค. ๊ทธ๋ž˜์„œ ๋‚ด ๋‚˜๋ฆ„๋Œ€๋กœ ๊ณผ์ œ์˜ ์Šค์ผ€์ผ์„ ํ‚ค์›Œ์„œ ์ง„ํ–‰ํ–ˆ๋‹ค. ๊ณผ์ œ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ ์ฒ˜์Œ ์จ๋ณด๋Š” ๊ธฐ์ˆ ๋“ค์„ (graphql, supabase)๋ฅผ ์ ์šฉํ•˜๋ฉฐ ๊ณผ์ œ๋ฅผ ๋งŒ๋“œ๋Š” ์ค‘์— ์ผ์ฃผ์ผ๋กœ๋Š” ๋ฌด๋ฆฌ์ผ ๊ฒƒ์ด๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ๋˜ ํ˜„์žฌ ์Šคํ”„๋ฆฐํŠธ๋ผ๋Š” ๋ถ€ํŠธ์บ ํ”„์— ์ฐธ์—ฌํ•˜๊ณ  ์žˆ๊ณ  ํšŒ์‚ฌ์™€ ๋ถ€ํŠธ์บ ํ”„์˜ ๋ณ‘ํ–‰์€ ํž˜๋“ค๊ธฐ ๋•Œ๋ฌธ์— ๊ณผ์ œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฃผ๋ง๋™์•ˆ ์ •๋ง ๋งŽ์€ ๊ณ ๋ฏผ์„ ํ–ˆ๋‹ค. ์•„์ง ์ค‘๊ธ‰ ํ”„๋กœ์ ํŠธ์™€ ์‹ฌ..
๋ฌธ์ œ์  ์š”๊ตฌ์‚ฌํ•ญ ์œ„์ฒ˜๋Ÿผ 6๊ฐœ์˜ ๋ชจ๋‹ฌ์„ ๋งŒ๋“ค์–ด์•ผ ํ–ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ชจ๋‹ฌ์„ ๋งŒ๋“  ๋ฐฉ๋ฒ• export const Modal = ({ modalRef, openModal, handleModalClose, children, }: Props) => { if (!openModal) { return ; } return ( . {children} ); }; ์œ„์˜ modal์€ ์—ฌ๋Ÿฌ ๋ชจ๋‹ฌ์˜ ๊ณตํ†ต ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ ์—ญํ• ์„ ํ•˜๋ฉฐ, ๋ชจ๋‹ฌ์˜ ๊ณตํ†ต์ ์ธ ๊ธฐ๋Šฅ๋“ค์„ ๋„ฃ์–ด๋†“์•˜๋‹ค. ๋ชจ๋‹ฌ์„ ์—ฌ๋Š” ํ•จ์ˆ˜(openModal์„ true๋กœ ๋ฐ”๊พธ๋Š” ํ•จ์ˆ˜)์˜ ๊ฒฝ์šฐ๋Š” ๋ชจ๋‹ฌ์„ ์‚ฌ์šฉํ•˜๋Š” ์ชฝ์—์„œ ๋งŒ๋“ค์–ด์ค˜์•ผ ํ–ˆ๋‹ค. ๋ชจ๋‹ฌ์„ ๋‹ซ๋Š” ํ•จ์ˆ˜ ๋˜ํ•œ ๋งˆ์ฐฌ๊ฐ€์ง€์˜€๊ณ , ์ด๊ฒƒ๋“ค์„ ๋ชจ๋‹ฌ์„ ์‚ฌ์šฉํ•˜๋Š” ์ชฝ์—์„œ ์ผ์ผ์ด state๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋น„ํšจ์œจ์ ์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ปค์Šคํ…€ํ›…์„ ๋งŒ๋“ค์—ˆ๋‹ค. import {..
์ข‹์•˜๋˜ ์  React-hook-form์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” ์ปค์Šคํ…€ ํ›…์„ ์ด์šฉํ•˜๋ฉด ์ •๋ง ๊ฐ„ํŽธํžˆ ํผ์„ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋‹จ์ˆœํžˆ ์œ„์ฒ˜๋Ÿผ ์ ๊ณ  ์ด๋ฅผ input์— ๋„ฃ์–ด์ค€๋‹ค๋ฉด ์ด๋ฉ”์ผ์ด ๋น„์—ˆ์„ ๋•Œ, ์ •๊ทœ์‹์— ๋งž์ง€ ์•Š์„๋•Œ, checkIsDuplicated๋ผ๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜์—์„œ true๊ฐ€ ์•„๋‹Œ ์—๋Ÿฌ๋ฅผ ๋ฆฌํ„ดํ•  ๋•Œ ๊ฐ๊ฐ ์•Œ๋งž์€ error๋ฅผ ์„ธํŒ…ํ•ด์ค€๋‹ค. ์ฝ”๋“œ๋„ ๊ฝค๋‚˜ ๊น”๋”ํ•˜๊ฒŒ ์งค ์ˆ˜ ์žˆ์—ˆ๊ณ  ๋„ˆ๋ฌด ๋งˆ์Œ์— ๋“ค์—ˆ๋‹ค. ๋ณ„๋กœ ์˜€๋˜์  ์•„๋ฌด๊ฒƒ๋„ ์ž…๋ ฅํ•˜์ง€ ์•Š๊ณ  ์ œ์ถœ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด react-hook-form์—์„œ ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜์ธ handleSubmit์„ ์‹คํ–‰์‹œ์ผœ error๊ฐ€ ์žˆ์„์‹œ์— api request๋ฅผ ๋ณด๋‚ด์ง€ ์•Š๋„๋ก ํ•˜์˜€๋‹ค. ๋ฌธ์ œ๋Š” ์ด handleSubmit์„ ์‹คํ–‰ํ•˜๋ฉด ์œ„์™€ ๊ฐ™์ด ์ž๋™์œผ๋กœ focusing์ด ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.(์—๋Ÿฌ๊ฐ€ ๋ณด์—ฌ์•ผ ํ•˜๋Š”๋ฐ ..
๊น€ํƒœ์ง„
My Dev History๐Ÿ’ป