๊ด€๋ฆฌ ๋ฉ”๋‰ด

C-log

[FE]๋ฌธ์ œ ๋žœ๋ค ๊ตฌํ˜„(1) ๋ณธ๋ฌธ

๐Ÿ’ป๊ฐœ๋ฐœ ๋…ธํŠธ/๋‚˜๋งŒ์˜ ์‹œํ—˜์ง€

[FE]๋ฌธ์ œ ๋žœ๋ค ๊ตฌํ˜„(1)

4:Bee 2024. 2. 27. 15:49
728x90

๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ๋ฌธ์ œ๊ฐ€ ์„ž์ผ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ•œ๋‹ค. ์šฐ์„  ๋žœ๋ค์œผ๋กœ ๋ฌธ์ œ๋ฅผ ์„ž๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ”ผ์…” ์˜ˆ์ด์ธ  ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 
// shuffleArray(Fisher-Yates) ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด์„ ์„ž๋Š” ํ•จ์ˆ˜
function shuffleArray(array) {
  for (let i = array.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [array[i], array[j]] = [array[j], array[i]];
  }
  return array;
}
 

์ฃผ์–ด์ง„ ๋ฐฐ์—ด์˜ ๊ธธ์ด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์—ญ์ˆœ์œผ๋กœ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ๊ฐ ์ธ๋ฑ์Šค์™€ ๋žœ๋ค์œผ๋กœ ์„ ํƒ๋œ ์ธ๋ฑ์Šค๋ฅผ ๊ตํ™˜ํ•˜์—ฌ ๋ฐฐ์—ด์„ ์„ž๋Š”๋‹ค. ์ด ๊ณผ์ •์„ ํ†ตํ•ด ์ œํ•œ๋œ ๋ฌธ์ œ ๋ฐฐ์—ด์˜ ์ˆœ์„œ๋ฅผ ๋žœ๋คํ•˜๊ฒŒ ์„ž์„ ์ˆ˜ ์žˆ๋‹ค. 

์™œ ์—ญ์ˆœ์œผ๋กœ ๋ฐ˜๋ณตํ•ด์•ผํ•˜๋ƒ๋ฉด ๋ฌธ์ œ๋ฅผ ์„ž์„ ๋•Œ ๊ณ ๋ฅด๊ฒŒ ์„ž์ด๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ทธ๋ ‡๋‹ค. ๋งŒ์•ฝ ์ •๋ฑกํ–ฅ์œผ๋กœ ์„ž๋Š”๋‹ค๋ฉด ๋ฌธ์ œ๊ฐ€ ๊ณ ๋ฅด๊ฒŒ ์„ž์ด์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฆ‰, ์ˆœ์ฐจ์ ์œผ๋กœ ์„ž์ด๊ฒŒ ํ–ˆ์„ ๊ฒฝ์šฐ์— ๊ธธ์ด๊ธฐ ์ฆ๊ฐ€๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์„ž์ด๊ฒŒ ๋˜๋Š” ์ธ๋ฑ์Šค ๋ฒ”์œ„๊ฐ€ ๋Š˜์–ด๋‚œ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ด์ „์— ์ด๋ฏธ ์„ž์ธ ์š”์†Œ๋“ค์ด ๋‹ค์‹œ ํ•œ๋ฒˆ ๋” ์„ž์ด๊ฒŒ ๋˜๊ฑฐ๋‚˜ ์ค‘๋ณต๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ญ์ˆœ์œผ๋กœ ๋ฐ˜๋ณตํ•˜๊ฒŒ ํ•ด์•ผํ•œ๋‹ค. ๋‹ค์Œ์œผ๋กœ ๋„˜์–ด๊ฐ€์„œ ํ•ด๋‹น ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ ์šฉ๋˜์–ด์•ผํ•  ๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด ๋ณด์ž.

 
useEffect(() => {
    fetch('http://localhost:3001/sample')
      .then(res => res.json())
      .then((data) => {
        const shuffledData = shuffleArray(data); // ๋ฐ์ดํ„ฐ ๋ฐฐ์—ด์„ ๋žœ๋คํ•˜๊ฒŒ ์„ž์Œ
        setData(shuffledData.slice(0, limit)); // limit์— ๋งž๊ฒŒ ์ž˜๋ผ์„œ ์‚ฌ์šฉ
      })
      .catch((error) => {
        console.error("Error fetching data:", error);
      });
  }, [limit]);
 

๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๋Š” ๋ถ€๋ถ„์—์„œ ๋ฌธ์ œ๋ฅผ ๋ฏธ๋ฆฌ ์„ž์—์„œ ์›ํ•˜๋Š” ๊ธธ์ด๋งŒํผ ์ถ”์ถœ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ ํ–ˆ๋‹ค. ํ•˜์ง€๋งˆ ์—ฌ๊ธฐ์— ์•„์ฃผ ํฐ ๋‹จ์ ์ด ์žˆ๋‹ค. ๋ฐ”๋กœ ๋ฐ›์•„์˜จ ๋ฌธ์ œ ์ „์ฒด๋ฅผ ์„ž๋Š” ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ์ฆ‰, ๋ฐ์ดํ„ฐ ์ „์ฒด๋ฅผ ์„ž์€ ๋‹ค์Œ ์›ํ•˜๋Š” ๊ธธ์ด๋งŒํผ ์ถ”์ถœ ํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ๋ฌธ์ œ๋“ค๋งŒ ์„ž๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์–ธ๊ธ‰ํ•˜๋ฉด์„œ ์„ค๋ช…ํ•˜์ž๋ฉด shffeldData๋Š” ๋ฌธ์ œ๊ฐ€ ์„ž์ธ data๋“ค์„ ๋‹ด๊ณ  ์žˆ๋‹ค. ์ด ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  setData์—์„œ ์›ํ•˜๋Š” ๊ธธ์ด๋งŒํผ slice๋ฌธ์œผ๋กœ ์ž˜๋ผ๋‚ด๋Š”๋ฐ data ๋ชจ๋‘๋ฅผ ์„ž์–ด๋‚ด๋Š” ๊ณผ์ •์—์„œ ๋‚ด๊ฐ€ ๋งํ•œ ๋ฌธ์ œ๋“ค์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋ฌธ์ œ๋ฅผ ๋จผ์ € sliceํ•ด์„œ ๋ณ€์ˆ˜์— ๋‹ด์•„ ๋‘๊ณ  ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์„ž์–ด๋„ค๋Š” ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค. ์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜๋ฉด ์•ž์„œ ๋งํ•œ ์ œํ•œ๋œ ๋ฌธ์ œ ์•ˆ์—์„œ ๋ฌธ์ œ๋ฅผ ์„ž์–ด ๋‚ด๊ธฐ๊ฐ€ ์–ด๋ ต๊ณ  ๋ฒ„ํŠผ ๊ตฌํ˜„์˜ ์–ด๋ ค์›€์ด ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์Œ ํฌ์ŠคํŒ… ๋•Œ ์ด๋ฅผ ์ˆ˜์ • ๋ณด์™„ ํ•  ์˜ˆ์ •์ด๋‹ค. ์ „์ฒด ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

import React, { useState, useEffect } from "react";
import { Link } from "react-router-dom";

// shuffleArray(Fisher-Yates) ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด์„ ์„ž๋Š” ํ•จ์ˆ˜
function shuffleArray(array) {
  for (let i = array.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [array[i], array[j]] = [array[j], array[i]];
  }
  return array;
}

export default function LabExam() {
  const [data, setData] = useState([]);
  const [limit, setLimit] = useState(5);

  useEffect(() => {
    fetch('http://localhost:3001/sample')
      .then(res => res.json())
      .then((data) => {
        const shuffledData = shuffleArray(data); // ๋ฐ์ดํ„ฐ ๋ฐฐ์—ด์„ ๋žœ๋คํ•˜๊ฒŒ ์„ž์Œ
        setData(shuffledData.slice(0, limit)); // limit์— ๋งž๊ฒŒ ์ž˜๋ผ์„œ ์‚ฌ์šฉ
      })
      .catch((error) => {
        console.error("Error fetching data:", error);
      });
  }, [limit]);

  return (
    <div>
      <h2>Test</h2>
      <select onChange={(e) => { setLimit(e.target.value); }}>
        <option value={5}>5</option>
        <option value={10}>10</option>
        <option value={15}>15</option>
        <option value={20}>20</option>
      </select>
      <Link to="/">back</Link>
      <ol>
        {data.map((item) => (
          <li key={item.id}><p>{item.question}</p>{item.options}</li>
        ))}
      </ol>
    </div >
  );
}

๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ๋Š” ๋ฒ„ํŠผ์„ ์ƒ์„ฑํ•ด์„œ ๋ฌธ์ œ๋ฅผ ์„ž์–ด๋‚ด๋Š” ๋ถ€๋ถ„์„ ๊ตฌํ˜„ํ•ด ๋ณผ ๊ฒƒ์ด๋‹ค.

 

 

Shuffle Algorithm : ๋ฌด์ž‘์œ„๋กœ ์„ž๊ธฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ - Fisher-Yates Shuffle & Knuth Shuffle

Dana Daheen Lee<br>#iOS #Swift #CleanCode #Programming

daheenallwhite.github.io

 

728x90
Comments