lil.dev
Published on

๐ŸŽ‰ ์ปฌ๋Ÿฌ๋ฆฌ์ŠคํŠธ ํ”„๋กœ์ ํŠธ #22 ๋ฌด์ž‘์œ„(shuffle) ํ•จ์ˆ˜ ์‚ฌ์šฉ

๊ธ€์“ด์ด

    ๐Ÿ“Œ

    Welcome

    โœจ ์ปฌ๋Ÿฌ๋ฆฌ์ŠคํŠธ ์‚ฌ์ดํŠธ(์•„์ง ์—†์Œ

    ๋ฉ”์ธ ํŽ˜์ด์ง€ ์ƒ๋‹จ์˜ ์บ๋กœ์…€ ์•ˆ์— ๋ฌธ์ œ ์ œ๋ชฉ ๋งํฌ๋ฅผ ๋ฌด์ž‘์œ„๋กœ ๋„ฃ์–ด์ฃผ๋ ค๊ณ  ํ–ˆ๋‹ค.

    ์ผ๋‹จ ๋ฌธ์ œ๋ชฉ๋ก์„ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋ฏ€๋กœ import { problemList } from "../qlists/problemList"; ๋ฌธ์ œ๋ชฉ๋ก์ด ์ ํžŒ ํŒŒ์ผ์—์„œ problemList๋ฅผ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.

    ๊ทธ ๋‹ค์Œ mapํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๋ฌธ์ œ๋ฅผ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด์–ด ์บ๋กœ์…€์— ๋„ฃ์–ด์ค€๋‹ค.

    ํ•˜์ง€๋งŒ ๋ฌธ์ œ๋ฅผ ๊บผ๋‚ด์–ด ๋„ฃ์œผ๋‹ˆ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋ฌธ์ œ๋“ค์ด ์บ๋กœ์…€์•ˆ์— ๋“ค์–ด๊ฐ”๋‹ค. ๊ทธ๋ž˜์„œ ๊ตฌ๊ธ€๋ง์œผ๋กœ ์ฐพ์€ shuffleํ•จ์ˆ˜ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•ด ๋จผ์ € ๋ฌธ์ œ ๋ชฉ๋ก์„ ์–‡๊ฒŒ ๋ณต์‚ฌํ•ด์˜จ๋’ค shuffleํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  ๋ถ€์ˆ˜ ํšจ๊ณผ๋กœ ๋ฌด์ž‘์œ„๋กœ ์„ž์ธ ๋ฐฐ์—ด์„ ๋‹ค์‹œ ๋ฐ˜ํ™˜ํ•ด์˜จ๋‹ค.

    function shuffle<T>(array: T[]) {
      const copied = [...array]
      copied.sort(() => Math.random() - 0.5) //๋ถ€์ˆ˜ ํšจ๊ณผ
      return copied
    }
    

    ์—ฌ๊ธฐ์„œ ๋ถ€์ˆ˜ ํšจ๊ณผ๋ž€, ~์ธ๋ฐ ํ•จ์ˆ˜์— ์–ด๋–ค ๊ฐ’์„ ๋„ฃ์—ˆ์„ ๋•Œ ๋ฐ˜ํ™˜๊ฐ’์ด ๋ณ€ํ•˜๋Š” ๊ฒƒ๋„ ๋ถ€์ˆ˜ ํšจ๊ณผ ์ค‘์— ํ•˜๋‚˜์ด๋‹ค.

    ๋ถ€์ˆ˜ํšจ๊ณผ ์ค‘์—๋Š”

    1. ๋ฌด์ž‘์œ„๋กœ ๊ฐ’์ด ์„ž์ด๋Š” ๊ฒƒ
    2. ๊ธฐ์กด์˜ ๊ฐ’์„ ๋ณ€ํ˜•ํ•˜๋Š” ๊ฒƒ
    3. ์™ธ๋ถ€์— ์ž…์ถœ๋ ฅ์„ ํ•˜๋Š” ๊ฒƒ ์ด ์žˆ๋Š”๋ฐ,
    4. ๋ฌด์ž‘์œ„๋กœ ๊ฐ’์ด ์„ž์ด๋Š” ๊ฒƒ -> seed๋กœ ํ•ด๊ฒฐ
    5. ๊ธฐ์กด์˜ ๊ฐ’์„ ๋ณ€ํ˜•ํ•˜๋Š” ๊ฒƒ -> ๋ถˆ๋ณ€๊ณผ ๋ณต์‚ฌ๋กœ ํ•ด๊ฒฐ
    6. ์™ธ๋ถ€์— ์ž…์ถœ๋ ฅ์„ ํ•˜๋Š” ๊ฒƒ -> ์ž…์ถœ๋ ฅ๊ณผ ํ•ต์‹ฌ ๋กœ์ง์˜ ๋ถ„๋ฆฌ๋กœ ํ•ด๊ฒฐ ์ด๋Ÿฌํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

    ์ฐธ๊ณ ๋กœ ๋ถ€์ˆ˜ ํšจ๊ณผ๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜๋Š” pure function, ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋ผ๊ณ  ํ•˜๋Š”๋ฐ ๋˜‘๊ฐ™์€ ๊ฑธ ๋„ฃ์œผ๋ฉด ๋˜‘๊ฐ™์€ ๊ฒŒ ๋‚˜์˜ค๋Š” ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜๋ฅผ ๋œปํ•œ๋‹ค. ์˜ˆ๋กœ `map`` ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

    ๋‹ค์‹œ ๋Œ์•„์™€์„œ shuffle ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฐ”๋€ data๋ฅผ ๊ฐ€์ ธ์™€์„œ ์บ๋กœ์…€ ์•ˆ์— ๋„ฃ์–ด์ค€๋‹ค.
    ์ด๋•Œ useEffect๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ’์ด ํ•œ๋ฒˆ ๋ฐ”๋€ ๋’ค์—๋Š” ๋ฌธ์ œ ๋ชฉ๋ก์ด ์ˆ˜์ •๋˜์ง€ ์•Š๋Š”ํ•œ ๋”์ด์ƒ ๋ฐ”๋€Œ์ง€ ์•Š๋„๋ก ํ•ด์ค€๋‹ค.

    useEffect() : ์ฒ˜์Œ ๋”ฑ ํ•œ๋ฒˆ๋งŒ ์‹คํ–‰๋œ๋‹ค. dependency array(์˜์กด์„ฑ ๋ฐฐ์—ด)์ด ๋ฐ”๋€” ๋•Œ์—๋งŒ ์‹คํ–‰ํ•ด์ค€๋‹ค!

    useEffect(shuffleProblems, []) ^ ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ^ ์˜์กด์„ฑ ๋ฐฐ์—ด

    function Root() {
      const [shuffled, setShuffled] = useState([] as typeof problemList);
      useEffect(() => {
        setShuffled(shuffle(problemList));
      }, []);
      return (
        <>
          <Carousel>
            {shuffled.map((problem) => (
              <Link to={"/quizs/" + problem.id}>
                <h3 className="text-3xl">{problem.title}</h3>
              </Link>
            ))}
          </Carousel>