[Lv1] ๋ชจ์๊ณ ์ฌfunction solution(answers) { const user1 = [1, 2, 3, 4, 5]; const user2 = [2, 1, 2, 3, 2, 4, 2, 5]; const user3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]; const answer = [0, 0, 0]; const result=[]; for (let i = 0; i ๋จ์ํ๊ฒ, ์ ๋ต๋ฐฐ์ด๊ณผ ๊ฐ user1,2,3์ ๋ฐฐ์ด์ ์ํํ๋ฉด์ ๊ฐ index์ ์ ๋ต์ด ์ผ์นํ๋์ง ํ์ธํ๋ฉด์ ์ ๋ต๊ฐ์๋ฅผ ์นด์ดํธํด์ค๋ค, ๊ฐ์ฅ ์ ๋ต์ ๋ง์ถ ์ ์ ๋ฅผ ์ ๋ต๊ฐฏ์์ ๋น๊ตํด answer ๋ฐฐ์ด์ pushํด์ค๋ค. ๐ Refactoringfunction solution(answers)..
๋ถ๋ฅ ์ ์ฒด๋ณด๊ธฐ
SSR์ CSR์ SEO CSR (React.js) CSR(ClientSide Rendering)์ ๊ฒฝ์ฐ ์ด๊ธฐ์ ๋น html ๋ฌธ์๋ฅผ ์ ๋ฌํ๊ธฐ ๋๋ฌธ์, ๋ด์ด ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ธฐ ์ด๋ ต๊ธฐ๋๋ฌธ์ SEO์ ๋ถ๋ฆฌํ๋ค. SSR(Next.js)ํ์ง๋ง, SSR(ServerSide Rendering)์ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ ํ์ด์ง๋ฅผ ์๋ฒ์์ ๋์ ์ผ๋ก ์์ฑํด ๋ธ๋ผ์ฐ์ ์ ๋ณด๋ด๋ ๋ฐฉ์์ผ๋ก, ์ด๋ฏธ ์๋ฒ์ชฝ์์ ๋ง๋ค์ด์ง ์์ฑ๋ html์ ๊ฒ์์์ง๋ค์ด ํฌ๋กค๋ง์ด ๊ฐ๋ฅํ๊ธฐ๋๋ฌธ์ ๊ฒ์์ ์ ๋ฆฌํด์ง๋ค. SEO ์ง๋จโ
SSR์ ์ฅ์ ์ธ SEO ์ฑ๋ฅ ์ต์ ํ ์์
ํ๊ธฐ ์ , SEO checkup์ ํด๋ณด์๋ค.https://pagespeed.web.dev/analysis/https-balanco-vercel-app/hxv2uh2yl9?form_factor..
[Lv1] ํฐ์ผ๋ชฌfunction solution(nums) { const map=new Map(); //ํฐ์ผ๋ชฌ ์ข
๋ฅ ๊ตฌํ๊ธฐ for(const num of nums){ map.set(num,map.get(num)+1||1) } const type=map.size return Math.min(type,Math.floor(nums.length/2));}์ต๋ํ ๋ค์ํ ์ข
๋ฅ์ ํฐ์ผ๋ชฌ์ ๊ฐ์ ธ๊ฐ๊ธธ ์ํ๊ณ , nums/2๋งํผ์ ํฐ์ผ๋ชฌ์ ๊ฐ์ ธ๊ฐ ์ ์๊ธฐ ๋๋ฌธ์ ํฐ์ผ๋ชฌ ์ข
๋ฅ์ ์์ nums/2์ค ์ต์๊ฐ์ ๋ฆฌํดํด์ฃผ๋ฉด ๋๋ค. ๐ Refactorfunction solution(nums) { //ํฐ์ผ๋ชฌ ์ข
๋ฅ ๊ตฌํ๊ธฐ const set=new Set(nums); c..
์ด์๊ฐ์ด, ์ฑํ
์ ์
๋ ฅํ์๋ ์๋์ผ๋ก ์คํฌ๋กค์ ํด์ค์ผํ๋ ๋ถํธํจ์ด ์์๋ค. "use client";import { useEffect, useRef } from "react";function MessageList({ messageList }) { const scrollRef = useRef(null); useEffect(() => { if (scrollRef.current) { scrollRef.current.scrollTop = scrollRef.current.scrollHeight; } }, [messageList]); return ( {messageList.map((message) => { return ( ๋ฉ์์ง ); ..
์ฑํ
์
๋ ฅ์ฐฝ์ ์ด๋ชจ์ง ์์ด์ฝ์ ๋๋ฅด๋ฉด, ์ด๋ชจํฐ์ฝ ํค๋ณด๋๊ฐ ๋์ ์ด๋ชจ์ง๋ฅผ ์
๋ ฅํ ์ ์๊ฒ ๊ตฌํํ๊ณ ์ถ์๋ค. emoji-picker-react const [showPicker, setShowPicker] = useState(false); const [message, setMessage] = useState("");const onEmojiClick = (event, emojiObject) => { setMessage((prevMessage) => prevMessage + emojiObject.emoji); setShowPicker(false); }; return ( setMessage(e.target.value)} > ..
max-width๋ก ๋ฐ์ํ CSS//tailwind.config.tsmodule.exports = { theme: { screens: { 'sm-max': { 'max': '639px' }, // ๋ชจ๋ฐ์ผ (์ต๋ 639px) 'md-max': { 'max': '767px' }, // ์์ ํ๋ธ๋ฆฟ (์ต๋ 767px) 'lg-max': { 'max': '1023px' }, // ํฐ ํ๋ธ๋ฆฟ (์ต๋ 1023px) 'xl-max': { 'max': '1279px' }, // ๋ฐ์คํฌํ (์ต๋ 1279px) '2xl-max': { 'max': '1535px' } // ํฐ ๋ฐ์คํฌํ (์ต๋ 1535px) }, },๋ฐ์คํฌํ first๋ก ๊ฐ..
๊ธฐ๋ณธ Layoutimport Footer from "@/components/Footer";import Header from "@/components/Header";function RootLayout({ children }: { children: React.ReactNode }) { return ( {children} );}export default RootLayout; Error๋ Loading ์ค์ผ๋, children์ ํด๋นํ๋ content๊ฐ ์์ผ๋ฉด, ์ ๋ ๊ฒ footer๊ฐ ๋ทฐํฌํธ ์ค๊ฐ์ผ๋ก ์ฌ๋ผ์๋ฒ๋ฆฌ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. Flex-grow ์ฌ์ฉimport Footer from "@/components/Footer";..
DebounceDebounce๋ ๊ณผ๋ํ ์์ฒญ์ผ๋ก ๋ฐ์ํ ์ ์๋ ์ฑ๋ฅ ์ ํ ๋ฌธ์ ๋ฅผ ๊ฐ์ ํ ์ ์๋ ๋ฐฉ๋ฒ ์ค ํ๋๋ค.input์ฐฝ์ ์ฐ์์ ์ผ๋ก ๊ฐ์ ์
๋ ฅํ ๋, ์ด๋ฒคํธ ๋ณ๊ฒฝ์ด ๋ฐ์ํ๊ณ ๊ทธ๋๋ง๋ค ๋คํธ์ํฌ ์์ฒญ์ด ๋ฐ์ํ๊ฒ ๋๋๋ฐ, ์ด๋ฐ ๊ฒฝ์ฐ์ ์ง์์ ์ธ ์์ฒญ์ผ๋ก ์ธํด ๋คํธ์ํฌ ์ฉ๋๊ณผ ๋ฐฑ์๋ ๋ฑ ๊ณผ๋ถํ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก ์ฑ๋ฅ๋ฉด์์ ์ข์ง ๋ชปํ๋ค.(์ ๋ฃ API์ ์ฌ์ฉํ ๊ฒฝ์ฐ์ ๋น์ฉ๋ฉด์ผ๋ก๋ ๋ฌธ์ ๊ฐ๋ฐ์ํ๋ค..๐ซ ) ๐๐ป Debounce๋ฅผ ์ฌ์ฉํด, ์ฐ์์ ์ผ๋ก ๋ฐ์ํ๋ ์ด๋ฒคํธ ์ค ๋ง์ง๋ง ์ด๋ฒคํธ(๊ฒ์ํ ํค์๋) ๋ง์ ๊ธฐ์ ์ผ๋ก ๋คํธ์ํฌ ์์ฒญ์ ๋ณด๋ด, ์ฌ์ฉ์ ์
๋ ฅ๊ณผ ๊ฐ์ ๋น๋ฒํ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉํ๋ค. useDebounce : ์ฌ์ฉ์ ์ ์ Hookimport { useState, useEffect } ..