๋ฌธ์ ๋ด์ฉ ๐โ๏ธํ์ด function solution(s) { let answer = true; const str = s.toUpperCase(); const stringArray = str.split(""); const pCount = stringArray.filter((item) => "P" === item).length; const yCount = stringArray.filter((item) => "Y" === item).length; if (pCount !== yCount) answer = false; return answer; } /* (ํ์ด) ์ฃผ์ด์ง ๋ฌธ์์ด s ๋ฅผ ๋๋ฌธ์๋ก ๋ณ๊ฒฝํ๊ณ split์ ์ด์ฉํด ๊ฐ์์ ์ํ๋ฒณ์ผ๋ก ๋๋์ด์ง ๋ฐฐ์ด๋ก ๋ง๋ค์ด ์ค ๋ค filterํจ์๋ฅผ ์ด์ฉํ์ฌ ํด๋นํ๋ ์ํ๋ฒณ..
FE๋ฅผ ํฅํดโโ
import { useState } from "react"; const useForm = (initialState = {}) => { const [formData, setFormData] = useState(initialState); const InputChangeHandler = (e) => { const { name, value } = e.target; setFormData({ ...formData, [name]: value }); }; return { formData, InputChangeHandler, }; }; export default useForm; Custom Hook์ ์ด์ฉํด form์ ๋ง๋ค๋ ์ฌํ์ฉ์ด ๊ฐ๋ฅํ๊ฒ ๋ง๋ค์ด๋ดค๋ค. ์ฐ์ initaialState์ Default ๊ฐ์ ๋น ๊ฐ์ฒด๋ก ๋ง..
๋ฉ๋ชจ์ด์ ์ด์
(memoization) ์ด๋?โญ ํ๋ก๊ทธ๋๋ฐ์์ ๋ฐ๋ณต๋๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ ํด๋๊ณ ๋ค์์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ๋ ๋ค์ ๊ณ์ฐํ ํ์์์ด ๋นจ๋ฆฌ ์คํ ํ๋ ๊ธฐ๋ฒ์ด๋ค. JavaScript์์๋ ํด๋ก์ ๋ฅผ ํตํด ๊ณ์ ์ ์ง๋๋ ์ ์ฅ๊ณต๊ฐ์ ๋ง๋ค ์ ์๋ค. ๋ hooks ๋ ๋ฉ๋ชจ์ด์ ์ด์
์ ์ด์ฉํ ๋ฐฉ๋ฒ์ผ๋ก ๋ถํ์ํ ๋ ๋๋ง์ ๋ง์ ์ ์์ผ๋, ์ฌ์ฉ ์์ฒด๋ก๋ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉ๋์ด ์ฑ์์ง๋ฏ๋ก ์ฌ์ฉํ๊ธฐ ์ ์ ์คํ ์๊ฐ ํด ๋ด์ผํ๋ค. useMemo ์ฌ์ฉ๋ฒ ๐ const memo = useMemo(() => { return blabla; },[list]) useMemo๋ ์ฒซ๋ฒ์งธ ์ธ์๋ก ์ฝ๋ฐฑ ํจ์๋ฅผ ๋๋ฒ์งธ ์ธ์๋ก ์์กด์ฑ(dependency) ๋ฐฐ์ด์ ๋ฐ๋๋ค. useMemo๋ list๊ฐ ๋ณํ๋ค๋ฉด ์ฝ๋ฐฑ ํจ์๋ฅผ ์คํํ๊ณ blab..