<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>jjyu_my.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Sat, 29 Mar 2025 09:20:38 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>jjyu_my.log</title>
            <url>https://velog.velcdn.com/images/jjyu_my/profile/ba86b227-b478-42c1-a394-3bf86cd2e530/image.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. jjyu_my.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/jjyu_my" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[JS_별 찍기 연습 ⭐]]></title>
            <link>https://velog.io/@jjyu_my/JS%EB%B3%84-%EC%B0%8D%EA%B8%B0-%EC%97%B0%EC%8A%B5</link>
            <guid>https://velog.io/@jjyu_my/JS%EB%B3%84-%EC%B0%8D%EA%B8%B0-%EC%97%B0%EC%8A%B5</guid>
            <pubDate>Sat, 29 Mar 2025 09:20:38 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>👩🏻‍💻 요즘 스트레스가 너무 많아서 잠시 고민거리를 접어두기 위해 찍어본 별찍기<del>⭐️
처음 배울 땐 너무 어려웠는데, 규칙을 알고 나니까 나</del>름 수월해진 별찍기..ㅎㅎ</p>
</blockquote>
<hr>
<h4 id="✅-1-왼쪽정렬-별">✅ 1. 왼쪽정렬 별</h4>
<pre><code class="language-javascript">for (let i = 0; i &lt; 5; i++) {   // i는 줄 개수를 의미
  let star = &quot;&quot;;                 // 별을 담을 빈 문자열 준비
  for (let j = 0; j &lt; i + 1; j++) {  //  j는 별의 개수
    star += &quot;*&quot;;                //  별 추가
  }
  console.log(star);            // 완성된 별 출력
}</code></pre>
<pre><code>*
**
***
****
*****</code></pre><hr>
<h4 id="✅-2-왼쪽정렬역-별">✅ 2. 왼쪽정렬(역) 별</h4>
<pre><code class="language-javascript">for (let i = 0; i &lt; 5; i++) {
  let str = &quot;&quot;;

  for (let j = 0; j &lt; 5 - i; j++) {
    str += &quot;*&quot;;
  }

  console.log(str);
}</code></pre>
<pre><code>*****
****
***
**
*
</code></pre><hr>
<h4 id="✅-3-오른쪽정렬-별">✅ 3. 오른쪽정렬 별</h4>
<pre><code class="language-javascript">for (let i = 0; i &lt; 5; i++) {
  let str = &quot;&quot;;

  for (let j = 0; j &lt; 5 - i - 1; j++) {
    str += &quot; &quot;;
  }
  for (let k = 0; k &lt; i + 1; k++) {
    str += &quot;*&quot;;
  }

  console.log(str);
}</code></pre>
<pre><code>    *
   **
  ***
 ****
*****
</code></pre><hr>
<h4 id="✅-4-오른쪽정렬역별">✅ 4. 오른쪽정렬(역)별</h4>
<pre><code class="language-javascript">for (let i = 0; i &lt; 5; i++) {
  let str = &quot;&quot;;

  for (let j = 0; j &lt; i; j++) {
    str += &quot; &quot;;
  }
  for (let k = 0; k &lt; 5 - i; k++) {
    str += &quot;*&quot;;
  }

  console.log(str);
}
</code></pre>
<pre><code>*****
 ****
  ***
   **
    *
</code></pre><hr>
<h4 id="✅-5-정삼각형-별">✅ 5. 정삼각형 별</h4>
<pre><code class="language-javascript">for (let i = 0; i &lt; 5; i++) {
  let str = &quot;&quot;;

  for (let j = 0; j &lt; 5 - i - 1; j++) {
    str += &quot; &quot;;
  }
  for (let k = 0; k &lt; i * 2 + 1; k++) {
    str += &quot;*&quot;;
  }

  console.log(str);
}</code></pre>
<pre><code>    *
   ***
  *****
 *******
*********</code></pre><hr>
<h4 id="✅-6-역삼각형-별">✅ 6. 역삼각형 별</h4>
<pre><code class="language-javascript">for (let i = 0; i &lt; 5; i++) {
  let str = &quot;&quot;;

  for (let j = 0; j &lt; i; j++) {
    str += &quot; &quot;;
  }
  for (let k = 0; k &lt; (5 - i) * 2 - 1; k++) {
    str += &quot;*&quot;;
  }

  console.log(str);
}</code></pre>
<pre><code>*********
 *******
  *****
   ***
    *
</code></pre><hr>
<h4 id="✅-7-다이아몬드-패턴-정삼각형--역삼각형">✅ 7. 다이아몬드 패턴 (정삼각형 + 역삼각형)</h4>
<pre><code class="language-js">let a = 5; // 높이

// 정삼각형
for (let i = 0; i &lt; a; i++) {
  let str = &quot;&quot;;

  for (let j = 0; j &lt; a - i - 1; j++) {
    str += &quot; &quot;;
  }
  for (let k = 0; k &lt; i * 2 + 1; k++) {
    str += &quot;*&quot;;
  }

  console.log(str);
}

// 역삼각형
for (let i = a - 2; i &gt;= 0; i--) {
  let str = &quot;&quot;;

  for (let j = 0; j &lt; a - i - 1; j++) {
    str += &quot; &quot;;
  }
  for (let k = 0; k &lt; i * 2 + 1; k++) {
    str += &quot;*&quot;;
  }

  console.log(str);
}
</code></pre>
<pre><code>    *
   ***
  *****
 *******
*********
 *******
  *****
   ***
    *</code></pre><hr>
<h4 id="✅-8모래시계-패턴-역삼각형--정삼각형">✅ 8.모래시계 패턴 (역삼각형 + 정삼각형)</h4>
<pre><code class="language-javascript">let n = 5;

// 역삼각형
for (let i = 0; i &lt; n; i++) {
  let str = &quot;&quot;;

  for (let j = 0; j &lt; i; j++) {
    str += &quot; &quot;;
  }
  for (let k = 0; k &lt; (n - i) * 2 - 1; k++) {
    str += &quot;*&quot;;
  }

  console.log(str);
}

// 정삼각형
for (let i = 1; i &lt; n; i++) {
  let str = &quot;&quot;;

  for (let j = 0; j &lt; n - i - 1; j++) {
    str += &quot; &quot;;
  }
  for (let k = 0; k &lt; i * 2 + 1; k++) {
    str += &quot;*&quot;;
  }

  console.log(str);
}</code></pre>
<pre><code>*********
 *******
  *****
   ***
    *
   ***
  *****
 *******
*********</code></pre><hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[create-react-app 대신 Vite! React 프로젝트 만들기 🚀]]></title>
            <link>https://velog.io/@jjyu_my/React-%EA%B0%9C%EB%B0%9C%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%84%B1Vite</link>
            <guid>https://velog.io/@jjyu_my/React-%EA%B0%9C%EB%B0%9C%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%84%B1Vite</guid>
            <pubDate>Thu, 20 Mar 2025 07:07:09 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>👩🏻‍💻 리엑트 공부하면서 vite로 프로젝트 생성법을 알게되었다.
기존에 많이 사용되던 create-react-app은 더 이상 권장되지 않으며, 대신 Vite를 이용해 더 빠르고 효율적으로 프로젝트를 생성할 수 있다.🚀</p>
</blockquote>
<hr>
<h3 id="1️⃣-프로젝트-폴더-생성--vite-설치">1️⃣ 프로젝트 폴더 생성 &amp; Vite 설치</h3>
<p>** 📂 프로젝트를 저장할 폴더를 만든 후, 터미널을 열고 아래 명령어를 입력**</p>
<pre><code>npm create vite@latest</code></pre><p><img src="https://velog.velcdn.com/images/jjyu_my/post/12266688-42ed-4193-8386-d23a98f7047c/image.png" alt=""></p>
<hr>
<h3 id="2️⃣-프로젝트-이름-입력--프레임워크-선택">2️⃣ 프로젝트 이름 입력 &amp; 프레임워크 선택</h3>
<p><strong>✅ 프로젝트 이름을 입력한 후 React를 선택</strong>
<img src="https://velog.velcdn.com/images/jjyu_my/post/79c6b8da-6a3f-480a-a51c-c4a397e9e978/image.png" alt=""></p>
<hr>
<h3 id="3️⃣-언어선택">3️⃣ 언어선택</h3>
<p><strong>✅ 원하는 옵션을 선택하여 언어 정하기</strong></p>
<p><img src="https://velog.velcdn.com/images/jjyu_my/post/9b0929bd-03df-48ce-a241-086ca963255e/image.png" alt=""></p>
<hr>
<h3 id="4️⃣-프로젝트-생성-완료--실행-준비">4️⃣ 프로젝트 생성 완료 &amp; 실행 준비</h3>
<p><strong>✅ 선택을 마치면 아래 화면처럼 설치가 진행</strong></p>
<p><img src="https://velog.velcdn.com/images/jjyu_my/post/fb44638c-5c11-47a4-9998-c5f9fe9a41fd/image.png" alt=""></p>
<p><strong>✅ 이제 프로젝트 폴더로 이동하고 npm install을 실행</strong></p>
<pre><code>cd 프로젝트이름
npm install</code></pre><p><img src="https://velog.velcdn.com/images/jjyu_my/post/a94c3d95-bb7c-4f71-b4d9-aa184054361b/image.png" alt=""></p>
<hr>
<h3 id="5️⃣-프로젝트-폴더-확인">5️⃣ 프로젝트 폴더 확인</h3>
<p><strong>📁 설치가 완료되면 폴더 안에 React 프로젝트가 생성된 걸 확인할 수 있다</strong></p>
<p><img src="https://velog.velcdn.com/images/jjyu_my/post/08d57f07-0ffe-4b72-80ec-70e0d73598f3/image.png" alt=""></p>
<hr>
<h3 id="6️⃣-프로젝트-실행">6️⃣ 프로젝트 실행</h3>
<p><strong>✅ 터미널을 열고 아래 명령어를 입력해 프로젝트를 실행</strong></p>
<pre><code>npm run dev</code></pre><p><img src="https://velog.velcdn.com/images/jjyu_my/post/d3d57b2a-7aea-45f1-bf49-158c37106dfa/image.png" alt=""></p>
<hr>
<h3 id="7️⃣-로컬-서버에서-확인-🌐">7️⃣ 로컬 서버에서 확인 🌐</h3>
<p><strong>✅ 실행 후 터미널에 표시된 Local 주소로 접속하면 React 프로젝트를 볼 수 있다</strong></p>
<p><img src="https://velog.velcdn.com/images/jjyu_my/post/19f764c9-a5a0-4530-80e4-30f395fd6220/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[JS_검색, 장바구니, 영수증 모달 구현 정리]]></title>
            <link>https://velog.io/@jjyu_my/%EA%B2%80%EC%83%89%EA%B8%B0%EB%8A%A5-%EB%93%9C%EB%9E%98%EA%B7%B8%EC%95%A4%EB%93%9C%EB%A1%AD-%EC%98%81%EC%88%98%EC%A6%9D%EB%AA%A8%EB%8B%AC-%EA%B8%B0%EB%8A%A5</link>
            <guid>https://velog.io/@jjyu_my/%EA%B2%80%EC%83%89%EA%B8%B0%EB%8A%A5-%EB%93%9C%EB%9E%98%EA%B7%B8%EC%95%A4%EB%93%9C%EB%A1%AD-%EC%98%81%EC%88%98%EC%A6%9D%EB%AA%A8%EB%8B%AC-%EA%B8%B0%EB%8A%A5</guid>
            <pubDate>Sun, 02 Mar 2025 09:11:36 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>👩🏻‍💻 테스트 삼아 진행한 미니 프로젝트, 진행하면서 어려웠던 부분을 정리해봤다!</p>
</blockquote>
<hr>
<h2 id="🔎-검색바--검색한-내용에-배경-컬러-입히기">🔎 검색바 &amp; 검색한 내용에 배경 컬러 입히기</h2>
<ul>
<li>검색바 구현인데 검색한 상품만 나오게 구현하였다 </li>
<li>단! 기존 방식과 다르게, 검색한 내용에 배경색을 추가해보았다</li>
</ul>
<h4 id="📌-html">📌 HTML</h4>
<pre><code class="language-html">&lt;!-- 상품 검색 --&gt;
&lt;div&gt;
  &lt;input type=&quot;text&quot; id=&quot;search&quot; placeholder=&quot;검색어 입력&quot; /&gt;
  &lt;button id=&quot;searchBtn&quot;&gt;검색&lt;/button&gt;
&lt;/div&gt;
</code></pre>
<h4 id="📌-javascript">📌 Javascript</h4>
<ul>
<li>검색기능까지는 손쉽게 구현하였지만 배경컬러 입히는 부분에서 살짝 시간을 잡아먹었다. </li>
<li>찾아보니 정규표현식을 이용한 검색어 하이라이트 적용방법이 있어서 이 방법을 적용하였다</li>
</ul>
<pre><code class="language-javascript">// 검색 기능
function searchProducts() {
  const searchText = document.querySelector(&quot;#search&quot;).value.toLowerCase().trim();
  const filteredProducts = allProducts.filter((item) =&gt; item.title.toLowerCase().includes(searchText));
  productList(filteredProducts); // 검색된 상품 리스트 보여주기

  // 검색된 텍스트에 배경 컬러 입히기
  if (searchText) {
    const productTitles = document.querySelectorAll(&quot;.card-title&quot;);
    productTitles.forEach((title) =&gt; {
      const originalText = title.textContent;
      const regex = new RegExp(`(${searchText})`, &quot;gi&quot;);
      title.innerHTML = originalText.replace(regex, `&lt;span style=&quot;background-color: yellow;&quot;&gt;$1&lt;/span&gt;`);
    });
  }
}
</code></pre>
<p><strong>💡 정규표현식을 이용한 검색어 하이라이트 적용_코드설명</strong></p>
<pre><code>1️⃣ new RegExp(\(${searchText})`, &quot;gi&quot;)

- 사용자가 입력한 searchText 를 포함하는 동적 정규표현식을 생성
- (${searchText}) : 검색어 부분을 그룹화 (괄호로 감싼 부분이 $1 로 참조됨)
- &quot;g&quot; : 전체 텍스트에서 모든 검색어 찾기 (전역 검색)
- &quot;i&quot; : 대소문자 구분 없이 찾기

2️⃣ originalText.replace(regex, \&lt;span style=&quot;background-color: yellow;&quot;&gt;$1&lt;/span&gt;`)

- originalText(상품 제목)에서 정규표현식(regex)에 매칭되는 부분을 &lt;span&gt; 태그로 감싸 배경 색을 입힘
$1 : 정규표현식에서 첫 번째 그룹(검색어 부분) 을 의미</code></pre><h4 id="🔍-결과--검색한-상품-제목에-하이라이트-배경색이-적용">🔍 결과 : 검색한 상품 제목에 하이라이트 배경색이 적용</h4>
<p><img src="https://velog.velcdn.com/images/jjyu_my/post/32de8dc9-f9d0-4a1e-9a94-64806098631f/image.png" alt=""></p>
<hr>
<h2 id="📦-상품을-장바구니에-담기-드래그-앤-드롭--버튼-클릭">📦 상품을 장바구니에 담기 (드래그 앤 드롭 + 버튼 클릭)</h2>
<h4 id="📌-html-1">📌 HTML</h4>
<pre><code class="language-html">&lt;!-- 상품 리스트 --&gt;
&lt;div id=&quot;product-list&quot; class=&quot;product-list product&quot;&gt;&lt;/div&gt;

&lt;!-- 장바구니 --&gt;
&lt;div class=&quot;cart-container&quot;&gt;
  &lt;div class=&quot;carttext&quot;&gt;장바구니(드래그 가능)&lt;/div&gt;
  &lt;div id=&quot;cart1&quot; class=&quot;cart&quot; ondrop=&quot;drop(event)&quot; ondragover=&quot;allowDrop(event)&quot;&gt;
    &lt;p&gt;여기로 드래그 해주세요&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;total&quot;&gt;
    &lt;p&gt;최종가격&lt;/p&gt;
    &lt;div class=&quot;totalprice&quot;&gt;합계 : 0&lt;/div&gt;
    &lt;button class=&quot;totalBtn&quot;&gt;구매하기&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;</code></pre>
<h4 id="📌-javascript-1">📌 Javascript</h4>
<ul>
<li>제일 오래 걸린 부분이었다.. 😅 드래그하여 상품을 끌어오기는 처음 접해보았다... 배울 게 아직 많구나? 🤔</li>
</ul>
<pre><code class="language-js">/**
 * ✅ 드래그 앤 드롭 으로 장바구니에 상품 추가
 * ✅ 상품 담기 버튼 클릭 시 장바구니에 상품 추가
 * ✅ 장바구니에 추가된 상품 수량 보이기
 */

// 장바구니 컨테이터 선택
const cartContainer = document.querySelector(&quot;#cart1&quot;);
let cartItems = {}; // 장바구니에 담긴 상품들을 저장할 객체

// 📌 상품 드래그 앤 드롭 관련 함수
function allowDrop(event) {
  event.preventDefault(); // 드롭 이벤트 허용
}

function drag(event) {
  // 드래그한 상품의 이름을 데이터로 저장
  event.dataTransfer.setData(
    &quot;text&quot;,
    event.target.querySelector(&quot;.card-title&quot;).textContent
  );
}

function drop(event) {
  event.preventDefault(); // 드롭 이벤트 허용
  const productName = event.dataTransfer.getData(&quot;text&quot;); // 드래그한 상품 이름 가져오기
  addToCart(productName); // 장바구니에 상품 추가
}

// 📌 담기 버튼 클릭 시 상품 추가
const productContainer = document.querySelector(&quot;#product-list&quot;); // 상품 목록 컨테이너 선택
productContainer.addEventListener(&quot;click&quot;, function (event) {
  if (event.target.classList.contains(&quot;btn-primary&quot;)) {
    const productName = event.target
      .closest(&quot;.card&quot;)
      .querySelector(&quot;.card-title&quot;).textContent;
    addToCart(productName);
  }
});

// 📌 장바구니에 상품 추가하는 함수
function addToCart(productName) {
  // 상품 이름을 받아와서 장바구니에 추가
  const product = allProducts.find((item) =&gt; item.title === productName); // 상품 목록에서 상품 찾기
  if (!product) return; // 상품이 없으면 함수 종료

  // 이미 장바구니에 담긴 상품이면 수량만 증가
  if (cartItems[productName]) {
    cartItems[productName].quantity += 1;
  } else {
    // 장바구니에 없는 상품이면 수량을 1로 해서 추가
    cartItems[productName] = { ...product, quantity: 1 };
  }
  updateCartUI(); // 장바구니 UI 업데이트
}

// 📌 장바구니 UI 업데이트 + 합계 가격 업데이트
function updateCartUI() {
  cartContainer.innerHTML = &quot;&quot;; // 기존 장바구니 내용 비우기
  let totalPrice = 0; // 총 가격을 저장할 변수

  Object.values(cartItems).forEach((item) =&gt; {
    const cartCard = document.createElement(&quot;div&quot;);
    cartCard.classList.add(&quot;cart-card&quot;);
    cartCard.innerHTML = `
    &lt;div class=&quot;card&quot; style=&quot;width: 18rem; padding: 20px; margin: 10px;&quot;&gt;
      &lt;img src=&quot;../img/${item.photo}&quot; class=&quot;card-img-top&quot;&gt;
      &lt;div class=&quot;card-body&quot;&gt;
        &lt;h5 class=&quot;card-title&quot;&gt;${item.title}&lt;/h5&gt;
        &lt;p class=&quot;card-text&quot;&gt;${item.brand}&lt;/p&gt;
        &lt;p class=&quot;card-text&quot;&gt;${item.price}원&lt;/p&gt;
        &lt;input type=&quot;number&quot; class=&quot;cart-quantity&quot; value=&quot;${item.quantity}&quot; min=&quot;1&quot; data-title=&quot;${item.title}&quot;&gt;
      &lt;/div&gt;
    &lt;/div&gt;ㅎ
  `;
    cartContainer.appendChild(cartCard);

    // 📌 상품 가격 * 수량을 누적하여 총 가격 계산
    totalPrice += item.price * item.quantity;
  });
  // 📌 총 가격 업데이트
  document.querySelector(&quot;.totalprice&quot;).innerText = `합계 : ${totalPrice}원`;
}
</code></pre>
<h4 id="🔍-결과--상품을-드래그하거나-담기-버튼을-클릭하면-장바구니에-추가되고-가격이-자동으로-업데이트">🔍 결과 : 상품을 드래그하거나 담기 버튼을 클릭하면 장바구니에 추가되고, 가격이 자동으로 업데이트</h4>
<p><img src="https://velog.velcdn.com/images/jjyu_my/post/60df2da6-5104-42f5-b6eb-04a01173cc80/image.png" alt=""></p>
<ul>
<li>상품 수량 부분에 커서를 놓고 delete key 를 누르면 상품이 삭제됨! ❌</li>
</ul>
<hr>
<h2 id="🧾-영수증-모달-만들기">🧾 영수증 모달 만들기</h2>
<ul>
<li>canvas 태그를 처음 알았다...ㅎㅎ 부끄럽다아..ㅎㅎㅎ</li>
<li>canvas 태그를 사용하여 간단하게 영수증 을 만들어보았다ㅎㅎ</li>
</ul>
<h4 id="📌-html-2">📌 HTML</h4>
<pre><code class="language-html">&lt;!-- 구매하기 모달 --&gt;
&lt;div class=&quot;modal1&quot;&gt;
  &lt;div class=&quot;white-bg&quot;&gt;
    &lt;form&gt;
      &lt;div class=&quot;my-3&quot;&gt;성함 &lt;input type=&quot;text&quot; class=&quot;form-control&quot; id=&quot;name&quot; placeholder=&quot;성함을 입력하세요&quot; /&gt;&lt;/div&gt;
      &lt;div class=&quot;my-3&quot;&gt;연락처 &lt;input type=&quot;tel&quot; class=&quot;form-control&quot; id=&quot;phone&quot; placeholder=&quot;연락처를 입력하세요&quot; /&gt;&lt;/div&gt;
      &lt;button type=&quot;submit&quot; class=&quot;btn btn-primary&quot;&gt;입력완료&lt;/button&gt;
      &lt;button type=&quot;button&quot; class=&quot;btn btn-danger&quot; id=&quot;close&quot;&gt;닫기&lt;/button&gt;
    &lt;/form&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;!-- 영수증 모달 --&gt;
&lt;div class=&quot;modal2&quot;&gt;
  &lt;div class=&quot;white-bg&quot;&gt;
    &lt;h4&gt;영수증&lt;/h4&gt;
    &lt;canvas id=&quot;canvas&quot; width=&quot;350&quot; height=&quot;350&quot;&gt;&lt;/canvas&gt;
    &lt;div&gt;&lt;button id=&quot;close&quot;&gt;닫기&lt;/button&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;
</code></pre>
<h4 id="📌-javascript-2">📌 Javascript</h4>
<pre><code class="language-js">// 영수증 그리기
function drawReceipt(name, phone) {
  const canvas = document.getElementById(&quot;canvas&quot;);
  const ctx = canvas.getContext(&quot;2d&quot;);

  ctx.clearRect(0, 0, canvas.width, canvas.height); // 캔버스 초기화
  ctx.fillStyle = &quot;#f0f0f0&quot;;
  ctx.fillRect(0, 0, canvas.width, canvas.height);

  ctx.fillStyle = &quot;#000&quot;;
  ctx.font = &quot;20px Arial&quot;;
  ctx.textAlign = &quot;left&quot;;
  const currentDate = new Date().toLocaleString();
  ctx.fillText(`날짜: ${currentDate}`, 20, 30);
  ctx.fillText(`성함: ${name}`, 20, 60);
  ctx.fillText(`연락처: ${phone}`, 20, 90);
}
</code></pre>
<h4 id="🔍-결과--사용자가-입력한-성함과-연락처가-포함된-영수증을-캔버스에-그려서-출력할-수-있다">🔍 결과 : 사용자가 입력한 성함과 연락처가 포함된 영수증을 캔버스에 그려서 출력할 수 있다</h4>
<p><img src="https://velog.velcdn.com/images/jjyu_my/post/83843759-1b54-4bed-90c8-33b49a624735/image.png" alt=""></p>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[Git 브랜치 & 협업 정리 🛠️]]></title>
            <link>https://velog.io/@jjyu_my/%EA%B9%83-%EB%A8%B8%EC%A7%80</link>
            <guid>https://velog.io/@jjyu_my/%EA%B9%83-%EB%A8%B8%EC%A7%80</guid>
            <pubDate>Sun, 16 Feb 2025 02:55:02 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>👩🏻‍💻 지금까지는 혼자 또는 소규모 프로젝트를 진행해서 기본적인 commit, push만 사용해도 충분했다. 하지만 회사에서 협업을 하게 되면 여러 사람이 동시에 작업하게 되고, 무분별한 커밋과 푸시는 큰 문제가 될 수 있다. 그래서 커밋 개념을 다시 한번 훑어보고 정리해 보았다!</p>
</blockquote>
<hr>
<h3 id="🌿-브랜치-생성-및-전환">🌿 브랜치 생성 및 전환</h3>
<p> 브랜치를 사용하면 메인 코드에 영향을 주지 않고 독립적인 작업이 가능하다</p>
<p>🔹 <strong>브랜치 생성:</strong> git branch 브랜치명
🔹 <strong>브랜치 전환:</strong> git switch 브랜치명
🔹 <strong>현재 브랜치 상태 확인:</strong> git status
🔹 <strong>메인 브랜치로 돌아가기:</strong> git switch main</p>
<hr>
<h3 id="🔀-브랜치-병합-merge">🔀 브랜치 병합 (Merge)</h3>
<p>기능 개발이 끝나면 브랜치를 메인 브랜치에 병합해야한다</p>
<p>1️⃣ <strong>메인 브랜치로 이동:</strong> git switch main
2️⃣ <strong>브랜치 병합:</strong> git merge 브랜치명</p>
<h4 id="⚠️-충돌-발생-시">⚠️ 충돌 발생 시</h4>
<p>✔️ 원하는 코드만 남기고 수정
✔️ git add . 후 git commit</p>
<h4 id="🗑-작업이-끝난-브랜치-삭제">🗑 작업이 끝난 브랜치 삭제</h4>
<p>✔️ <strong>병합된 브랜치 삭제</strong>: git branch -d 브랜치명
✔️** 병합되지 않은 브랜치 강제 삭제:** git branch -D 브랜치명</p>
<hr>
<h3 id="🔄-rebase-리베이스">🔄 Rebase (리베이스)</h3>
<p>Rebase는 브랜치의 시작점을 메인 브랜치의 최신 커밋으로 옮겨서 깔끔한 히스토리를 유지하는 방법</p>
<p><img src="https://velog.velcdn.com/images/jjyu_my/post/e28ecc75-33a3-4e3b-b094-063016aad719/image.png" alt=""></p>
<p>1️⃣ <strong>작업 브랜치로 이동:</strong> git switch 브랜치명
2️⃣ <strong>최신 커밋으로 브랜치 이동:</strong> git rebase main
3️⃣ <strong>메인 브랜치로 이동:</strong> git switch main
4️⃣ <strong>병합 수행:</strong> git merge 브랜치명</p>
<p>*<em>⚠️ Rebase 중 충돌 발생 시 하나씩 해결해야 하므로 브랜치 차이가 많을 경우 주의!
*</em></p>
<hr>
<h3 id="📌-squash-and-merge">📌 Squash and Merge</h3>
<p>여러 개의 커밋을 하나로 합쳐서 메인 브랜치에 병합할 때 사용</p>
<p><img src="https://velog.velcdn.com/images/jjyu_my/post/b30184e2-eaeb-4bac-95b3-d18258a36c95/image.png" alt=""></p>
<p>1️⃣ <strong>메인 브랜치로 이동:</strong> git switch main
2️⃣ <strong>커밋을 하나로 합침:</strong> git merge --squash 브랜치명
3️⃣ <strong>하나의 커밋으로 저장:</strong> git commit -m &quot;브랜치 합침&quot;</p>
<hr>
<h3 id="🔙-커밋-되돌리기">🔙 커밋 되돌리기</h3>
<p>✔️ <strong>특정 파일 복구:</strong> git revert 파일명
✔️ <strong>특정 커밋 취소:</strong> git reset 커밋아이디
✔️ <strong>최근 커밋 취소:</strong> git revert HEAD
✔️ <strong>개별 파일 변경 취소:</strong> git restore 파일명</p>
<hr>
<h3 id="☁️-원격-저장소에-브랜치-올리기">☁️ 원격 저장소에 브랜치 올리기</h3>
<p>팀원과 공유하기 위해 로컬 브랜치를 원격 저장소로 올릴 수 있다</p>
<h4 id="1️⃣-브랜치-생성-및-작업">1️⃣ 브랜치 생성 및 작업</h4>
<pre><code class="language-bash">git branch 브랜치명  
git switch 브랜치명  
git add .  
git commit -m &quot;커밋 메시지&quot;
</code></pre>
<h4 id="2️⃣-원격-저장소에-브랜치-업로드">2️⃣ 원격 저장소에 브랜치 업로드</h4>
<pre><code class="language-bash">git push origin 브랜치명</code></pre>
<hr>
<h3 id="📩-pull-request-pr">📩 Pull Request (PR)</h3>
<p>팀원들과 코드 리뷰를 진행한 후 병합하기 위해 PR을 생성</p>
<h4 id="1️⃣-github에서-pull-request-생성">1️⃣ **GitHub에서 Pull Request 생성</h4>
<ul>
<li>팀원들이 코드 리뷰 후 병합 가능</li>
</ul>
<h4 id="2️⃣-merge-방법-선택">2️⃣ <strong>Merge 방법 선택</strong></h4>
<p>** 📝 Create a merge commit: 모든 커밋 기록 유지**</p>
<ul>
<li>새로운 merge commit을 하나 생성해주는 3-way merge를 실행</li>
<li>main 브랜치 조회시 합쳐진 브랜치의 commit 내역도 전부 나옴</li>
<li>단점 : commit 내역이 많으면 복잡하고 더러워 보일수 있다
<img src="https://velog.velcdn.com/images/jjyu_my/post/27aeb0e5-80a7-465e-9c3a-48e4c4f48b4e/image.png" alt=""></li>
</ul>
<p><strong>🔄 Rebase and merge: 브랜치를 최신 상태로 맞춘 후 병합</strong></p>
<ul>
<li>squash and merge와 비슷한데 합쳐질 브랜치의 commit 내역이 전부 보존
<img src="https://velog.velcdn.com/images/jjyu_my/post/e28ecc75-33a3-4e3b-b094-063016aad719/image.png" alt=""></li>
</ul>
<p><strong>📦 Squash and merge: 여러 커밋을 하나로 합쳐 병합 (히스토리 단순화)</strong></p>
<ul>
<li>합쳐질 브랜치의 commit 내역을 하나로 합쳐서 main 브랜치에 신규 commit을 생성</li>
<li>깔끔함
<img src="https://velog.velcdn.com/images/jjyu_my/post/b30184e2-eaeb-4bac-95b3-d18258a36c95/image.png" alt=""></li>
</ul>
<hr>
<h3 id="💡-추가로-알아두면-좋은것">💡 추가로 알아두면 좋은것!!!!</h3>
<h4 id="🔄-git-stash-임시-저장">🔄 Git Stash (임시 저장)</h4>
<p>작업 도중에 변경한 파일을 임시로 저장하고, 다른 작업을 해야 할 때 유용
즉!! 임시보관장소 라고 생각하면 쉽다</p>
<p><strong>🔹 변경 사항 임시 저장:</strong></p>
<ul>
<li>변경된 모든 파일을 임시로 저장<pre><code>git stash</code></pre></li>
</ul>
<p><strong>🔹 변경 사항 임시 저장 시 메모 남기고싶으면? :</strong></p>
<pre><code>git stash save &#39;어쩌구저쩌구~&#39;</code></pre><p><strong>🔹 저장된 변경 사항 확인: git stash 는 여러번 할수있다</strong></p>
<ul>
<li>현재 stash 되어있는 코드 목록을 전부 출력해주는명령어<pre><code>git stash list</code></pre></li>
</ul>
<p><strong>🔹 보관했던 코드 다시 불러오기</strong> </p>
<ul>
<li>git stash 했던 코드가 여러개 있으면 가장 최근에 보관했던 코드부터 먼저 불러온다<pre><code>git stash pop</code></pre></li>
<li><em>🔹 stash 삭제*</em></li>
<li>특정스태시 삭제</li>
<li>삭제할id 는 git stash list하면 0,1,2 식으로 숫자가 보임!! <pre><code>git stash drop 삭제할id</code></pre></li>
<li>전체 스태시 삭제<pre><code>git stash clear</code></pre><blockquote>
<p>👩🏻‍💻 git stash는 주석처리나 브랜치 만들어서 따로 보관하는게 더 효율적이긴하다..ㅎㅎ^^그래도 알아두면 좋으니까<del>~</del></p>
</blockquote>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[기본개념_이벤트버블링 과 이벤트 위임🫧]]></title>
            <link>https://velog.io/@jjyu_my/%EA%B8%B0%EB%B3%B8%EA%B0%9C%EB%85%90%EC%9D%B4%EB%B2%A4%ED%8A%B8%EB%B2%84%EB%B8%94%EB%A7%81-%EA%B3%BC-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EC%9C%84%EC%9E%84</link>
            <guid>https://velog.io/@jjyu_my/%EA%B8%B0%EB%B3%B8%EA%B0%9C%EB%85%90%EC%9D%B4%EB%B2%A4%ED%8A%B8%EB%B2%84%EB%B8%94%EB%A7%81-%EA%B3%BC-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EC%9C%84%EC%9E%84</guid>
            <pubDate>Fri, 14 Feb 2025 09:07:43 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>👩🏻‍💻 프로젝트 하면서 자꾸 의도한대로 동작이 되지않길래 찾아보니 이벤트 버블링현상..
간단한걸 까먹고 원인이 뭐지?? 하면서 다른곳에서 찾고있었다....ㅎ 어이없는 실수!!!ㅠㅠㅠ</p>
</blockquote>
<hr>
<h3 id="🎈-이벤트-버블링">🎈 이벤트 버블링</h3>
<p>이벤트는 자식에서 발생해서 부모를 거쳐 조상으로 전파</p>
<pre><code>.child 클릭 → &quot;자식 클릭!&quot; → &quot;부모 클릭!&quot; 출력</code></pre><blockquote>
<p><strong>🚨이벤트 버블링 주의!!!</strong></p>
</blockquote>
<ul>
<li>버블링으로 인해 부모나 조상에게까지 이벤트가 전달되기 때문에, 의도한 동작 외에도 다른 동작이 일어나면서 에러가 발생할 수 있다. 이런 문제는 <strong>이벤트 위임</strong>을 사용하여 해결할 수 있다</li>
</ul>
<hr>
<h3 id="🚀-이벤트-위임-event-delegation">🚀 이벤트 위임 (Event Delegation)</h3>
<p>부모 요소에 이벤트를 등록하고, 그 이벤트가 실제로 클릭된 자식 요소를 e.target으로 확인</p>
<ul>
<li>동적으로 추가된 요소도 이벤트를 처리할 수 있다</li>
</ul>
<pre><code class="language-javascript">✅ EX) 
document.querySelector(&quot;.parent&quot;).addEventListener(&quot;click&quot;, function (e) {
  if (e.target.matches(&quot;.child&quot;)) { // 클릭된 요소가 .child인지 확인
    console.log(&quot;자식 버튼 클릭됨!&quot;);
  }
});
</code></pre>
<blockquote>
<p>** 💡 왜 유용한가?**
<strong>성능 향상:</strong> 부모에 한 번만 이벤트를 등록하면, 여러 자식 요소에 개별적으로 이벤트를 달 필요 없이 효율적으로 처리할 수 있다
<strong>동적 요소 처리:</strong> 페이지가 동적으로 변경되더라도, 추가된 자식 요소들도 자동으로 이벤트를 처리할수 있다</p>
</blockquote>
<hr>
<h3 id="🎯-this-vs-etarget-vs-ecurrenttarget">🎯 this vs e.target vs e.currentTarget</h3>
<table>
<thead>
<tr>
<th>개념</th>
<th>의미</th>
<th>예시</th>
</tr>
</thead>
<tbody><tr>
<td><strong>this</strong></td>
<td>이벤트가 걸린 요소</td>
<td><code>.parent</code>에 이벤트 걸리면 <code>.parent</code></td>
</tr>
<tr>
<td><strong>e.target</strong></td>
<td>실제 클릭된 요소</td>
<td><code>.child</code>를 클릭하면 <code>.child</code></td>
</tr>
<tr>
<td><strong>e.currentTarget</strong></td>
<td>이벤트가 걸린 요소 (this와 동일)</td>
<td><code>.parent</code> (this랑 같음)</td>
</tr>
</tbody></table>
<hr>
<h3 id="🔥-정리">🔥 정리</h3>
<p> 이벤트 버블링: 자식 → 부모 → 조상으로 전파됨
this / e.currentTarget: 이벤트가 걸린 부모 요소
e.target: 실제 클릭된 요소
이벤트 위임: 부모에 이벤트 걸고 e.target.matches()로 자식 확인</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[🎨 탭 기능 구현하기 (하드코드 vs 반복문)]]></title>
            <link>https://velog.io/@jjyu_my/%ED%83%AD-%EA%B8%B0%EB%8A%A5-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0-%ED%95%98%EB%93%9C%EC%BD%94%EB%93%9C-vs-%EB%B0%98%EB%B3%B5%EB%AC%B8</link>
            <guid>https://velog.io/@jjyu_my/%ED%83%AD-%EA%B8%B0%EB%8A%A5-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0-%ED%95%98%EB%93%9C%EC%BD%94%EB%93%9C-vs-%EB%B0%98%EB%B3%B5%EB%AC%B8</guid>
            <pubDate>Mon, 10 Feb 2025 10:53:51 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>👩🏻‍💻 간단한 탭 기능을 하드코드 방식과 반복문을 활용한 방식으로 구현하여 비교해보았다</p>
</blockquote>
<hr>
<h3 id="🏗️--html-코드">🏗️  HTML 코드</h3>
<pre><code class="language-html">
    &lt;div class=&quot;container mt-5&quot;&gt;
      &lt;ul class=&quot;list&quot;&gt;
        &lt;li class=&quot;tab-button&quot;&gt;Products&lt;/li&gt;
        &lt;li class=&quot;tab-button orange&quot;&gt;Information&lt;/li&gt;
        &lt;li class=&quot;tab-button&quot;&gt;Shipping&lt;/li&gt;
      &lt;/ul&gt;
      &lt;div class=&quot;tab-content&quot;&gt;
        &lt;p&gt;상품설명입니다. Product&lt;/p&gt;
      &lt;/div&gt;
      &lt;div class=&quot;tab-content show&quot;&gt;
        &lt;p&gt;스펙설명입니다. Information&lt;/p&gt;
      &lt;/div&gt;
      &lt;div class=&quot;tab-content&quot;&gt;
        &lt;p&gt;배송정보입니다. Shipping&lt;/p&gt;
      &lt;/div&gt;
    &lt;/div&gt; 

</code></pre>
<p><strong>📌 설명</strong>
✅ 3개의 탭화면 코드를 만들어준다
✅ 각 탭을 클릭하면 해당 내용이 보여진다</p>
<hr>
<h3 id="✍️-하드코드-방식-비효율적인-코드-😵">✍️ 하드코드 방식 (비효율적인 코드 😵)</h3>
<pre><code class="language-javascript">// 각각의 탭에 변수정의
const buttons = document.querySelectorAll(&quot;.tab-button&quot;); // 모든 탭 버튼을 선택
const productsButton = buttons[0]; // 첫 번째 탭 버튼 (제품)
const informationButton = buttons[1]; // 두 번째 탭 버튼 (정보)
const shippingButton = buttons[2]; // 세 번째 탭 버튼 (배송)
const contents = document.querySelectorAll(&quot;.tab-content&quot;); // 모든 탭 내용을 선택
const productsContent = contents[0]; // 첫 번째 탭 내용 (제품)
const informationContent = contents[1]; // 두 번째 탭 내용 (정보)
const shippingContent = contents[2]; // 세 번째 탭 내용 (배송)

// 버튼 1, 2, 3에 이벤트리스너 부착
productsButton.addEventListener(&quot;click&quot;, productsHandle); // 첫 번째 버튼 클릭 시 productsHandle 함수 실행
informationButton.addEventListener(&quot;click&quot;, informationHandle); // 두 번째 버튼 클릭 시 informationHandle 함수 실행
shippingButton.addEventListener(&quot;click&quot;, shippingHandle); // 세 번째 버튼 클릭 시 shippingHandle 함수 실행

// 버튼을 누르면 해당 탭으로 이동되는 각 함수 실행
function productsHandle() {
  // 다른 버튼에서 &#39;orange&#39; 클래스를 제거하고, 첫 번째 버튼에 추가
  informationButton.classList.remove(&quot;orange&quot;);
  shippingButton.classList.remove(&quot;orange&quot;);
  productsButton.classList.add(&quot;orange&quot;);

  // 다른 탭 내용을 숨기고, 첫 번째 탭 내용을 표시
  informationContent.classList.remove(&quot;show&quot;);
  shippingContent.classList.remove(&quot;show&quot;);
  productsContent.classList.add(&quot;show&quot;);
}

function informationHandle() {
  // 다른 버튼에서 &#39;orange&#39; 클래스를 제거하고, 두 번째 버튼에 추가
  productsButton.classList.remove(&quot;orange&quot;);
  shippingButton.classList.remove(&quot;orange&quot;);
  informationButton.classList.add(&quot;orange&quot;);

  // 다른 탭 내용을 숨기고, 두 번째 탭 내용을 표시
  productsContent.classList.remove(&quot;show&quot;);
  shippingContent.classList.remove(&quot;show&quot;);
  informationContent.classList.add(&quot;show&quot;);
}

function shippingHandle() {
  // 다른 버튼에서 &#39;orange&#39; 클래스를 제거하고, 세 번째 버튼에 추가
  productsButton.classList.remove(&quot;orange&quot;);
  informationButton.classList.remove(&quot;orange&quot;);
  shippingButton.classList.add(&quot;orange&quot;);

  // 다른 탭 내용을 숨기고, 세 번째 탭 내용을 표시
  productsContent.classList.remove(&quot;show&quot;);
  informationContent.classList.remove(&quot;show&quot;);
  shippingContent.classList.add(&quot;show&quot;);
}
</code></pre>
<hr>
<h3 id="🏆-반복문을-사용한-코드-깔끔한-코드-✨">🏆 반복문을 사용한 코드 (깔끔한 코드 ✨)</h3>
<pre><code class="language-javascript">// 각각의 탭에 변수정의
const buttons = document.querySelectorAll(&quot;.tab-button&quot;);
const contents = document.querySelectorAll(&quot;.tab-content&quot;);

// 모든 버튼에 클릭 이벤트리스너 부착
buttons.forEach((button, index) =&gt; {
  button.addEventListener(&quot;click&quot;, () =&gt; handleTab(index));
});

function handleTab(index) {
  // 모든 버튼에서 &#39;orange&#39; 클래스 제거하고 클릭한 버튼에 추가
  buttons.forEach((button) =&gt; button.classList.remove(&quot;orange&quot;));
  buttons[index].classList.add(&quot;orange&quot;);

  // 모든 탭 내용을 숨기고 클릭한 탭 내용만 표시
  contents.forEach((content) =&gt; content.classList.remove(&quot;show&quot;));
  contents[index].classList.add(&quot;show&quot;);
}
</code></pre>
<hr>
<h3 id="🎨-구현-화면">🎨 구현 화면</h3>
<p><strong>📌 초기 화면</strong>
<img src="https://velog.velcdn.com/images/jjyu_my/post/5e5a7919-d3c1-4c38-8dc7-b38dbedda072/image.png" alt="">
<strong>📌 탭 클릭 시 변경된 화면</strong>
<img src="https://velog.velcdn.com/images/jjyu_my/post/1f4c5ef0-2607-4024-9573-6f1f02e01c79/image.png" alt=""></p>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[🕰️ 시간 기반 커밋 꾸미기]]></title>
            <link>https://velog.io/@jjyu_my/%EA%B9%83%ED%97%88%EB%B8%8C-%EC%8B%9C%EA%B0%84-%EC%BB%A4%EB%B0%8B-%EA%BE%B8%EB%AF%B8%EA%B8%B0</link>
            <guid>https://velog.io/@jjyu_my/%EA%B9%83%ED%97%88%EB%B8%8C-%EC%8B%9C%EA%B0%84-%EC%BB%A4%EB%B0%8B-%EA%BE%B8%EB%AF%B8%EA%B8%B0</guid>
            <pubDate>Thu, 06 Feb 2025 03:15:42 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>👩🏻‍💻 개발자라면 개인 깃허브는 필수! 기본적인 모습도 좋지만, 취향에 맞게 꾸미면 볼 때마다 뿌듯하고 기분이 좋아진다고!!! 그래서 꾸며본 깃허브😛</p>
</blockquote>
<h3 id="1️⃣-repository-포크하기-🔗">1️⃣ Repository 포크하기 🔗</h3>
<p>먼저 아래의 레포지토리를 포크합니다.
👉 <a href="https://github.com/maxam2017/productive-box">Productive-Box Repository</a></p>
<hr>
<h3 id="2️⃣-포크한-레포지토리에서-scheduleyml-수정하기-✏️">2️⃣ 포크한 레포지토리에서 schedule.yml 수정하기 ✏️</h3>
<p>포크한 레포지토리로 이동한 후 <code>.github/workflows/schedule.yml</code> 파일을 찾아 수정합니다
📌 위치: <code>.github/workflows/schedule.yml</code></p>
<ul>
<li>GitHub ID 값을 내 것으로 변경</li>
<li>Time Zone 설정 확인 (기본 UTC → 한국 시간 Asia/Seoul 권장)</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jjyu_my/post/d2cf693a-58dc-4d7b-ac27-0ec2a6436600/image.png" alt=""></p>
<hr>
<h3 id="3️⃣-새로운-public-gist-생성하기-📜">3️⃣ 새로운 public gist 생성하기 📜</h3>
<ol>
<li>GitHub 우측 상단 프로필 옆 + 아이콘 클릭</li>
<li>New gist 선택</li>
<li>gist의 이름과 내용은 아무거나 입력 (이름 생략 가능)</li>
<li>Create Public gist 클릭하여 저장</li>
</ol>
<p><img src="https://velog.velcdn.com/images/jjyu_my/post/47b31c66-3293-452d-9321-bba3e782c3a9/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/jjyu_my/post/8b37835c-45fe-472b-a248-fefb36bc0ebe/image.png" alt=""></p>
<p>✅ 생성된 gist의 URL 끝 부분 (username 뒤에 오는 숫자) 을 복사하여 메모장에 저장</p>
<p><img src="https://velog.velcdn.com/images/jjyu_my/post/d7263c56-fff0-40a8-a09f-f2c0faf4969b/image.png" alt=""></p>
<hr>
<h3 id="4️⃣-personal-access-token-발급하기-🔑">4️⃣ Personal Access Token 발급하기 🔑</h3>
<ol>
<li>GitHub Settings → Developer settings → Personal access tokens → Tokens(classic) 이동
<img src="https://velog.velcdn.com/images/jjyu_my/post/d2396606-3f51-4aa4-bd92-cce9ba678dd1/image.png" alt=""></li>
<li>Create new token 클릭 → Create new token (classic) 선택
<img src="https://velog.velcdn.com/images/jjyu_my/post/51547405-fba0-4971-bc64-37723907b2c8/image.png" alt=""></li>
<li>Note: GH_TOKEN 입력</li>
<li>✅ repo, gist 권한 체크 후 생성</li>
</ol>
<p>⚠️  생성된 토큰 값은 다시 볼 수 없으므로 메모장에 저장!</p>
<hr>
<h3 id="5️⃣-github-secrets-설정하기-🔒">5️⃣ GitHub Secrets 설정하기 🔒</h3>
<p>포크 해온 나의 레파지스토리 productive-box 설정 진입</p>
<ol>
<li>Repository의 Settings → Secrets and variables → Actions → New repository secret 클릭</li>
</ol>
<p><img src="https://velog.velcdn.com/images/jjyu_my/post/cbfb37cc-8f04-45f6-92b7-56df31385eae/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/jjyu_my/post/51ffef6d-c3c1-4d08-ba03-0810f4569891/image.png" alt=""></p>
<ol start="2">
<li>아래 값 추가</li>
</ol>
<ul>
<li><p>Name: GH_TOKEN / Secret: 발급받은 Personal Access Token 값</p>
</li>
<li><p>Name: GIST_ID / Secret: 생성한 gist의 ID 값</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jjyu_my/post/22265d75-e830-42ff-b810-254e15a13c7c/image.png" alt=""></p>
<p>⚠️ 환경 변수 이름이 틀리면 안 됩니다! 반드시 <code>GIST_ID</code>, <code>GH_TOKEN</code> 으로 입력</p>
<hr>
<h3 id="6️⃣-actions-활성화하기-✅">6️⃣ Actions 활성화하기 ✅</h3>
<p>포크한 레파지스토리의 Actions 탭에서 활성화 필요!
<img src="https://velog.velcdn.com/images/jjyu_my/post/cbfb37cc-8f04-45f6-92b7-56df31385eae/image.png" alt=""></p>
<p>1.초록색 버튼 <code>I understand my workflows, go ahead and enable them</code>클릭</p>
<ol start="2">
<li>Update gist에서 Enable workflow를 클릭하여 활성화 시켜주기</li>
</ol>
<hr>
<h3 id="7️⃣-scheduleyml-코드-수정하기-🛠">7️⃣ schedule.yml 코드 수정하기 🛠</h3>
<p>** 🚨 아이디 값이 정확히 들어가야 하고, 시간대 설정 실수 주의!**</p>
<p>포크 해 온 productive-box→ .github → workflows → schedule.yml 코드확인!!</p>
<ul>
<li>아이디값 과 지역존 바꾸기</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jjyu_my/post/d2cf693a-58dc-4d7b-ac27-0ec2a6436600/image.png" alt=""></p>
<hr>
<h3 id="8️⃣-productive-box의-readmemd-수정-✍️">8️⃣ productive-box의 README.md 수정 ✍️</h3>
<p>업데이트가 정상적으로 동작하는지 확인하기 위해 README.md 파일을 수정하고 커밋합니다.</p>
<ul>
<li>공백 추가/삭제, 한 글자 수정 등 아무거나 수정 후 커밋</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jjyu_my/post/d412a027-c3b0-4602-9fc1-9282072c00a7/image.png" alt=""></p>
<p>🔄 이후, 깃 뱃지는 정각마다 자동 업데이트 됩니다.</p>
<hr>
<h3 id="9️⃣-github-profile에-pin-고정-📌">9️⃣ GitHub Profile에 Pin 고정 📌</h3>
<ol>
<li><p>내 GitHub 프로필로 이동</p>
</li>
<li><p>Customize your pins 클릭
<img src="https://velog.velcdn.com/images/jjyu_my/post/bc259177-14cc-4a23-b7cd-981fd728741e/image.png" alt=""></p>
</li>
<li><p>생성한 Gist 선택 후 Save Pins
<img src="https://velog.velcdn.com/images/jjyu_my/post/b7fb6a5f-31d5-45e4-8798-3487cf3ee6ca/image.png" alt=""></p>
</li>
<li><p>깃 꾸미기 완숑 🚀
<img src="https://velog.velcdn.com/images/jjyu_my/post/017f59dd-7aea-437c-84e1-fa6f61d00260/image.png" alt="">
<img src="https://velog.velcdn.com/images/jjyu_my/post/e46485ae-3758-4af4-acbd-f60dad775c8e/image.png" alt=""></p>
</li>
</ol>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[JS_includes() 정리]]></title>
            <link>https://velog.io/@jjyu_my/JSincludes-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@jjyu_my/JSincludes-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Thu, 06 Feb 2025 02:27:32 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>👩🏻‍💻 indexOf() 만 알고있다가 .includes()를 새로 알게되었다...
나만 지금 알게된거냐구...ㅎㅎㅎ 알면 알수록 새로운거 투성이다!!!</p>
</blockquote>
<hr>
<h3 id="1️⃣-배열에서-includes">1️⃣ 배열에서 .includes()</h3>
<p><strong>✔ 배열에 특정 요소가 있는지 확인할 때 사용</strong></p>
<pre><code class="language-javascript">const fruits = [&quot;사과&quot;, &quot;바나나&quot;, &quot;포도&quot;];

console.log(fruits.includes(&quot;바나나&quot;)); // true
console.log(fruits.includes(&quot;복숭아&quot;)); // false
</code></pre>
<p>✅ 대소문자를 구분하지 않는다
✅ true 또는 false를 반환
✅ ES6(ECMAScript 2016)부터 사용 가능</p>
<hr>
<h3 id="2️⃣-문자열에서-includes">2️⃣ 문자열에서 .includes()</h3>
<p><strong>✔ 문자열 안에 특정 단어가 포함되어 있는지 확인할 때 사용</strong></p>
<pre><code class="language-javascript">const text = &quot;JavaScript는 재미있다.&quot;;

console.log(text.includes(&quot;JavaScript&quot;)); // true
console.log(text.includes(&quot;Python&quot;)); // false
</code></pre>
<p>✅ 대소문자를 구분한다 (&quot;Hello&quot;와 &quot;hello&quot;는 다르게 인식됨)
✅ 공백도 포함해서 찾는다
✅ indexOf()보다 가독성이 좋다</p>
<hr>
<h3 id="3️⃣-두-번째-매개변수-검색-시작-위치">3️⃣ 두 번째 매개변수 (검색 시작 위치)</h3>
<p><strong>✔ .includes(value, startIndex) 형식으로 특정 위치부터 검색할 수 있다</strong></p>
<pre><code class="language-javascript">const numbers = [10, 20, 30, 40, 50];

console.log(numbers.includes(20, 2)); // false (2번 인덱스부터 찾음)
console.log(numbers.includes(30, 2)); // true
</code></pre>
<hr>
<h3 id="4️⃣-includes-vs-indexof">4️⃣ .includes() vs .indexOf()</h3>
<table>
<thead>
<tr>
<th>메서드</th>
<th>반환값</th>
<th>사용법</th>
</tr>
</thead>
<tbody><tr>
<td><code>.includes()</code></td>
<td><code>true</code> 또는 <code>false</code></td>
<td><code>arr.includes(value)</code></td>
</tr>
<tr>
<td><code>.indexOf()</code></td>
<td>찾으면 인덱스 번호, 없으면 <code>-1</code></td>
<td><code>arr.indexOf(value) !== -1</code></td>
</tr>
</tbody></table>
<p>💡 존재 여부만 확인할 땐 <code>.includes()</code>가 더 직관적</p>
<hr>
<h3 id="5️⃣-활용-예시">5️⃣ 활용 예시</h3>
<p><strong>✔ 배열에서 중복 값 체크</strong></p>
<pre><code class="language-javascript">const selectedColors = [&quot;red&quot;, &quot;yellow&quot;, &quot;green&quot;];
const newColor = &quot;blue&quot;;

if (!selectedColors.includes(newColor)) {
  selectedColors.push(newColor);
}

console.log(selectedColors); // [&quot;red&quot;, &quot;yellow&quot;, &quot;green&quot;, &quot;blue&quot;]
</code></pre>
<p><strong>✔ 검색 기능 구현</strong></p>
<pre><code class="language-javascript">const products = [&quot;아이폰&quot;, &quot;갤럭시&quot;, &quot;맥북&quot;, &quot;아이패드&quot;];

const search = &quot;아이폰&quot;;
console.log(products.some((p) =&gt; p.includes(search))); // true
</code></pre>
<hr>
<h3 id="🔹-정리">🔹 정리</h3>
<p>✔ .includes()는 <strong>배열과 문자열에서 특정 값이 존재하는지 확인하는 메서드</strong>
✔ true 또는 false를 반환해 <strong>간결하게 조건문에서 활용가능</strong>
✔ <strong>검색, 중복 체크, 필터링</strong> 등에 유용</p>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[JS_5초 카운트다운 타이머 구현⏱️]]></title>
            <link>https://velog.io/@jjyu_my/JS%ED%83%80%EC%9D%B4%EB%A8%B8%EC%84%A4%EC%A0%95</link>
            <guid>https://velog.io/@jjyu_my/JS%ED%83%80%EC%9D%B4%EB%A8%B8%EC%84%A4%EC%A0%95</guid>
            <pubDate>Wed, 05 Feb 2025 07:34:56 GMT</pubDate>
            <description><![CDATA[<hr>
<h3 id="🏗️-1-html-코드">🏗️ 1. HTML 코드</h3>
<pre><code class="language-html">    &lt;div class=&quot;alert alert-danger&quot;&gt;
      &lt;span&gt;5&lt;/span&gt;초 이내 구매시 사은품 증정!
    &lt;/div&gt;</code></pre>
<p><strong>📌 설명</strong>
✅  먼저, 화면에 카운트다운 메시지를 표시할 <code>&lt;div&gt;</code> 태그 만들기
✅ <code>&lt;span&gt;</code> 태그 안의 숫자(5)가 1초마다 줄어든다
✅  5초 후에는 메시지가 자동으로 사라짐</p>
<hr>
<h3 id="⚡-2-javascript-구현">⚡ 2. JavaScript 구현</h3>
<pre><code class="language-javascript">// 5초 이내 구매시 사은품 증정 알림창 (1초씩 줄어들다가 사라짐)
let countNum = 5;

let interval = setInterval(function () {
  countNum--;

  if (countNum &gt;= 1) {
    document.querySelector(&quot;.alert span&quot;).innerHTML = countNum; // 숫자 변경
  }
  if (countNum &lt; 1) {
    clearInterval(interval); // 타이머 중지
    document.querySelector(&quot;.alert&quot;).style.display = &quot;none&quot;; // 메시지 숨기기
  }
}, 1000);</code></pre>
<p><strong>📌 설명</strong>
✅ setInterval()을 사용해 1초마다 숫자감소
✅ countNum이 0이 되면 clearInterval()을 사용해 타이머 중지 &amp; 메시지 숨김</p>
<hr>
<h3 id="🎬-3-실행-결과">🎬 3. 실행 결과</h3>
<p><img src="https://velog.velcdn.com/images/jjyu_my/post/f3d1f53e-3f1a-49ed-97dd-cc31e385c47a/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/jjyu_my/post/7dc3e9fc-e012-4262-a840-5e911c5f3de4/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/jjyu_my/post/1f119f50-8101-4d5d-b008-50290af0bbb0/image.png" alt=""></p>
<p>✅ 숫자가 줄어들면서 0이되면 팝업창이 사라진걸 확인할수있다</p>
<hr>
<blockquote>
<p>👩🏻‍💻 웹사이트 배너 만들기에 아주 유~용한 간단 코드!! </p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[JS_ 버튼 클릭으로 다크 모드 & 라이트 모드 전환🚀]]></title>
            <link>https://velog.io/@jjyu_my/JS-%EB%B2%84%ED%8A%BC-%ED%81%B4%EB%A6%AD%EC%9C%BC%EB%A1%9C-%EB%8B%A4%ED%81%AC-%EB%AA%A8%EB%93%9C-%EB%9D%BC%EC%9D%B4%ED%8A%B8-%EB%AA%A8%EB%93%9C-%EC%A0%84%ED%99%98</link>
            <guid>https://velog.io/@jjyu_my/JS-%EB%B2%84%ED%8A%BC-%ED%81%B4%EB%A6%AD%EC%9C%BC%EB%A1%9C-%EB%8B%A4%ED%81%AC-%EB%AA%A8%EB%93%9C-%EB%9D%BC%EC%9D%B4%ED%8A%B8-%EB%AA%A8%EB%93%9C-%EC%A0%84%ED%99%98</guid>
            <pubDate>Wed, 05 Feb 2025 06:27:07 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>👩🏻‍💻 간단한 버튼 클릭 이벤트로 다크 모드와 라이트 모드를 전환하는 기능을 구현해보았다</p>
</blockquote>
<hr>
<h3 id="🏗-html-코드">🏗 HTML 코드</h3>
<pre><code class="language-html"> &lt;nav class=&quot;navbar navbar-light bg-light&quot;&gt;
      &lt;div class=&quot;container-fluid&quot;&gt;
        &lt;span class=&quot;navbar-brand&quot;&gt;Navbar&lt;/span&gt;
        &lt;span class=&quot;badge bg-dark&quot;&gt;Dark🔁&lt;/span&gt;
        &lt;button class=&quot;navbar-toggler&quot; type=&quot;button&quot;&gt;
          &lt;span class=&quot;navbar-toggler-icon&quot;&gt;&lt;/span&gt;
        &lt;/button&gt;
      &lt;/div&gt;
    &lt;/nav&gt;</code></pre>
<p>✅ badge(뱃지) 요소를 클릭하면 다크 모드 ↔ 라이트 모드로 변경
✅ 기본적으로 &quot;Dark🔁&quot; 상태에서 시작</p>
<hr>
<h3 id="⚡️-javascript-코드">⚡️ JavaScript 코드</h3>
<pre><code class="language-javascript">       /**
       * Dark mode 버튼
       * badge 클릭횟수가 홀수면 내부 글자를 light로 변경
       * badge 클릭횟수가 짝수면 내부 글자를 dark로 변경
       */

      // 1. 클릭횟수 담을 변수 정의
      let count = 0;

      // 2. badge 클릭횟수가 홀수면 내부 글자를 클릭하면 횟수 증가
      document.querySelector(&quot;.badge&quot;).addEventListener(&quot;click&quot;, function () {
        count++;

        console.log(count);

        // 3. badge 클릭횟수가 짝수면 내부 글자가 다크모드
        if (count % 2 == 0) {
          document.querySelector(&quot;.badge&quot;).innerHTML = &quot;Dark🔁&quot;;

          // 4. badge 클릭횟수가 홀수면 내부 글자가 라이트모드
        } else {
          document.querySelector(&quot;.badge&quot;).innerHTML = &quot;Light🔁&quot;;
        }
      });</code></pre>
<hr>
<h3 id="🎨-실행-화면">🎨 실행 화면</h3>
<h4 id="🔆-홀수-클릭-light-모드">🔆 홀수 클릭 (Light 모드)</h4>
<p><img src="https://velog.velcdn.com/images/jjyu_my/post/eae887f4-5578-4800-8911-0c0c8d9a978b/image.png" alt=""></p>
<h4 id="🌙-짝수-클릭-dark-모드">🌙 짝수 클릭 (Dark 모드)</h4>
<p><img src="https://velog.velcdn.com/images/jjyu_my/post/a93897c1-a6a5-41a9-b6d0-3eb468df90e1/image.png" alt=""></p>
<hr>
<h3 id="🔥-정리">🔥 정리</h3>
<p>1️⃣ badge 요소 클릭 시 count 값 증가
2️⃣ 짝수면 &quot;Dark🔁&quot;, 홀수면 &quot;Light🔁&quot;로 변경
3️⃣ 콘솔에서 클릭 횟수를 확인할 수 있음</p>
<hr>
<blockquote>
<p>👩🏻‍💻 지금은 버튼만 변환하지만, 다음엔 전체적인 스타일까지 다크 모드로 변경할 예정! 하지만... 지금은 시간이 없뎌요...🥲</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스]피자 나눠 먹기 (1)
_자바스크립트]]></title>
            <link>https://velog.io/@jjyu_my/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%ED%94%BC%EC%9E%90-%EB%82%98%EB%88%A0-%EB%A8%B9%EA%B8%B0-1%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8</link>
            <guid>https://velog.io/@jjyu_my/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%ED%94%BC%EC%9E%90-%EB%82%98%EB%88%A0-%EB%A8%B9%EA%B8%B0-1%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8</guid>
            <pubDate>Wed, 05 Feb 2025 01:08:16 GMT</pubDate>
            <description><![CDATA[<h2 id="💻-프로그래머스-코딩테스트-연습lv0">💻 프로그래머스 코딩테스트 연습LV0</h2>
<h3 id="🔍-문제_피자-나눠-먹기1">🔍 문제_피자 나눠 먹기(1)</h3>
<p><img src="https://velog.velcdn.com/images/jjyu_my/post/bb126f26-6812-4d75-8ada-ecd14d3c76a6/image.png" alt=""></p>
<hr>
<h2 id="🎯-풀이">🎯 풀이</h2>
<h4 id="✅-첫-번째-풀이-parseint-사용">✅ 첫 번째 풀이 (parseInt 사용)</h4>
<p>1️⃣ n / 7을 정수로 변환하여 필요한 피자 판 수 계산
2️⃣ 나머지가 있다면(n % 7 &gt; 0), 한 판 추가</p>
<pre><code class="language-javascript">function solution(n) {
    return parseInt(n / 7) + (n % 7 &gt; 0 ? 1 : 0);
}
</code></pre>
<hr>
<h4 id="✅-더-간단한-풀이-mathceil-사용">✅ 더 간단한 풀이 (Math.ceil 사용)</h4>
<ul>
<li>찾아보니 더 간단한 방법이 있었다! 🎉</li>
<li>다른 사람들은 이렇게 풀었구나....ㅎㅎ</li>
</ul>
<pre><code class="language-javascript">function solution(n) {
    return Math.ceil(n / 7)
}</code></pre>
<blockquote>
<p>💡 <strong>Math.ceil</strong> : 올림처리하여 가장 가까운 정수 반환 (<strong>소수점이 있으면 무조건 올림</strong>)</p>
</blockquote>
<hr>
<h3 id="🔥-parseint-vs-mathceil-차이점">🔥 parseInt() vs Math.ceil() 차이점</h3>
<table>
<thead>
<tr>
<th>함수</th>
<th>동작 방식</th>
<th>예시 (<code>n = 10 / 3</code>)</th>
<th>결과</th>
</tr>
</thead>
<tbody><tr>
<td><code>parseInt()</code></td>
<td>정수 부분만 취함</td>
<td><code>parseInt(3.33...)</code></td>
<td><code>3</code></td>
</tr>
<tr>
<td><code>Math.ceil()</code></td>
<td>올림 처리</td>
<td><code>Math.ceil(3.33...)</code></td>
<td><code>4</code></td>
</tr>
</tbody></table>
<p>👉 Math.ceil(n / 7)을 사용하면 더 간단하고 직관적! 🚀✨</p>
<hr>
<blockquote>
<p>👩🏻‍💻 이 문제 풀면서 다시한번 생각했다..ㅎㅎ 아는게 힘이다 🥲</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[JS 조건문 활용_ 369 게임 & 시험 판독기]]></title>
            <link>https://velog.io/@jjyu_my/JS-%EC%A1%B0%EA%B1%B4%EB%AC%B8-%ED%99%9C%EC%9A%A9-369-%EA%B2%8C%EC%9E%84-%EC%8B%9C%ED%97%98-%ED%8C%90%EB%8F%85%EA%B8%B0</link>
            <guid>https://velog.io/@jjyu_my/JS-%EC%A1%B0%EA%B1%B4%EB%AC%B8-%ED%99%9C%EC%9A%A9-369-%EA%B2%8C%EC%9E%84-%EC%8B%9C%ED%97%98-%ED%8C%90%EB%8F%85%EA%B8%B0</guid>
            <pubDate>Tue, 04 Feb 2025 08:06:03 GMT</pubDate>
            <description><![CDATA[<h3 id="📌-369-게임">📌 369 게임</h3>
<h4 id="🧐-문제-설명">🧐 문제 설명</h4>
<ul>
<li>철수는 3의 배수를 구별하기 힘들어 프로그래밍으로 해결하려 한다</li>
<li>3의 배수일 때 박수를 치며, 9의 배수일 경우 박수를 2번 친다</li>
</ul>
<pre><code class="language-javascript">📝 코드 구현
function game369(number) {
  if ((number % 3 === 0) &amp;&amp; number % 9 !== 0) {
    console.log(&#39;👏🏻&#39;); // 3의 배수 (9의 배수 제외)
  } else if (number % 9 === 0) {
    console.log(&#39;👏🏻👏🏻&#39;); // 9의 배수
  } else {
    console.log(&#39;통과&#39;); // 그 외 숫자
  }
}

✅ 테스트 케이스
game369(3);   // 👏🏻
game369(9);   // 👏🏻👏🏻
game369(11);  // 통과
game369(18);  // 👏🏻👏🏻
game369(21);  // 👏🏻</code></pre>
<hr>
<h3 id="📌-끝자리-369-게임">📌 끝자리 3,6,9 게임</h3>
<h4 id="🧐-문제-설명-1">🧐 문제 설명</h4>
<ul>
<li>숫자의 끝자리가 3, 6, 9일때 &#39;박수&#39;를 출력하는 프로그램을 만들기</li>
</ul>
<pre><code class="language-javascript">📝 코드 구현
function game369(number) {
  const lastnumber = number.toString().slice(-1); // 숫자의 마지막 자리 확인
  if (lastnumber === &#39;3&#39; || lastnumber === &#39;6&#39; || lastnumber === &#39;9&#39;) {
    console.log(&#39;👏🏻&#39;);
  } else {
    console.log(&#39;통과&#39;);
  }
}

✅ 테스트 케이스
game369(3);   // 👏🏻
game369(9);   // 👏🏻
game369(18);  // 통과
game369(23);  // 👏🏻
game369(26);  // 👏🏻
game369(29);  // 👏🏻
game369(40);  // 통과</code></pre>
<hr>
<h3 id="📌-공인중개사-1차-시험-합격-판독기-🎓">📌 공인중개사 1차 시험 합격 판독기 🎓</h3>
<h4 id="🧐-문제-설명-2">🧐 문제 설명</h4>
<ul>
<li>두 과목 점수 합이 120점 이상이면 합격</li>
<li>한 과목이라도 40점 미만이면 불합격</li>
<li>점수가 0~100이 아닌 경우, 경고 메시지 출력</li>
</ul>
<pre><code class="language-javascript">📝 코드 구현
function testScore(score1, score2) {
  if (score1 &lt; 0 || score1 &gt; 100 || score2 &lt; 0 || score2 &gt; 100) {
    console.log(&#39;🚨 장난치지 말고 0에서 100 사이 숫자입력해 🤬&#39;);
  } else if (score1 &lt; 40 || score2 &lt; 40) {
    console.log(&#39;❌ 불합격 (과락)&#39;);
  } else if (score1 + score2 &gt;= 120) {
    console.log(&#39;🎉 합격&#39;);
  } else {
    console.log(&#39;❌ 불합격&#39;);
  }
}


✅ 테스트 케이스
testScore(70, 70);  // 🎉 합격
testScore(30, 100); // ❌ 불합격 (과락)
testScore(50, 50);  // ❌ 불합격
testScore(110, 50); // 🚨 장난치지 말고 0에서 100 사이 숫자를 입력해주세요 🤬</code></pre>
<hr>
<blockquote>
<p>👩🏻‍💻 복습 차원에서 오랜만에 조건문 문제를 풀어봤다
빠르게 풀 수 있을 줄 알았는데, 생각보다 오래 걸림...ㅎㅎ
그래도 처음 풀 때보다는 훨~씬 수월하게 해결! 이번엔 구글링 없이 풀었다! 🎉</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[모달창 제어하기_add(),  remove(), toggle()의 차이]]></title>
            <link>https://velog.io/@jjyu_my/%EB%AA%A8%EB%8B%AC%EC%B0%BD-%EC%A0%9C%EC%96%B4%ED%95%98%EA%B8%B0add-remove-toggle%EC%9D%98-%EC%B0%A8%EC%9D%B4</link>
            <guid>https://velog.io/@jjyu_my/%EB%AA%A8%EB%8B%AC%EC%B0%BD-%EC%A0%9C%EC%96%B4%ED%95%98%EA%B8%B0add-remove-toggle%EC%9D%98-%EC%B0%A8%EC%9D%B4</guid>
            <pubDate>Tue, 04 Feb 2025 02:23:07 GMT</pubDate>
            <description><![CDATA[<hr>
<h3 id="💎-html">💎 HTML</h3>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;en&quot;&gt;
  &lt;head&gt;
    &lt;meta charset=&quot;utf-8&quot; /&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot; /&gt;
    &lt;title&gt;서브메뉴_classList다루기&lt;/title&gt;
    &lt;link
      href=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css&quot;
      rel=&quot;stylesheet&quot;
      integrity=&quot;sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH&quot;
      crossorigin=&quot;anonymous&quot;
    /&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;./css/06_서브메뉴_classList다루기.css&quot; /&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;nav class=&quot;navbar navbar-light bg-light&quot;&gt;
      &lt;div class=&quot;container-fluid&quot;&gt;
        &lt;span class=&quot;navbar-brand&quot;&gt;Navbar&lt;/span&gt;
        &lt;button class=&quot;navbar-toggler&quot; type=&quot;button&quot;&gt;
          &lt;span class=&quot;navbar-toggler-icon&quot;&gt;&lt;/span&gt;
        &lt;/button&gt;
      &lt;/div&gt;
    &lt;/nav&gt;

    &lt;ul class=&quot;list-group&quot;&gt;
      &lt;li class=&quot;list-group-item&quot;&gt;An item&lt;/li&gt;
      &lt;li class=&quot;list-group-item&quot;&gt;A second item&lt;/li&gt;
      &lt;li class=&quot;list-group-item&quot;&gt;A third item&lt;/li&gt;
      &lt;li class=&quot;list-group-item&quot;&gt;A fourth item&lt;/li&gt;
      &lt;li class=&quot;list-group-item&quot;&gt;And a fifth one&lt;/li&gt;
    &lt;/ul&gt;

    &lt;!-- login modal --&gt;
    &lt;div class=&quot;black-bg&quot;&gt;
      &lt;div class=&quot;white-bg&quot;&gt;
        &lt;h4&gt;please login&lt;/h4&gt;
        &lt;button class=&quot;btn btn-danger&quot; id=&quot;close&quot;&gt;Close&lt;/button&gt;
      &lt;/div&gt;
    &lt;/div&gt;

    &lt;button id=&quot;loginButton&quot;&gt;login&lt;/button&gt;

    &lt;!-- 부트스트랩 라이브러리 --&gt;
    &lt;script
      src=&quot;https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js&quot;
      integrity=&quot;sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz&quot;
      crossorigin=&quot;anonymous&quot;
    &gt;&lt;/script&gt;

    &lt;!-- 제이쿼리 라이브러리 --&gt;
    &lt;script
      src=&quot;https://code.jquery.com/jquery-3.7.1.min.js&quot;
      integrity=&quot;sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo=&quot;
      crossorigin=&quot;anonymous&quot;
    &gt;&lt;/script&gt;

    &lt;script&gt;

      /**
      * 네비게이션바
      *  ✅ toggle() 메서드는 클래스가 없으면 추가하고, 있으면 제거한다.
      */

      $(&quot;.navbar-toggler&quot;).on(&quot;click&quot;, function () {
        $(&quot;.list-group&quot;).toggleClass(&quot;show&quot;);
      });


      /**
       * login 모달창
       * login click 하면 모달창 띄우기
       * 
       */
      document
        .querySelector(&quot;#loginButton&quot;)
        .addEventListener(&quot;click&quot;, function () {
          document.querySelector(&quot;.black-bg&quot;).classList.add(&quot;show&quot;);
        });

      // 띄어진 모달창 close누르면 닫기
      document.querySelector(&quot;#close&quot;).addEventListener(&quot;click&quot;, function () {
        document.querySelector(&quot;.black-bg&quot;).classList.remove(&quot;show&quot;);
      });
    &lt;/script&gt;
  &lt;/body&gt;
&lt;/html&gt;
</code></pre>
<p>✅ add(&quot;show&quot;) → 모달 무조건 열기 
✅ remove(&quot;show&quot;) → 모달 무조건 닫기</p>
<h4 id="🔄-toggle은-언제">🔄 toggle()은 언제?</h4>
<p>✅ toggle(&quot;show&quot;) → 버튼 하나로 열고 닫을 때
❌ 하지만 모달에는 닫기 버튼이 따로 있어 add/remove가 더 적절</p>
<hr>
<h3 id="🎨-css">🎨 CSS</h3>
<pre><code class="language-css">
/* 서브메뉴 기본 스타일: 숨김 상태 */
.list-group {
  max-height: 0; /* 서브메뉴의 최대 높이를 0으로 설정하여 숨김 */
  overflow: hidden; /* 내용이 넘치지 않도록 숨김 */
  transition: max-height 0.5s ease-out; /* max-height 변화에 애니메이션 효과 추가 */
}

/* 서브메뉴가 보이는 상태 */
.list-group.show {
  max-height: 400px; /* 서브메뉴의 최대 높이를 400px로 설정하여 보이게 함 */
}

/* 모달 배경 기본 스타일: 숨김 상태 */
.black-bg {
  width: 100%;
  height: 100%;
  position: fixed;
  background: rgba(0, 0, 0, 0.5);
  z-index: 5;
  padding: 30px;
  visibility: hidden; /* 애니메이션을 위한 시작 스타일 */
  opacity: 0; /* 애니메이션을 위한 시작 스타일 */
  transition: all 1s; /* 모든 변화에 애니메이션 효과 추가 */
}

/* 모달 내용 스타일 */
.white-bg {
  background: white;
  border-radius: 5px;
  padding: 30px;
}

/* 모달이 보이는 상태 */
.show {
  visibility: visible; /* 애니메이션을 위한 끝 스타일 */
  opacity: 1; /* 애니메이션을 위한 끝 스타일 */
}
</code></pre>
<hr>
<h3 id="✅-결과">✅ 결과</h3>
<p><img src="https://velog.velcdn.com/images/jjyu_my/post/9befdb38-d560-4e49-a0c9-73a63361d610/image.png" alt=""></p>
<p>✔️ 모달에는 add() / remove()가 더 명확 
✔️ 토글 버튼(예: 햄버거 메뉴)에는 toggle()이 적절</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[📌 간단한 알럿창 만들기]]></title>
            <link>https://velog.io/@jjyu_my/JSFunction%EB%AC%B8%EB%B2%95-%EC%82%AC%EC%9A%A9%EB%B2%95</link>
            <guid>https://velog.io/@jjyu_my/JSFunction%EB%AC%B8%EB%B2%95-%EC%82%AC%EC%9A%A9%EB%B2%95</guid>
            <pubDate>Mon, 03 Feb 2025 06:03:20 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>👩🏻‍💻 예전에 끊어놓고 시간이 없어서 미뤄둔 강의를 복습 차원에서 빠르게 듣는 중이다~!
<strong>아주아주 쉬운 알럿창 만들기!!!</strong>
쉽지만 파라미터 이해는 중요한 개념이다!! 이거 이해 못하면 JS 어려움! 😆</p>
</blockquote>
<hr>
<h3 id="📌-간단한-알럿-창-만들기">📌 간단한 알럿 창 만들기</h3>
<ul>
<li>버튼을 클릭하면 알럿 창이 보이고, 닫기 버튼(❎)을 누르면 닫히기</li>
</ul>
<h4 id="💎-html">💎 HTML</h4>
<pre><code class="language-html">&lt;html lang=&quot;en&quot;&gt;
&lt;head&gt;
  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
  &lt;title&gt;Document&lt;/title&gt;
  &lt;link rel=&quot;stylesheet&quot; href=&quot;./css/02_AlertBox.css&quot;&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;!-- 알럿박스 --&gt;
&lt;div class=&quot;alert-box&quot; id=&quot;alert&quot;&gt;Hello~Javascript Alert box!!
  &lt;button class=&quot;closebutton&quot; onclick=&quot;alertButton(&#39;none&#39;)&quot;&gt;❎&lt;/button&gt;
&lt;/div&gt;

&lt;!-- 알럿 열기 버튼 --&gt;
&lt;button class=&quot;clickbutton&quot; onclick=&quot;alertButton(&#39;block&#39;)&quot;&gt;Click&lt;/button&gt;

&lt;script&gt;
  // displayState를 파라미터(인자)로 받아서 alertBox를 보여주거나 숨겨주는 함수
  function alertButton(displayState){ 
    document.getElementById(&#39;alert&#39;).style.display=displayState;
  }
&lt;/script&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre>
<hr>
<h4 id="🎨-css">🎨 CSS</h4>
<pre><code class="language-css">.alert-box {
  background-color: rgb(255, 255, 137);
  padding: 20px;
  color: rgb(49, 152, 35);
  border-radius: 5px;
  display: none;
  font-weight: bold;
  margin-bottom: 5px;
}

.clickbutton{
  cursor: pointer;
  background: rgb(172, 237, 163);
  border: none;
  padding: 5px;
  font-size: 20px;
  border-radius: 10px;
}

.closebutton{
  float: right;
  font-size: 20px;
  background: none;
  border: none;
  cursor: pointer;
}</code></pre>
<hr>
<h4 id="🔹-정리">🔹 정리</h4>
<ul>
<li>Click 버튼 → 알럿 창 보이기</li>
<li>❎ 버튼 → 알럿 창 닫기</li>
<li>alertButton(displayState) 함수를 활용해 display 속성을 변경</li>
<li>css 는 취향껏 코드짜기<del>~</del>😎</li>
</ul>
<hr>
<h4 id="✅-결과">✅ 결과</h4>
<p><img src="https://velog.velcdn.com/images/jjyu_my/post/b8fa68bd-9734-4052-8a57-4373dff48985/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스]최빈값 구하기_자바스크립트]]></title>
            <link>https://velog.io/@jjyu_my/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%EC%B5%9C%EB%B9%88%EA%B0%92-%EA%B5%AC%ED%95%98%EA%B8%B0%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8</link>
            <guid>https://velog.io/@jjyu_my/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%EC%B5%9C%EB%B9%88%EA%B0%92-%EA%B5%AC%ED%95%98%EA%B8%B0%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8</guid>
            <pubDate>Mon, 03 Feb 2025 00:56:51 GMT</pubDate>
            <description><![CDATA[<h2 id="💻-프로그래머스-코딩테스트-연습lv0">💻 프로그래머스 코딩테스트 연습LV0</h2>
<h3 id="🔍-문제_최빈값-구하기">🔍 문제_최빈값 구하기</h3>
<p><img src="https://velog.velcdn.com/images/jjyu_my/post/38c92d67-756d-4a7e-aff8-6e59ed59db84/image.png" alt=""></p>
<hr>
<h2 id="🎯-풀이">🎯 풀이</h2>
<p><strong>1️⃣ 등장횟수 카운트</strong></p>
<ul>
<li>객체 counts 랄 사용해 숫자의 등장 횟수를 기록</li>
<li>array.forEach()를 활용해서 숫자가 등장할때마다 개수 증가</li>
</ul>
<p><strong>2️⃣ 최빈값 구하기</strong> </p>
<ul>
<li>Object.values(counts)를 사용해 등장 횟수들 중 최대값(maxCoutn)을 구한다</li>
<li>Object.keys(counts)로 counts 객체의 키(숫자들)를 가져온 후, filter()를 사용해 maxCount와 같은 
값을 가지는 숫자들을 modes 배열에 저장</li>
</ul>
<p><strong>3️⃣ 최빈값이 여러개면 -1반환, 아니면 최빈값 반환</strong></p>
<ul>
<li>modes 배열의 길이가 1보다 크면 최빈값이 여러 개이므로 -1을 반환</li>
<li>그렇지 않으면 modes[0]을 숫자로 변환하여 반환</li>
</ul>
<hr>
<pre><code class="language-javascript">function solution(array) {
    let counts = {};

    // 1. 등장 횟수 카운트
    array.forEach(num =&gt; counts[num] = (counts[num] || 0) + 1);

    // 2. 최빈값 찾기
    let maxCount = Math.max(...Object.values(counts));
    let modes = Object.keys(counts).filter(num =&gt; counts[num] === maxCount);

    // 3. 최빈값이 여러 개면 -1 반환, 아니면 최빈값 반환
    return modes.length &gt; 1 ? -1 : Number(modes[0]);
}
</code></pre>
<hr>
<blockquote>
<p>👩🏻‍💻 이건 진짜 구글링으로 찾아보고 GPT한테도 물어봐서 풀은 문제이다...
나의 문제해결 능력은 10% 정도..?ㅎㅎ
찾아보고, 물어보면 바로 답을 알려줘서 답 안보고 참고만 하려고 엄청 흐린눈을 했다....코드가 길어질것같으면 바~로 막혀버리는 나.. 문제있다잉?!🥲</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스]중앙값 구하기_자바스크립트]]></title>
            <link>https://velog.io/@jjyu_my/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%EC%A4%91%EC%95%99%EA%B0%92-%EA%B5%AC%ED%95%98%EA%B8%B0%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8</link>
            <guid>https://velog.io/@jjyu_my/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%EC%A4%91%EC%95%99%EA%B0%92-%EA%B5%AC%ED%95%98%EA%B8%B0%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8</guid>
            <pubDate>Fri, 31 Jan 2025 02:50:40 GMT</pubDate>
            <description><![CDATA[<h2 id="💻-프로그래머스-코딩테스트-연습lv0">💻 프로그래머스 코딩테스트 연습LV0</h2>
<h3 id="🔍-문제_중앙값-구하기">🔍 문제_중앙값 구하기</h3>
<p><img src="https://velog.velcdn.com/images/jjyu_my/post/7211d55b-1aad-4e64-b8da-7ce11b88b610/image.png" alt=""></p>
<hr>
<h2 id="🎯-풀이">🎯 풀이</h2>
<p>1️⃣ 배열을 오름차순으로 정렬
2️⃣ 배열의 길이가 홀수이므로 중앙값은 (길이 // 2) 번째 요소</p>
<pre><code class="language-javascript">function solution(array) {
    // 숫자 배열을 오름차순으로 정렬
    array.sort((a, b) =&gt; a - b);

    // 배열 길이의 절반을 내림한 값이 중앙 인덱스
    return array[Math.floor(array.length / 2)];
}
</code></pre>
<hr>
<blockquote>
</blockquote>
<p>💡 Math.floor() 은 <strong>소수점 이하를 버리고, 가장 가까운 작은 정수로 내림하는 함수</strong>이다!
배열의 길이를 2로 나눈 값이 소수점이 있을 수 있는데, 소수점 이하를 버리고 정수로 내리기 위해 사용하였다.
Math.floor() 사용하면 중앙값을 정확하게 찾을 수 있다<del>!!</del>!!</p>
<pre><code class="language-javascript">✅ ex)
console.log(Math.floor(3.9)); // 3
console.log(Math.floor(7.1)); // 7
console.log(Math.floor(5.9999)); // 5
console.log(Math.floor(2.0)); // 2</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스]배열 두배 만들기_자바스크립트]]></title>
            <link>https://velog.io/@jjyu_my/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%EB%B0%B0%EC%97%B4-%EB%91%90%EB%B0%B0-%EB%A7%8C%EB%93%A4%EA%B8%B0%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8</link>
            <guid>https://velog.io/@jjyu_my/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%EB%B0%B0%EC%97%B4-%EB%91%90%EB%B0%B0-%EB%A7%8C%EB%93%A4%EA%B8%B0%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8</guid>
            <pubDate>Fri, 31 Jan 2025 02:38:44 GMT</pubDate>
            <description><![CDATA[<h2 id="💻-프로그래머스-코딩테스트-연습lv0">💻 프로그래머스 코딩테스트 연습LV0</h2>
<h3 id="🔍-문제_배열-두배-만들기">🔍 문제_배열 두배 만들기</h3>
<p><img src="https://velog.velcdn.com/images/jjyu_my/post/5ce8840f-0595-4015-a13a-b3254e7c15b8/image.png" alt=""></p>
<hr>
<h4 id="✅-방법-1">✅ 방법 1</h4>
<p>1️⃣ reduce 를 사용해서 배열을 순회하면서 새로운 배열 만들어주기
2️⃣ a는 누적된 배열, b는 현재 순회중인 요소
3️⃣ ...a를 사용해 기존 배열의 요소를 그대로 유지 ➡️ b * 2를 새로운 요소로 추가
4️⃣ 초기값을 []로 설정하여 빈 배열에서 시작</p>
<pre><code class="language-javascript">function solution(numbers) {
    return numbers.reduce((a, b) =&gt; [...a, b * 2], []);
}</code></pre>
<hr>
<h4 id="✅-방법-2">✅ 방법 2</h4>
<p>1️⃣ map 함수를 사용하여 배열의 각 요소를 변환 
2️⃣ number는 현재 순회중인 요소
3️⃣ number * 2를 새로운 배열의 요소로 추가</p>
<pre><code class="language-javascript">function solution(numbers) {
    return numbers.map(number =&gt; number * 2);
}</code></pre>
<hr>
<blockquote>
<p>👩🏻‍💻 처음에 힘들게 힘들게~~ 방법1인 reduce 사용을했는데 찾아보니까** map함수가 더 배열의 각 요소를 변환하는 데 더 적합**하다고 해서 다시 한번 풀어보았다!! 
물론 다른 글들의 도움을 받으면서,,, 언제쯤 혼자 해결할수있을까..?!?!?</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스]각도기_자바스크립트]]></title>
            <link>https://velog.io/@jjyu_my/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%EA%B0%81%EB%8F%84%EA%B8%B0%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8</link>
            <guid>https://velog.io/@jjyu_my/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%EA%B0%81%EB%8F%84%EA%B8%B0%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8</guid>
            <pubDate>Fri, 31 Jan 2025 02:21:36 GMT</pubDate>
            <description><![CDATA[<h2 id="💻-프로그래머스-코딩테스트-연습lv0">💻 프로그래머스 코딩테스트 연습LV0</h2>
<h3 id="🔍-문제_각도기">🔍 문제_각도기</h3>
<p><img src="https://velog.velcdn.com/images/jjyu_my/post/621c9cb4-e419-43f8-ad54-d492a071fb97/image.png" alt=""></p>
<hr>
<h2 id="🎯-풀이">🎯 풀이</h2>
<p>각도(0 &lt; angle ≤ 180)가 주어지면,
✅ 예각(1) → 0° ~ 90° 미만
✅ 직각(2) → 90°
✅ 둔각(3) → 90° 초과 ~ 180° 미만
✅ 평각(4) → 180°</p>
<p>이렇게 네 가지 중 하나를 반환🚀</p>
<hr>
<h4 id="✅-방법-1--if문-사용직관적">✅ 방법 1 : if문 사용(직관적)</h4>
<pre><code class="language-javascript">function solution(angle) {
    if (angle &gt; 0 &amp;&amp; angle &lt; 90) {
        return 1; // 예각
    } else if (angle === 90) {
        return 2; // 직각
    } else if (angle &gt; 90 &amp;&amp; angle &lt; 180) {
        return 3; // 둔각
    } else if (angle === 180) {
        return 4; // 평각
    }
}
</code></pre>
<ul>
<li>if문을 사용해서 조건을 차례대로 검사하면서 해당하는 값을 반환해준다</li>
</ul>
<hr>
<h4 id="✅-방법-2--math-함수-활용">✅ 방법 2 : Math 함수 활용</h4>
<pre><code class="language-javascript">
function solution(angle) {
    return angle === 180 ? 4 : angle &gt; 90 ? 3 : angle === 90 ? 2 : 1;
}

</code></pre>
<ul>
<li>삼항연산자를 활용해서 간단하게 풀이할수 있다! </li>
</ul>
<hr>
<h4 id="🚀-결론">🚀 결론</h4>
<ul>
<li>쉽고 직관적인 방법은 if문을 사용!!</li>
<li>한줄로 깔끔하게 하고싶다면? 삼항연산자 활용!!! <blockquote>
<p>👩🏻‍💻 처음풀이는 if문을 사용했는데 코드가 너무 길고 더 쉬운 방법이 있을듯하여 찾아보았다!!! 결과 삼항연산자로 간단하게 풀어보았다!!! </p>
</blockquote>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스]배열의 평균값_자바스크립트]]></title>
            <link>https://velog.io/@jjyu_my/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%EB%B0%B0%EC%97%B4%EC%9D%98-%ED%8F%89%EA%B7%A0%EA%B0%92%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8</link>
            <guid>https://velog.io/@jjyu_my/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%EB%B0%B0%EC%97%B4%EC%9D%98-%ED%8F%89%EA%B7%A0%EA%B0%92%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8</guid>
            <pubDate>Sun, 26 Jan 2025 11:52:46 GMT</pubDate>
            <description><![CDATA[<h2 id="💻-프로그래머스-코딩테스트-연습lv0">💻 프로그래머스 코딩테스트 연습LV0</h2>
<h3 id="🔍-문제_배열의-평균값">🔍 문제_배열의 평균값</h3>
<p><img src="https://velog.velcdn.com/images/jjyu_my/post/9e3b2133-ca46-4c91-bb6d-9e4c43264770/image.png" alt=""></p>
<hr>
<h2 id="🎯-풀이">🎯 풀이</h2>
<p>1️⃣ numbers 에 있는 모든 숫자를 더한다
2️⃣ 요소의 개수로 나누어 평균을 계산한다
3️⃣ 계산된 평균값을 반환!</p>
<hr>
<pre><code class="language-javascript">function solution(numbers) {
     // 1) numbers 배열의 합을 구한다
    const sum = numbers.reduce((acc, num) =&gt; acc + num, 0);

     // 2) 합계를 요소 개수로 나누어 평균을 계산
    const average = sum / numbers.length;

    // 3) 계산된 평균값을 반환
    return average;
}
</code></pre>
<hr>
<blockquote>
<p>👩🏻‍💻 문제를 풀이하면서 reduce 메서드를 사용하였다!!!
<strong>reduce는 초기값을 설정한 뒤 배열을 순회하며 계산된 누적 값을 저장</strong>한다
즉!! 배열의 모든 요소를 간단히 합산하거나 원하는 값으로 처리할 때 유용한 메서드다~~!!</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스]문자열 뒤집기_자바스크립트]]></title>
            <link>https://velog.io/@jjyu_my/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%92%A4%EC%A7%91%EA%B8%B0%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8</link>
            <guid>https://velog.io/@jjyu_my/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%92%A4%EC%A7%91%EA%B8%B0%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8</guid>
            <pubDate>Sun, 19 Jan 2025 10:32:03 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>👩🏻‍💻 생각보다 손쉽게 풀었던 문제였다!!!알고리즘 병아리인 나는 스스로 풀고 놀랐지 모야,,!??!?!?! 🐣</p>
</blockquote>
<hr>
<h2 id="💻-프로그래머스-코딩테스트-연습lv0">💻 프로그래머스 코딩테스트 연습LV0</h2>
<h3 id="🔍-문제_문자열-뒤집기">🔍 문제_문자열 뒤집기</h3>
<p><img src="https://velog.velcdn.com/images/jjyu_my/post/677215f8-5aa8-45a2-82d8-2134258d0122/image.png" alt=""></p>
<h3 id="🎯-문제-해결-방법">🎯 문제 해결 방법</h3>
<p><strong>1️⃣ 문자열을 배열로 변환</strong></p>
<ul>
<li>my_string을 한 글자씩 잘라 배열로 만들기<ul>
<li>방법: split(&#39;&#39;) 또는 [...my_string] 사용</li>
</ul>
</li>
</ul>
<p><strong>2️⃣ 배열 뒤집기</strong></p>
<ul>
<li>배열의 순서를 뒤집기 위해 reverse() 메서드를 사용</li>
</ul>
<p><strong>3️⃣ 문자열로 다시 합치기</strong></p>
<ul>
<li>뒤집어진 배열을 문자열로 변환하기 위해 join(&#39;&#39;) 메서드를 사용</li>
</ul>
<hr>
<h3 id="🛠-두-가지-풀이-방법">🛠 두 가지 풀이 방법</h3>
<h4 id="✅-방법-1-split-사용">✅ 방법 1: split() 사용</h4>
<pre><code class="language-javascript">function solution(my_string) {
    var answer = my_string.split(&#39;&#39;).reverse().join(&#39;&#39;);
    return answer;
}</code></pre>
<p><img src="https://velog.velcdn.com/images/jjyu_my/post/64d63eed-3ad2-4a90-896a-e2220b987797/image.png" alt=""></p>
<hr>
<h4 id="✅--방법-2-스프레드-연산자-사용">✅  방법 2: 스프레드 연산자 사용</h4>
<pre><code class="language-javascript">function solution(my_string) {
    var answer = [...my_string].reverse().join(&quot;&quot;);
    return answer;
}</code></pre>
<p><img src="https://velog.velcdn.com/images/jjyu_my/post/6e588a0d-93d4-48f0-94b5-55e69682ed72/image.png" alt=""></p>
<hr>
<h4 id="🚀-결론">🚀 결론</h4>
<ul>
<li><p>성능적으로 비교해보아도 실제 실행 시간에서는 큰 차이가 없다!!
다만, split(&#39;&#39;)은 메서드 호출을 사용하므로 미미하게 느릴 수 있다.. 하지만 차이는 거의 무시해도 되는 수준이다</p>
</li>
<li><p>개인적으로 방법 2가 코드가 더 간결하고 스프레드 문법이 최신 문법이라 그런지 가독성이 더 좋게 느껴진다ㅎㅎㅎㅎㅎㅎ😝</p>
</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>