<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>jinny0_0.log</title>
        <link>https://velog.io/</link>
        <description>세상을 이롭게 하는 프론트엔드 개발자 Jinny</description>
        <lastBuildDate>Fri, 21 Feb 2025 07:48:32 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>jinny0_0.log</title>
            <url>https://velog.velcdn.com/images/jinny0_0/profile/63afece5-085c-4439-990f-2b5b17268485/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. jinny0_0.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/jinny0_0" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[개발 학습 회고] 2월 3주차 KPT회고 & 목표 달성률 분석]]></title>
            <link>https://velog.io/@jinny0_0/%EC%9C%84%ED%81%B4%EB%A6%AC-KPT-%ED%9A%8C%EA%B3%A0-2025%EB%85%84-2%EC%9B%94-17%EC%9D%BC%EC%9B%94-2025%EB%85%84-2%EC%9B%94-21%EC%9D%BC%EA%B8%88</link>
            <guid>https://velog.io/@jinny0_0/%EC%9C%84%ED%81%B4%EB%A6%AC-KPT-%ED%9A%8C%EA%B3%A0-2025%EB%85%84-2%EC%9B%94-17%EC%9D%BC%EC%9B%94-2025%EB%85%84-2%EC%9B%94-21%EC%9D%BC%EA%B8%88</guid>
            <pubDate>Fri, 21 Feb 2025 07:48:32 GMT</pubDate>
            <description><![CDATA[<ul>
<li>일시: 2025년 2월 17일(월) ~ 2025년 2월 21일(금)</li>
</ul>
<h3 id="1-위클리-목표">1. 위클리 목표</h3>
<pre><code>- 알고리즘
    - 실전 스터디 16문제 → 소화 모두 하기
        - 고득점 키트 총 8문제
            - 스택 큐 - 4문제
                - 완전 탐색 - 4문제
- SQL
    - 고득점 키트 문제 마무리 완료 (18문제 남음)</code></pre><h3 id="2-위클리-목표-달성률">2. 위클리 목표 달성률</h3>
<pre><code>- 총 24문제 중 8문제 완료: 33%
- 알고리즘  [8문제]
    - 스택 큐: 0/4문제
    - 완전 탐색: 0/4문제
- SQL [16문제]
    - 목표: 16문제
    - 달성: 8 문제 완료</code></pre><p>벌써 내일 이번주 토요일이 소마 1차 코딩테스트가 있는 날이다.</p>
<p>이번주는 몸 상태가 좋지 않아 몰입해서 공부를 하지 못하였다. 저번주 목요일부터 인후염이 왔고 이후 장염이 오면서 몸이 좋지 않았다. 그래서 월요일은 주 2회 사용할 수 있는 사유 결근을 오전, 오후 스터디 각각 1회씩 총 2회 사용했고, 화요일은 벌점을 받고 하루를 푹 쉬었다.</p>
<p>결국 수요일, 목요일, 금요일 3일만 공부할 수 있었는데, 계속 약을 먹다보니 졸리고 컨디션이 좋지 않아 쉬면서 공부를 하곤 하였다.</p>
<p>그래도 스터디가 있어서 아예 공부를 놓지 않아서 다행이라는 생각이 들었다. </p>
<p>지금까지 코딩테스트 준비를 약 7주간 했고, 스터디 도움을 받아 최선을 다해 공부할 수 있었다. 퇴사 후 개발 공부를 독학으로 시작한 것도 4-5 개월 정도 되었다. 소마를 준비하는 다른 사람들에 비해는 아주 짧은 기간이다. </p>
<p>소마에 떨어져도 나의 목표는 개발자로서 커리어를 쌓는 것이기 때문에 낙담하기보다는 또 새로운 길을 찾는 설렘으로 준비할 수 있을 것 같다. </p>
<h3 id="위클리-kpt회고">위클리 KPT회고</h3>
<p>Keep</p>
<ul>
<li>오전 10시부터 12시까지 시간을 맞춰서 소마 코딩테스트와 비슷한 난이도와 같은 문제 개수로 실전코테를 함께 풀고 서로의 결과를 공부하니 나의 실력이 어느 정도인지 파악을 할 수가 있었고, 남은 스터디 시간에 못 풀었던 문제를 내것으로 만들기 위해 노력할 수있었다.</li>
<li>몸이 아팠지만 그래도 스터디가 있어서 완전히 포기하지 않을 수가 있었다. 소마 이후로도 어떤 방법으로든 스터디를 만들어 계속해서 개발자로서의 성장을 그려야 겠다는 생각이 든다.</li>
</ul>
<p>Problem</p>
<ul>
<li>목표 달성률이 낮은 이유는 목표를 잡은 것과 다르게 실전코테 문제 위주와 복습 위주로 학습을 하였기 때문이다.</li>
<li>그 날 풀었던 실전 코테 문제를 하루 만에 복습하지 못하였다. 이후 문제를 풀 때 비슷한 개념을 헷갈렸는데 복습 문제라는 생각이 든다.</li>
<li>건강 이슈로 학업에 시간을 많이 투자하지 못한 것이 아쉽다. 개발자로서의 커리어로 계속해서 성장하는 것이 목표다보니 장기적인 건강관리가 중요하다는 생각이 든다. 이후 출산과 출산 후 커리어의 지속성도 생각해야되므로 건강에 더 신경을 써야된다.</li>
<li>매일 공부하며 노력을 하는데 벨로그에 남기지 못해서 개발자 준비 과정을 남기지 못한 부분이 아쉬움으로 다가온다.</li>
</ul>
<p>Try</p>
<ul>
<li>공부 루틴을 오전에 문제를 새롭게 풀고 오후에는 그 문제를 정리하여 내 것으로 만드는 것으로 루틴을 잡자.</li>
<li>건강을 잘 챙기자. 1시 전에는 수면 지키고, 하루에 물도 1.5L이상 마시고 운동도 꾸준히, 식사도 규칙적으로 하자.</li>
<li>매일은 아니더라도 위클리 목표 회고는 벨로그에 올려서 나의 개발자 준비 여정을 나타내자.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 체육복(42862133025) - JavaScript 풀이]]></title>
            <link>https://velog.io/@jinny0_0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%B2%B4%EC%9C%A1%EB%B3%B5-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8</link>
            <guid>https://velog.io/@jinny0_0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%B2%B4%EC%9C%A1%EB%B3%B5-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8</guid>
            <pubDate>Thu, 06 Feb 2025 06:54:28 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>날짜 / 주차-누적 횟수: 2025.02.06(목) / 1주차-4회</p>
</li>
<li><p>사이트 이름: 프로그래머스</p>
</li>
<li><p>사용 언어: JavaScript</p>
</li>
<li><p>문제 고유 번호 및 레벨: 42862133025 / Lev 1</p>
</li>
<li><p>나의 풀이 방법: 풀지 못했음</p>
</li>
<li><p>최적 풀이 방법:</p>
<pre><code class="language-jsx">
  function solution(n, lost, reserve) {
      const students = {}; // students 객체를 생성한다.
      let answer = 0; // answer 변수를 생성한다.

      for(let i = 1; i &lt;= n; i++){ // 일반 for 문으로 1부터 학생수까지 순회한다.
          students[i] = 1; // students 객체에 key를 학생의 번호 value를 1로 넣는다. 
      }

      // 잃어버린 학생들 번호가 담긴 lost 배열을 순회한다. 
      // lost에 있는 요소를 students객체 key값으로 접근하고 있다면 -1을 한다. (value가 0이됨)
      lost.forEach(number =&gt; students[number] -= 1);

      // 여벌을 보유한 reserve 배열을 순회한다.
      // students객체에 해당 되는 번호에 +1을 한다 (2가 된다.)
      reserve.forEach(number =&gt; students[number] += 1);

          // for 문으로 학생수까지 순회한다.
      for(let i = 1; i &lt;= n; i++){
              // students객체의 value가 여러벌이고 students객체의 앞 번호가 체육복이 없으면
          if(students[i] === 2 &amp;&amp; students[i-1] === 0){
                          // 앞 번호에 +1을 더해준다.
                  students[i-1]++;
                  // 체육복을 주었으니 자신에게는 -1 해준다.
                  students[i]--;
            // 내가 2개가 있고 뒤에 잃어버렸으면? 
          } else if(students[i] === 2 &amp;&amp; students[i+1] === 0){
                                  // 뒤 사람에게 빌려주고
                  students[i+1]++;
                  // 나는 -1 
                  students[i]--;
          }
      }

      // key값대로 students 객체를 돈다. 
      for(let key in students){
              // 1보다 많은 경우
          if(students[key] &gt;= 1){
                  answer에 +1 
              answer++;
          }
      }
      return answer;
  }</code></pre>
<ul>
<li>주석으로 설명 적음</li>
</ul>
</li>
<li><p>배운 개념:</p>
<ul>
<li>하나씩 해결해야 되는 문제인 경우 객체를 활용하여 하나씩 하나씩 차근차근 풀어보자.</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] 모의고사(42840) - JavaScript 풀이]]></title>
            <link>https://velog.io/@jinny0_0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%AA%A8%EC%9D%98%EA%B3%A0%EC%82%AC-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8</link>
            <guid>https://velog.io/@jinny0_0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%AA%A8%EC%9D%98%EA%B3%A0%EC%82%AC-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8</guid>
            <pubDate>Thu, 06 Feb 2025 05:03:14 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>날짜 / 주차-누적 횟수: 2025.02.06(목) / 1주차-3회</p>
</li>
<li><p>사이트 이름: 프로그래머스</p>
</li>
<li><p>사용 언어: JavaScript</p>
</li>
<li><p>문제 고유 번호 및 레벨: 42840 / Lev 1</p>
</li>
<li><p>나의 풀이 방법:</p>
<pre><code class="language-jsx">  function solution(answers) {
      let answer = [];

      let oneAns = [1, 2, 3, 4, 5];
      let twoAns = [2, 1, 2, 3, 2, 4, 2, 5];
      let threeAns = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];

      let count = [0, 0, 0];

      answers.forEach((v, i) =&gt; {
          let index = i % oneAns.length;
          if (v === oneAns[index]) count[0]++;

</code></pre>
</li>
</ul>
<pre><code>        index = i % twoAns.length;
        if (v === twoAns[index]) count[1]++;

        index = i % threeAns.length;
        if (v === threeAns[index]) count[2]++;
        threeAns[index]
    })

    let max = Math.max(...count);

    if (count[0] === max) answer.push(1);
    if (count[1] === max) answer.push(2);
    if (count[2] === max) answer.push(3);

    return answer;
}
```

- </code></pre><ul>
<li><p>최적 풀이 방법:</p>
<pre><code class="language-jsx">  function solution(answers) {
      var answer = [];
      var a1 = [1, 2, 3, 4, 5];
      var a2 = [2, 1, 2, 3, 2, 4, 2, 5]
      var a3 = [ 3, 3, 1, 1, 2, 2, 4, 4, 5, 5];

      var a1c = answers.filter((a,i)=&gt; a === a1[i%a1.length]).length;
      var a2c = answers.filter((a,i)=&gt; a === a2[i%a2.length]).length;
      var a3c = answers.filter((a,i)=&gt; a === a3[i%a3.length]).length;
      var max = Math.max(a1c,a2c,a3c);

      if (a1c === max) {answer.push(1)};
      if (a2c === max) {answer.push(2)};
      if (a3c === max) {answer.push(3)};

      return answer;
  }
</code></pre>
<ul>
<li>answer빈 배열을 만든다.</li>
<li>a1, a2, a3각 배열에 찍는 돌리는 정답을 넣는다.</li>
<li>answer을 filter()로 검사하여 각 수포자가 몇 개 맞혔는지 계산한다.</li>
<li>Math.max로 최대값을 찾는다.</li>
<li>최대값을 가진 수포자들을 answer 배열에 저장 후 반환한다.</li>
</ul>
</li>
<li><p>배운 개념:</p>
<ul>
<li>Math.max()<ul>
<li>여러 개의 숫자를 인자로 받아서 최대값을 반환하는 함수이다.</li>
<li>배열을 직접 넣으면 배열은 숫자가 아니므로 NaN이 반환된다.</li>
<li>배열을 펼쳐서 숫자처럼 만들어주면 사용 가능하다. Math.max(…arr)</li>
</ul>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] H-Index(42747) - JavaScript 풀이]]></title>
            <link>https://velog.io/@jinny0_0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-H-Index-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8</link>
            <guid>https://velog.io/@jinny0_0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-H-Index-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8</guid>
            <pubDate>Thu, 06 Feb 2025 01:31:57 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>날짜 / 주차-누적 횟수: 2025.02.06(목) / 1주차-2회</p>
</li>
<li><p>사이트 이름: 프로그래머스</p>
</li>
<li><p>사용 언어: JavaScript</p>
</li>
<li><p>문제 고유 번호 및 레벨: 42747 / Lev 2</p>
</li>
<li><p>최적 풀이 방법:</p>
<pre><code class="language-jsx">  function solution(citations) {
      citations.sort((a, b) =&gt; b - a);

      for (let i = 0; i &lt; citations.length; i++) {
          if (i &gt;= citations[i]) return i;
      }

      return citations.length;</code></pre>
<ul>
<li>입력 받은 배열을 내림차순으로 정렬한다.</li>
<li>일반 for 문 반복문으로 입력받은 배열(각 논문의 인용 횟수)의 요소를 하나씩 순회한다.<ul>
<li>인덱스가 각 논문의 인용 횟수보다 크거나 같을 때 인덱스를 return 한다.</li>
</ul>
</li>
<li>결과가 없다면 입력 받은 배열의 길이를 return한다.<ul>
<li>for 문을 끝까지 돌았는데 i ≥ citations[i] 조건을 한 번도 만족하지 않았다면, 즉 모든 논문의 인용 횟수가 논문의 개수보다 많다면, 최대 h-index는 citations.lengh 가 된다.</li>
</ul>
</li>
</ul>
</li>
<li><p>배운 개념:</p>
<ul>
<li>생각보다 코드는 간단하다. 문제 이해가 중요하다.</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[코테 인증]]></title>
            <link>https://velog.io/@jinny0_0/%EC%BD%94%ED%85%8C-%EC%9D%B8%EC%A6%9D</link>
            <guid>https://velog.io/@jinny0_0/%EC%BD%94%ED%85%8C-%EC%9D%B8%EC%A6%9D</guid>
            <pubDate>Thu, 06 Feb 2025 01:02:47 GMT</pubDate>
            <description><![CDATA[<h1 id="코테인증-2차-스터디---1주차">코테인증 (2차 스터디 - 1주차)</h1>
<ul>
<li><p>날짜 / 주차-누적 횟수: 2025.02.06(목) / 1주차-1회</p>
</li>
<li><p>사이트 이름: 프로그래머스</p>
</li>
<li><p>사용 언어: JavaScript</p>
</li>
<li><p>문제 고유 번호 및 레벨: 42746 / Lev 2</p>
</li>
<li><p>참고 풀이 방법:</p>
<pre><code class="language-jsx">  fuction solution(numbers) {
      numbers.sort(a, b) =&gt; {
          const A = a + &#39;&#39;;
          const B = b + &#39;&#39;;

          const Ahead = A.charAt(0);
          const Bhead = B.charAt(0);

          if (Ahead &gt; Bhead) return -1;
          if (Ahead === Bhead) {
              const C = +(A + B);
              const D = +(B + A);
              if (C &gt; D) return - 1;
              if (C &lt; D) return 1;
          }
          if (Ahead &lt; Bhead) return 1;
      });

          return Math.max(...numbers) === 0 ? &quot;0&quot; : numbers.join(&#39;&#39;)l;</code></pre>
</li>
<li><p>최적 풀이 방법:</p>
<pre><code class="language-jsx">  fuction soluition(numbers) {
      let answer = numbers
          .map((v) =&gt; v + &#39;&#39;)
          .sort((a, b) =&gt; (b + a) * 1 - (a + b) * 1
          .join(&#39;&#39;);

      return answer[0] === &#39;0&#39; ? &#39;0&#39; : answer;
  }</code></pre>
<ul>
<li>.sort((a, b) =&gt; (b + a) * 1 - (a + b) * 1<ul>
<li>두 문자열을 이었을 때, 더 큰 쪽을 앞 쪽에 배치 (큰 숫자가 맨 앞에 간다)</li>
</ul>
</li>
</ul>
</li>
<li><p>배운 개념:</p>
<ul>
<li><p>charAt() 함수</p>
<ul>
<li><p>charAt은 문자열에서 지정된 위치에 존재하는 문자를 찾아서 반환하는 함수이다.</p>
</li>
<li><p>특징</p>
<ul>
<li>자바스크립트의 문자열 내의 문자는 왼쪽에서 오른쪽으로 인덱스가 매겨지는데 여기서 인덱스의 순번은 0부터 시작되고 마지막 인덱스 순번은 -1로 매겨진다.</li>
<li>인덱스가 문자열의 길이를 벗어나게 되면 빈 문자열을 반환한다.</li>
</ul>
</li>
<li><p>[문자열].charAt([문자 위치]);</p>
</li>
<li><p>e.g.</p>
<pre><code class="language-jsx">  let A = &#39;JavsScript&#39;;

  console.log(A.charAt(0)); // J출력
  console.log(A.charAt(A.length - 1)); // t출력</code></pre>
</li>
</ul>
</li>
<li><p>sort의 작동방식</p>
<ul>
<li>두 인자를 밸쌤 연산했을 때, 양수가 나오면 자리를 바꾼다고 생각하면 쉽다.<ul>
<li>a - b: 연산 결과가 0보다 크다는 것은 a가 b보다 크다는 것을 의미한다. 따라서 a가 b 보다 클 때만 자리를 바꾸고, 큰 수를 뒤로 보내는 것이기 때문에 오름차순으로 정렬을 수행한다.</li>
<li>b - a:  마찬가지로 b가 a보다 클 때만 0보다 커진다. 내림차순을 수행한다.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[2025.02.05(수) 코테습관스터디 목표달성률 및 KPT회고]]></title>
            <link>https://velog.io/@jinny0_0/2025.02.05%EC%88%98-%EC%BD%94%ED%85%8C%EC%8A%B5%EA%B4%80%EC%8A%A4%ED%84%B0%EB%94%94-%EB%AA%A9%ED%91%9C%EB%8B%AC%EC%84%B1%EB%A5%A0-%EB%B0%8F-KPT%ED%9A%8C%EA%B3%A0</link>
            <guid>https://velog.io/@jinny0_0/2025.02.05%EC%88%98-%EC%BD%94%ED%85%8C%EC%8A%B5%EA%B4%80%EC%8A%A4%ED%84%B0%EB%94%94-%EB%AA%A9%ED%91%9C%EB%8B%AC%EC%84%B1%EB%A5%A0-%EB%B0%8F-KPT%ED%9A%8C%EA%B3%A0</guid>
            <pubDate>Wed, 05 Feb 2025 08:26:58 GMT</pubDate>
            <description><![CDATA[<p>✅ 목표 [86% 달성]</p>
<ul>
<li><input checked="" disabled="" type="checkbox"> 타인 자소서 1회 첨삭</li>
<li><input checked="" disabled="" type="checkbox"> 내 자소서 첨삭할 부분 정리</li>
<li><input disabled="" type="checkbox"> 코딩테스트 문제 총 5문제 -&gt; 3문제 </li>
<li><input disabled="" type="checkbox"> SQL<ul>
<li><input checked="" disabled="" type="checkbox"> 실전 테스트 1문제 풀기</li>
<li><input disabled="" type="checkbox"> 어제 실전 테스트 풀었던 문제 다시 풀기 (복습)</li>
</ul>
</li>
<li><input disabled="" type="checkbox"> 알고리즘<ul>
<li><input disabled="" type="checkbox"> 문제 4문제</li>
<li><input disabled="" type="checkbox"> 코테 인증 2회 이상 -&gt; 0회</li>
<li><input disabled="" type="checkbox"> 힙 개념 공부<ul>
<li><input disabled="" type="checkbox"> 스텍/큐 2문제 풀기 -&gt; 정렬 1문제</li>
<li><input disabled="" type="checkbox"> 스텍/큐 - 코테 인증 1회 이상</li>
<li><input disabled="" type="checkbox"> 힙 개념 공부</li>
<li><input disabled="" type="checkbox"> 힙 문제 2 문제 풀기</li>
<li><input disabled="" type="checkbox"> 코테 인증 1회 이상</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>Keep</p>
<ul>
<li><p>자소서 피드백
소윤님과 히포님과 함께 소마 자소서 피드백을 진행했다. 함께 작성 마감 기한을 정해둔 덕분에 빠르게 마무리할 수 있었다.</p>
</li>
<li><p>SQL 문제 풀이
시간을 재며 함께 문제를 풀다 보니 모르는 개념을 빠르게 파악할 수 있었다.</p>
</li>
<li><p>컨디션과 시너지
컨디션이 좋지 않았지만, 오히려 SQL 문제를 함께 풀면서 시너지가 났다. 자소서 피드백도 마찬가지였다.</p>
</li>
<li><p>블로그 활용
KPT 회고를 블로그에 바로 정리하니 따로 옮길 필요가 없어 편리했다. (예전에는 노션에 적고 옮겼음)</p>
</li>
</ul>
<p>Problem</p>
<ul>
<li><p>시간 기록 부족
시간별 목표를 세우지 않다 보니 회고할 때 몇 시에 무엇을 했는지 파악하기 어려워 회고의 질이 떨어졌다. 또한 1시와 3시에 스터디원들과 함께 문제를 풀고 자소서 피드백을 한 시간을 계산하지 못하고 목표를 짰다.</p>
</li>
<li><p>조급한 마음
알고리즘 공부를 빨리 끝내야겠다는 조급함이 자꾸 몰려온다.</p>
</li>
<li><p>컨디션 저하와 수면 부족
어젯밤에 잠이 오지 않아 3시가 넘어서 잤고, 그 영향으로 하루 종일 피곤했다.</p>
</li>
</ul>
<p>Try</p>
<ul>
<li><p>함께하는 학습의 중요성 실감
스터디원들과 코딩테스트 문제를 함께 풀며 부족한 점을 빠르게 캐치하고, 17일 남은 소마 1차 코딩테스트에 반드시 합격할 수 있도록 대비할 것이다. 이후 일주일간 2차 코딩테스트 대비를 위해 집중 훈련할 계획이다.</p>
</li>
<li><p>시간별 목표 세우기
시간별로 다시 목표를 세워서 목표를 현실성 있게 작성하자.</p>
</li>
<li><p>알고리즘 인강 활용
문제풀이 중심의 알고리즘 인강을 결제했다. 조급함 마음을 이용하여 빠르게 듣고 실전 적용하여 내 것으로 만들자.인강 계획을 짜서 빠르게 들을 수 있게 목표를 잡자.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[필수 알고리즘 3 해시]]></title>
            <link>https://velog.io/@jinny0_0/%ED%95%84%EC%88%98-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-3-%ED%95%B4%EC%8B%9C</link>
            <guid>https://velog.io/@jinny0_0/%ED%95%84%EC%88%98-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-3-%ED%95%B4%EC%8B%9C</guid>
            <pubDate>Tue, 04 Feb 2025 02:26:23 GMT</pubDate>
            <description><![CDATA[<h1 id="해시hash-개념">해시(Hash) 개념</h1>
<ul>
<li>해시는 빠르게 데이터를 저장하고 검색할 수 있는 자료구조다.</li>
<li>Key-Value형태로 데이터를 저장하는데, 자바스크립트에서는 객체(Object) 또는 Map을 이용할 수 있다.</li>
</ul>
<p>프로그래머스 No.42577 전화번호 목록 문제를 해시 개념을 모르는채로 풀다보니 정확성은 나오는데 효율성에서 시간초과로 실패가 되었다.</p>
<hr>
<h2 id="❌-처음에-내가-짰던-코드-이중-반복문-on²">❌ 처음에 내가 짰던 코드 (이중 반복문, O(N²))</h2>
<p>처음에 내가 짰던 코드이다.</p>
<pre><code class="language-js">function solution(phone_book) {
    for (let i = 0; i &lt; phone_book.length; i++) {
        for (let j = 0; j &lt; phone_book.length; j++) {
            const a = phone_book[i];
            const b = phone_book[j];

            if ((a !== b) &amp;&amp; ((a === b.slice(0, a.length)) || (b === a.slice(0, b.length)))) return false;          
        }
    }
    return true;
}</code></pre>
<p>문제점: 이중 반복문을 사용했기 때문에 시간 복잡도 O(N2) -&gt; 입력 크기가 커지면서 비효율적! </p>
<h3 id="해시를-사용하면">해시를 사용하면?</h3>
<p>해시를 사용하면 <strong>검색을 빠르게 할 수 있어 효율적인 풀이</strong>가 가능하다.
접근 방법은 다음과 같다:</p>
<ol>
<li>모든 전화번호를 해시 테이블(객체)에 저장</li>
</ol>
<p>-&gt; 빠르게 검색하기 위해!
2. 각 번호의 접두사가 이미 해시 테이블에 있는지 확인
-&gt; 존재하며 false 반환!</p>
<hr>
<h2 id="해시를-사용한-최적화된-코드onm">해시를 사용한 최적화된 코드(O(NM))</h2>
<p>코드로 이해해보자.</p>
<pre><code class="language-js">function solution(phone_book) {
    const hash = {}; // 해시 테이블 생성

    // 1️⃣ 모든 번호를 해시 테이블에 저장
    for (const number of phone_book) {
        hash[number] = true; 
    }

    // 2️⃣ 각 번호의 접두사가 해시에 존재하는지 확인
    for (const number of phone_book) {
        let prefix = &quot;&quot;; // 접두사 초기화

        for (let i = 0; i &lt; number.length - 1; i++) { // 마지막 글자는 제외
            prefix += number[i]; // 접두사 한 글자씩 추가

            if (hash[prefix]) { // 접두사가 이미 해시에 있으면 false
                return false;
            }
        }
    }

    return true; // 접두사가 없으면 true
}</code></pre>
<hr>
<h3 id="🔍-코드-설명">🔍 코드 설명</h3>
<h4 id="1️⃣-해시테이블-생성-및-전화번호-저장">1️⃣ 해시테이블 생성 및 전화번호 저장</h4>
<pre><code class="language-js">const hash = {}; // 빈 해시 테이블 생성

for (const number of phone_book) {
    hash[number] = true;
}</code></pre>
<ul>
<li>전화번호를 해시 테이블에 저장해 빠른 검색을 가능하게 한다.</li>
<li>자바스크립트 객체(Object)를 활용하여 <strong>Key-Value 형태로 저장</strong>한다.</li>
</ul>
<p>[펼쳐보기] 객체를 저장하는 법을 모른다면? </p>
<p>객체(Object)는 Key-Value(키-값) 쌍으로 데이터를 저장하는 자료구조이다.</p>
<p>객체에서 데이터를 저장하는 기본적인 방법은 크게 두 가지가 있다.</p>
<h4 id="방법1-점-표기법-dot-notation">방법1. 점 표기법 (dot notation)</h4>
<blockquote>
<p>객체이름.키 = 값 형태로 저장! </p>
</blockquote>
<pre><code class="language-js">const person = {}; // 빈 객체 생성
person.name = &#39;지니&#39;; // key를 &#39;name&#39;으로 저장! value를 &#39;지니&#39;로 저장!
person.age = &#39;25&#39;; // key를 &#39;age&#39;로 저장! vlue를 25로 저장!</code></pre>
<p>이렇게 하였을 때, person 객체가 하면 결과가 {name: &#39;지니&#39;, age:25} 로 출력되는 것을 확인할 수 있다.</p>
<p>또한 객체 key 값을 출력하면 다음과 같은 결과가 나온다.</p>
<pre><code class="language-js">console.log(person.name); // &#39;지니&#39;
console.log(person.age); // 25</code></pre>
<hr>
<h4 id="방법2-대괄호-표기법-bracket-notation">방법2. 대괄호 표기법 (bracket notation)</h4>
<pre><code class="language-js">const person = {}; // 빈 객체 생성
person[&#39;name&#39;] = &#39;지니&#39;; // key를 &#39;name&#39;으로 저장! value를 &#39;지니&#39;로 저장!
person[&#39;age&#39;]  = 25; // key를 &#39;age&#39;로 저장! value를 25로 저장</code></pre>
<p>객체이름[&#39;키&#39;] = 값 의 형태로 저장하는 방법이다.</p>
<hr>
<p>다시 문제 코드로 살펴보자.</p>
<pre><code class="language-js">for (const number of phone_book) {
        hash[number] = true; 
}</code></pre>
<p>phone_book배열을 하나씩 돌면서 hash[번호] = true
-&gt; 번호들을 true 값으로 먼저 저장을 해준다. </p>
<hr>
<h2 id="2️⃣-접두사-검사">2️⃣ 접두사 검사</h2>
<pre><code class="language-js">for (const number of phone_book) {
        let prefix = &quot;&quot;; // 접두사 초기화

        for (let i = 0; i &lt; number.length - 1; i++) { // 마지막 글자는 제외
            prefix += number[i]; // 접두사 한 글자씩 추가

            if (hash[prefix]) { // 접두사가 이미 해시에 있으면 false
                return false;
            }
        }
    }</code></pre>
<ul>
<li>각 전화번호를 하나씩 가져와 한 글자씩 접두사를 만들어 간다.</li>
<li>만든 접두사가 해시 테이블에 존재한다면? </li>
<li><blockquote>
<p>이미 저장된 전화번호 접두사임을 의미하므로 false 를 반환한다. </p>
</blockquote>
</li>
</ul>
<hr>
<h2 id="3️⃣-접두사가-없을-경우-true-반환">3️⃣ 접두사가 없을 경우 true 반환</h2>
<pre><code class="language-js">return true;</code></pre>
<ul>
<li>모든 번호를 확인했는데 접두사가 발견되지 않으면 true 반환한다.</li>
</ul>
<ol start="3">
<li>접두사가 없다면 true 를 return 한다. </li>
</ol>
<hr>
<h2 id="🔥-시간-복잡도-비교">🔥 시간 복잡도 비교</h2>
<ul>
<li>❌ 이중 반복문 (내 코드)    O(N²) -&gt; (시간 초과 발생 🚨)</li>
<li>✅ 해시 테이블 활용    O(NM) -&gt; (효율성 통과 ✅)</li>
</ul>
<hr>
<h2 id="🎯-정리">🎯 정리</h2>
<ol>
<li>해시는 빠른 검색(O(1))이 가능한 구조</li>
<li>전화번호를 해시 테이블에 저장하면 빠르게 검색 가능</li>
<li>이중 반복문을 해시로 개선하면 효율성 통과 </li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[2차 코딩습관 스터디 전체 목표]]></title>
            <link>https://velog.io/@jinny0_0/2%EC%B0%A8-%EC%BD%94%EB%94%A9%EC%8A%B5%EA%B4%80-%EC%8A%A4%ED%84%B0%EB%94%94-%EC%A0%84%EC%B2%B4-%EB%AA%A9%ED%91%9C</link>
            <guid>https://velog.io/@jinny0_0/2%EC%B0%A8-%EC%BD%94%EB%94%A9%EC%8A%B5%EA%B4%80-%EC%8A%A4%ED%84%B0%EB%94%94-%EC%A0%84%EC%B2%B4-%EB%AA%A9%ED%91%9C</guid>
            <pubDate>Mon, 03 Feb 2025 15:59:25 GMT</pubDate>
            <description><![CDATA[<h1 id="5주간의-전체-목표">5주간의 전체 목표</h1>
<h2 id="📌-1차-2차-코딩테스트-대비-5주-학습-계획"><strong>📌 1차, 2차 코딩테스트 대비 5주 학습 계획</strong></h2>
<h3 id="🗓️-5주간-일정"><strong>🗓️ 5주간 일정</strong></h3>
<ul>
<li><strong>1주차:</strong> 2월 3일 (월) ~ 2월 7일 (금)</li>
<li><strong>2주차:</strong> 2월 10일 (월) ~ 2월 14일 (금)</li>
<li><strong>3주차:</strong> 2월 17일 (월) ~ 2월 21일 (금)</li>
<li><strong>4주차:</strong> 2월 24일 (월) ~ 2월 28일 (금)</li>
<li><strong>5주차:</strong> 3월 3일 (월) ~ 3월 7일 (금)</li>
</ul>
<hr>
<h2 id="🎯-5주간의-목표"><strong>🎯 5주간의 목표</strong></h2>
<h3 id="✅-알고리즘"><strong>✅ 알고리즘</strong></h3>
<ul>
<li>프로그래머스 <strong>코딩테스트 고득점 KIT</strong> 필수 알고리즘 10개 유형 문제 <strong>모두 풀이 (총 47문제)</strong></li>
</ul>
<h3 id="✅-sql"><strong>✅ SQL</strong></h3>
<ul>
<li>프로그래머스 고득점 Kit <strong>남은 문제(28문제) 마무리</strong></li>
<li>복습 계획 수립 후 <strong>실전 문제 풀이 및 스터디 진행</strong></li>
</ul>
<hr>
<h2 id="📌-13주차-1차-코딩테스트-대비"><strong>📌 1~3주차 (1차 코딩테스트 대비)</strong></h2>
<h3 id="✅-week-1-2월-3일--2월-7일"><strong>✅ Week 1 (2월 3일 ~ 2월 7일)</strong></h3>
<h4 id="알고리즘-자료구조--정렬"><strong>알고리즘:</strong> 자료구조 + 정렬</h4>
<ul>
<li><strong>해시:</strong> 5문제 (중)</li>
<li><strong>스택/큐:</strong> 6문제 (하)</li>
<li><strong>힙:</strong> 3문제 (하)</li>
<li><strong>정렬:</strong> 3문제 (하)<h4 id="sql-프로그래머스-고득점-kit-한-사이클-돌리기-주말-이용하여-마무리하기"><strong>SQL:</strong> 프로그래머스 고득점 Kit 한 사이클 돌리기 (주말 이용하여 마무리하기)</h4>
</li>
</ul>
<h3 id="✅-week-2-2월-10일--2월-14일"><strong>✅ Week 2 (2월 10일 ~ 2월 14일)</strong></h3>
<h4 id="알고리즘-완전탐색--그리디--정렬-응용"><strong>알고리즘:</strong> 완전탐색 + 그리디 + 정렬 응용</h4>
<ul>
<li><strong>완전탐색:</strong> 7문제 (상)</li>
<li><strong>그리디:</strong> 6문제 (상)<h4 id="sql-즐겨-찾기-중심으로-복습"><strong>SQL:</strong> 즐겨 찾기 중심으로 복습</h4>
</li>
</ul>
<h3 id="✅-week-3-2월-17일--2월-21일"><strong>✅ Week 3 (2월 17일 ~ 2월 21일)</strong></h3>
<h4 id="알고리즘-dfsbfs--종합-연습모의-테스트"><strong>알고리즘:</strong> DFS/BFS + 종합 연습(모의 테스트)</h4>
<ul>
<li><strong>DFS/BFS:</strong> 7문제 (상)<h4 id="sql-실전-문제-풀이-및-스터디-진행"><strong>SQL:</strong> 실전 문제 풀이 및 스터디 진행</h4>
</li>
</ul>
<hr>
<h2 id="📌-45주차-2차-코딩테스트-대비"><strong>📌 4~5주차 (2차 코딩테스트 대비)</strong></h2>
<h3 id="✅-week-4-2월-24일--2월-28일"><strong>✅ Week 4 (2월 24일 ~ 2월 28일)</strong></h3>
<h4 id="알고리즘-동적-계획법dp-이분탐색"><strong>알고리즘:</strong> 동적 계획법(DP), 이분탐색</h4>
<ul>
<li><strong>동적 계획법(DP):</strong> 5문제 (상)</li>
<li><strong>이분탐색:</strong> 2문제 (상)</li>
</ul>
<h3 id="✅-week-5-3월-3일--3월-7일"><strong>✅ Week 5 (3월 3일 ~ 3월 7일)</strong></h3>
<h4 id="알고리즘-그래프-심화최단-경로-mst-위상-정렬-등--종합-모의-테스트"><strong>알고리즘:</strong> 그래프 심화(최단 경로, MST, 위상 정렬 등) + 종합 모의 테스트</h4>
<ul>
<li><strong>그래프:</strong> 3문제 (상)</li>
</ul>
<hr>
<h1 id="📌-1주차-2월-3일--2월-7일-상세-목표"><strong>📌 1주차 (2월 3일 ~ 2월 7일) 상세 목표</strong></h1>
<h3 id="✅-1일차-화-데일리-목표"><strong>✅ 1일차 (화) 데일리 목표</strong></h3>
<p>📌 <strong>목표: 해시 &amp; 스택/큐 개념 이해 + 쉬운 문제 풀이</strong></p>
<ul>
<li><strong>해시 2문제 (중)</strong></li>
<li><strong>스택/큐 3문제 (하)</strong></li>
</ul>
<h3 id="🕘-오전-모각공"><strong>🕘 오전 모각공</strong></h3>
<ul>
<li><strong>9시:</strong> 해시(Hash) 개념 학습 (이론 + 예제 코드)</li>
<li><strong>10시:</strong> 해시 문제 풀이 + 코테 인증</li>
<li><strong>11시:</strong> 해시 문제 풀이 + 코테 인증</li>
</ul>
<h3 id="🌞-오후-모각공"><strong>🌞 오후 모각공</strong></h3>
<ul>
<li><strong>12시 30분:</strong> 스택/큐 개념 학습 (이론 + 자료구조 동작 방식 이해)</li>
<li><strong>13시:</strong> 스택/큐 문제 풀이 + 코테 인증</li>
<li><strong>14시:</strong> 스택/큐 문제 풀이 + 코테 인증</li>
<li><strong>15시 - 16시:</strong> SQL 코테 함께 풀기 (with 소윤)</li>
<li><strong>17시:</strong> KPT 회고 작성</li>
</ul>
<hr>
<h2 id="🎯-1주차-목표-정리"><strong>🎯 1주차 목표 정리</strong></h2>
<p>✅ <strong>해시(5문제) + 스택/큐(6문제) + 힙(3문제) + 정렬(3문제) 완벽하게 풀이</strong>
✅ <strong>각 자료구조의 개념 &amp; 구현 방법 &amp; 시간 복잡도 정리</strong>
✅ <strong>마지막 날 모의 테스트로 실전 감각 익히기</strong></p>
<hr>
<p>🔥 <strong>꾸준한 학습과 KPT 회고를 통해 목표를 달성하자!</strong> 🔥</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2025.02.03(월) 코딩습관스터디 KPT회고]]></title>
            <link>https://velog.io/@jinny0_0/2025.02.03%EC%9B%94-%EC%BD%94%EB%94%A9%EC%8A%B5%EA%B4%80%EC%8A%A4%ED%84%B0%EB%94%94-KPT%ED%9A%8C%EA%B3%A0</link>
            <guid>https://velog.io/@jinny0_0/2025.02.03%EC%9B%94-%EC%BD%94%EB%94%A9%EC%8A%B5%EA%B4%80%EC%8A%A4%ED%84%B0%EB%94%94-KPT%ED%9A%8C%EA%B3%A0</guid>
            <pubDate>Mon, 03 Feb 2025 08:24:20 GMT</pubDate>
            <description><![CDATA[<h1 id="모각코-회고">모각코 회고</h1>
<h2 id="📊-목표-달성률">📊 목표 달성률</h2>
<ul>
<li><input disabled="" type="checkbox"> SQL 20문제 풀기 (34문제 남음) → 8문제 완료  </li>
<li><input disabled="" type="checkbox"> 알고리즘 5문제 풀기 (SQL 문제로 대체 가능)  </li>
</ul>
<p>총 25문제 중 <strong>8문제</strong> 해결 → <strong>32% 달성</strong>  </p>
<hr>
<h3 id="✅-keep-잘한-점">✅ Keep (잘한 점)</h3>
<ul>
<li>SQL 문제 풀이 속도가 점점 빨라지고 있다.  </li>
</ul>
<hr>
<h3 id="❗-problem-아쉬운-점">❗ Problem (아쉬운 점)</h3>
<ul>
<li>오전에는 스터디 운영 정책을 수정하느라 공부 시간이 부족했다.  </li>
<li>SQL에서 어려운 개념을 정리하지 않고 문제 풀이에만 집중했다.  </li>
</ul>
<hr>
<h3 id="🔄-try-개선할-점">🔄 Try (개선할 점)</h3>
<ul>
<li><strong>스터디 운영 관련 업무는 모각공 시간에 하지 않기</strong>  <ul>
<li>앞으로는 스터디 외 시간에 운영 관련 업무를 할애할 것.  </li>
</ul>
</li>
<li><strong>SQL 개념 정리의 중요성을 명확히 인식하기</strong>  <ul>
<li>모르는 개념을 정리하는 것이 장기적으로 더 효율적인 공부법임을 인지하고 실천하기.  </li>
</ul>
</li>
</ul>
<hr>
<p>SQL 개념 정리와 문제 풀이의 균형을 맞춰야겠다는 점을 다시금 느꼈다.<br>내일은 개념 정리에도 시간을 투자하며 더 효율적으로 공부해보자! 🚀</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[코테 습관 스터디 운영]]></title>
            <link>https://velog.io/@jinny0_0/%EC%BD%94%ED%85%8C-%EC%8A%B5%EA%B4%80-%EC%8A%A4%ED%84%B0%EB%94%94-%EC%9A%B4%EC%98%81</link>
            <guid>https://velog.io/@jinny0_0/%EC%BD%94%ED%85%8C-%EC%8A%B5%EA%B4%80-%EC%8A%A4%ED%84%B0%EB%94%94-%EC%9A%B4%EC%98%81</guid>
            <pubDate>Fri, 17 Jan 2025 07:06:38 GMT</pubDate>
            <description><![CDATA[<h1 id="코테-습관-스터디">코테 습관 스터디</h1>
<h3 id="전체-일정">전체 일정</h3>
<hr>
<p>총: 16일 </p>
<ul>
<li>1주차: [1일간] 1월 3일 (금)</li>
<li>2주차: [5일간] 1월 6일 (월) ~ 1월 10일 (금)</li>
<li>3주차: [5일간] 1월 13일 (월) ~ 1월 17일(금)</li>
<li>4주차: [5일간] 1월 20일 (월) ~ 1월 27일(금)</li>
</ul>
<h3 id="데일리-루틴">데일리 루틴</h3>
<hr>
<p><strong>🌅 오전 루틴</strong></p>
<ul>
<li><strong>9:00 ~ 9:20</strong>: <strong>목표 나누기</strong><ul>
<li><strong>사전 준비</strong>: 디스코드 <strong>#목표-회고</strong> 채널에 <strong>9:00까지</strong> 데일리 목표 올리기</li>
<li><strong>장소</strong>: 게더타운 미팅룸</li>
<li><strong>고려 사항</strong>:<ul>
<li>목표는 최대한 <strong>수치화</strong>하여 달성 여부를 체크할 수 있도록 설정</li>
<li>월요일: 한 주의 목표와 데일리 목표 함께 공유</li>
<li>금요일: 한 주 목표 달성률 및 데일리 목표 달성률 함께 공유</li>
</ul>
</li>
</ul>
</li>
<li><strong>9:20 ~ 12:00</strong>: <strong>모각공 (모여서 각자 공부)</strong><ul>
<li><strong>장소</strong>: 게더타운 오피스룸</li>
<li><strong>고려 사항</strong>:<ul>
<li>잠깐 화장실을 다녀오는 등의 작은 이동은 자유롭게<ul>
<li>서로의 신뢰를 위해, 다녀올 때 간단하게 사유를 채팅방에 올리고, 돌아와서도 간단하게 채팅방에 돌아옴을 이야기하기</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<p><strong>☀️ 쉬는 시간</strong></p>
<ul>
<li><strong>12:00 ~ 13:00</strong>: <strong>점심 시간 (자유 시간)</strong></li>
<li><strong>13:00 ~ 14:00</strong>: <strong>선택 모각공</strong><ul>
<li>원할 경우, 선택적으로 참여</li>
</ul>
</li>
</ul>
<hr>
<p><strong>🌇 오후 루틴</strong></p>
<ul>
<li><strong>14:00 ~ 17:30</strong>: <strong>모각공</strong><ul>
<li><strong>장소</strong>: 게더타운 오피스룸</li>
</ul>
</li>
<li><strong>17:30 ~ 18:00</strong>: <strong>하루 공부 KPT 회고 나누기</strong><ul>
<li><strong>사전 준비</strong>: <strong>17:30 전까지</strong> 디스코드 <strong>#목표-회고</strong> 채널에 당일 목표 달성률 및 회고 작성</li>
<li><strong>장소</strong>: 게더타운 오피스룸</li>
<li><strong>고려사항:</strong><ul>
<li>금요일: 한 주 KPT 함께 데일리 KPT와 공유</li>
</ul>
</li>
</ul>
</li>
</ul>
<hr>
<h3 id="🗓-주간-회고-진행-방법"><strong>🗓 주간 회고 진행 방법</strong></h3>
<ol>
<li><p><strong>주간 회고 업로드</strong></p>
<p> 각 스터디원은 <strong>데일리 목표 달성률</strong>, <strong>주간 목표 달성률</strong>, 그리고 <strong>주간 KPT 회고</strong>를 작성하여 <strong>디스코드 회고 채널에 금요일 오후 5시까지 업로드</strong>합니다.</p>
</li>
<li><p><strong>타임 키퍼 및 피드백 선정</strong></p>
<ul>
<li><strong>회고 리더</strong>가 <strong>타임 키퍼</strong>를 선정하여 시간 관리를 맡깁니다.</li>
<li>타임 키퍼는 <strong>타이머를 화면 공유</strong>하여 모든 스터디원들이 시간을 준수할 수 있게 도와줍니다.</li>
<li><strong>회고 리더</strong>는 <strong>피드백 대상자</strong>를 랜덤으로 지정하여 효율적인 진행을 도모합니다.</li>
</ul>
</li>
<li><p><strong>주간 회고 발표</strong></p>
<p> 각 스터디원이 자신의 회고 내용을 발표합니다.</p>
<ul>
<li>발표 시간: <strong>5분</strong></li>
<li>발표 내용:<ul>
<li>데일리 목표 달성률</li>
<li>주간 목표 달성률</li>
<li>주간 KPT 회고</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>격려 및 피드백</strong></p>
<p> 발표 후, 스터디원들이 격려와 건설적인 피드백을 제공합니다.</p>
<ul>
<li><p><strong>격려 피드백</strong>: 발표자의 성과와 노력을 칭찬하며 동기를 북돋습니다.</p>
</li>
<li><p><strong>건설적인 피드백</strong>: 더 나은 성장을 위한 개선 방향과 보완점을 제안합니다.</p>
</li>
<li><p>피드백 시간: <strong>1인당 최대 3분</strong></p>
</li>
<li><p>총 피드백 시간: <strong>발표자당 6분</strong> (2명 피드백 기준)</p>
</li>
<li><p>피드백 담당이 아닌 스터디원들도 발표에 집중하며, 채팅이나 이모티콘 등 다양한 방법으로 최소 한 마디 이상의 격려를 전해 발표 분위기를 긍정적으로 이끌도록 노력합니다.</p>
</li>
<li><p><em>⏳ 시간 배분 안내*</em></p>
</li>
<li><p><strong>1인당 소요 시간</strong></p>
<ul>
<li>발표 5분 + 피드백 6분 = 총 <strong>11분</strong></li>
</ul>
</li>
<li><p><strong>총 소요 시간 예시</strong></p>
<ul>
<li>5명 발표 시: 11분 × 5명 = <strong>55분</strong></li>
</ul>
</li>
</ul>
</li>
</ol>
<hr>
<h3 id="상벌점-제도">상벌점 제도</h3>
<hr>
<p><strong>🏅 상점</strong></p>
<table>
<thead>
<tr>
<th><strong>항목</strong></th>
<th><strong>상점</strong></th>
</tr>
</thead>
<tbody><tr>
<td><strong>오전/오후 모각공 지각 없이 전체 참여 (한 주 기준)</strong></td>
<td>+2점</td>
</tr>
<tr>
<td><strong>코딩테스트 인증 20개 이상 (한 주 기준)</strong></td>
<td>+1점</td>
</tr>
<tr>
<td><strong>운동 인증 주 5회 이상 (15분 이상, 사진 포함)</strong></td>
<td>+1점</td>
</tr>
<tr>
<td><strong>금요일에 일주일 회고 이후, 회고왕 투표 (최다 투표 선정)</strong></td>
<td>+1점</td>
</tr>
<tr>
<td>- <strong>운동 인증 방법</strong>: 디스코드 <strong>#-운동-인증 채널</strong>에 사진과 함께 업로드</td>
<td></td>
</tr>
<tr>
<td>- <strong>코테 인증 방법</strong>: 디스코드 <strong>#코테-인증 채널</strong>에 양식대로 업로드</td>
<td></td>
</tr>
<tr>
<td>- <strong>주간 회고왕 투표:</strong> <a href="https://koreanbots.dev/bots/1020332558073987102">익명 투표 프로그램 사용</a></td>
<td></td>
</tr>
</tbody></table>
<hr>
<p><strong>⚠️ 벌점</strong></p>
<table>
<thead>
<tr>
<th><strong>항목</strong></th>
<th><strong>벌점</strong></th>
</tr>
</thead>
<tbody><tr>
<td><strong>스터디 무단 결석 (오전/오후 각각)</strong></td>
<td>-2점</td>
</tr>
<tr>
<td><strong>스터디 당일 통보 불참 (오전/오후 각각)</strong></td>
<td>-1.5점</td>
</tr>
<tr>
<td><strong>스터디 사유 결근 (오전/오후 각각, 한 주 기준 - 5회 부터 적용)</strong></td>
<td>-1점</td>
</tr>
<tr>
<td><strong>스터디 리더 역할 미수행</strong></td>
<td>-2점</td>
</tr>
<tr>
<td><strong>KPT 회고 미업로드 (17:30까지)</strong></td>
<td>-1점</td>
</tr>
<tr>
<td>모각공 허위 출석 발각 시 (없어질 가능성 있음)</td>
<td>-5점</td>
</tr>
<tr>
<td><strong>스터디 무단 불참 + 연락 두절</strong></td>
<td><strong>강제 퇴장</strong></td>
</tr>
<tr>
<td><strong>스터디원 다수 의견으로 &#39;함께하기 힘들다&#39;는 경우</strong></td>
<td><strong>강제 퇴장</strong></td>
</tr>
</tbody></table>
<hr>
<p><strong>⏰ 지각 및 결석 기준</strong></p>
<ul>
<li><strong>기준:</strong> 아래 2가지가 충족이 되어야 함</li>
<li>***1) 디스코드 # 목표-회고 채널에 9:00정시까지 목표 업로드 2) 디스코드 회의실에 캠을 켜서 회고 미팅바로 할 수 있는 준비</li>
<li><strong>지각</strong>: 스터디 시작 <strong>정시</strong> 이후 (9:01 ~ 9:15)</li>
<li><strong>결석</strong>: 스터디 시작 <strong>15분</strong> 이후 (9:16~)</li>
<li><strong>지각 3회</strong> = 결석 1회 (2회까지는 영향 없음)</li>
</ul>
<hr>
<p><strong>✅ 사유 결근</strong></p>
<table>
<thead>
<tr>
<th><strong>항목</strong></th>
<th><strong>적용 기준</strong></th>
</tr>
</thead>
<tbody><tr>
<td>보고 방법</td>
<td>디스코드 <strong>#-사유-결근 채널</strong>에 양식에 맞춰  전날 <strong>23:59</strong> 이전 보고</td>
</tr>
<tr>
<td><strong>사유 결근 예외</strong></td>
<td>가족 조사 사유 시 제외</td>
</tr>
<tr>
<td><strong>사유 결근 최대 가능 횟수</strong></td>
<td>주 4회 (오전/오후 각각)</td>
</tr>
<tr>
<td>- <strong>사유 결근 미보고 시</strong>: 당일 통보 또는 무단 결근으로 간주</td>
<td></td>
</tr>
</tbody></table>
<hr>
<p><strong>🚨 경고 및 퇴출 기준</strong></p>
<table>
<thead>
<tr>
<th><strong>벌점</strong></th>
<th><strong>조치</strong></th>
</tr>
</thead>
<tbody><tr>
<td><strong>5점</strong></td>
<td>경고 (커피 쏘기)</td>
</tr>
<tr>
<td><strong>10점</strong></td>
<td>퇴출</td>
</tr>
</tbody></table>
<h3 id="각-스터디원-역할-특히-피드백-많이-필요">각 스터디원 역할 (특히 피드백 많이 필요!)</h3>
<hr>
<table>
<thead>
<tr>
<th><strong>리더 역할</strong></th>
<th><strong>주요 업무</strong></th>
</tr>
</thead>
<tbody><tr>
<td><strong>스터디 전체 리더</strong></td>
<td>1. 스터디 시트 관리 및 현황 체크<br>2. 역할 미수행 리더 벌점 관리</td>
</tr>
<tr>
<td><strong>오전 모각공 리더</strong></td>
<td>1. 오전 출석 체크 (구글 시트)<br>2. 목표 나눔 진행<br>3. 12:00에 오전 모각공 끝남 알림 채팅<br>4. 그 주의 사유 결근 4회 이내 체크</td>
</tr>
<tr>
<td><strong>오후 모각공 리더</strong></td>
<td>1. 오후 출석 체크 (구글 시트)<br>(그 주의 사유 결근 4회 이내 체크)<br>2. 17:30 기준 회고 미업로드 시 벌점 체크<br>3. 회고 나눔 진행<br>4. 18:00에 오후 모각공 끝남 알림 채팅</td>
</tr>
<tr>
<td><strong>인증 리더</strong></td>
<td>1. 코테 인증 관리 (상점 부여)<br>2. 운동 인증 관리 (상점 부여)<br>3. 주간 전체 모각공 참여 (상점 부여)<br>(지각 허용 X, 사유 결근 허용 X)<br><br>* 기준 일자: 일요일 11:59까지<br>* 해당 주차의 인증 관련한 상점을 해당 주차 일요일 자정 이후 ~ 차주 월요일 9:00 전까지 상점 부여</td>
</tr>
<tr>
<td><strong>격려, 동기부여 리더</strong></td>
<td>1. 서로 격려를 할 수 있는 분위기를 조성<br>2. 함께 동기부여를 할 수 있는 분위기 조성 (한 주 동안 자신만의 방법으로 팀원들의 동기부여를 책임)<br><br>e.g. 매일 동기부여가 되는 글귀 업로드 등, 1-2시 선택 모각공을 참여 독려, 아침 기상 독려, 미라클 모닝 기획, 일정 리마인드 등</td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스터디 회고] 1월 2주차 KPT 회고 & 목표 달성률 분석]]></title>
            <link>https://velog.io/@jinny0_0/%EC%8A%A4%ED%84%B0%EB%94%94-2%EC%A3%BC%EC%B0%A8-%EC%A3%BC%EA%B0%84-KPT%ED%9A%8C%EA%B3%A0</link>
            <guid>https://velog.io/@jinny0_0/%EC%8A%A4%ED%84%B0%EB%94%94-2%EC%A3%BC%EC%B0%A8-%EC%A3%BC%EA%B0%84-KPT%ED%9A%8C%EA%B3%A0</guid>
            <pubDate>Fri, 17 Jan 2025 07:04:30 GMT</pubDate>
            <description><![CDATA[<h2 id="2주차-주간-회고">2주차 주간 회고</h2>
<p>(- 2주차: [5일간] 1월 6일 (월) ~ 1월 10일 (금))</p>
<p>총: 16일 </p>
<ul>
<li><p>1주차: [1일간] 1월 3일 (금)</p>
</li>
<li><p>3주차: [5일간] 1월 13일 (월) ~ 1월 17일(금)</p>
</li>
<li><p>4주차: [5일간] 1월 20일 (월) ~ 1월 27일(금)</p>
</li>
</ul>
<h3 id="🎯목표-달성률-104">🎯목표 달성률: <strong>104%</strong></h3>
<ol>
<li>코테문제: <strong>89%</strong> (8문제 / 9문제)</li>
<li>알고리즘 공부하고 정리: 90% (해시)<ul>
<li>벨로그 업로드는 안해서 20% 감소시킴</li>
</ul>
</li>
<li>코테 문제 올리기: 133% (4문제 / 3문제)  </li>
</ol>
<h3 id="💡kpt회고">💡KPT회고</h3>
<p><em>Keep</em></p>
<ol>
<li>오늘은 해시 공부를 했다. 알고리즘 공부를 하니 문제를 접근하는 방식이 더 효율적으로 되고 있다.</li>
<li>오전에 두유를 먹으니 서서히 집중력이 올라왔다. </li>
<li>졸려서 잠깐 집안일을 조금이라도 했다. 그러니깐 졸음이 없어졌다. </li>
</ol>
<p><em>Problem</em></p>
<ol>
<li>모각공 시간에 자꾸 벨로그에 업로드 하는 것을 놓친다. 이때 안하면 이후에도 안하게 된다.</li>
<li>여행을 3박 4일을 너무 잘 쉬다보니 다시 집중하는게 조금 어려워졌다. </li>
<li>레벨 2를 풀다보니 문제가 길어진다. 문제를 한 번에 바로 이해하는 것이 어려운 문제도 생기고 있다. 모각공 시간에 해결 못한 2문제가 있다. </li>
</ol>
<p><em>Try</em></p>
<ol>
<li>모각공 시간에 코테 인증 올리는 것 만큼은 벨로그에 그때 그때 바로 올리자.</li>
<li>아침에는 최소 두유라도 먹어주자.</li>
<li>공부 모드로 빨리 전환하자. 오늘 이후에도 코테 문제 3문제 이상은 풀자.</li>
<li>모각공 시간에 해결 못한 2문제 오늘 내로 마무리해서 이것도 벨로그에 올리자.</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Programmers] 최소직사각형]]></title>
            <link>https://velog.io/@jinny0_0/%EC%B5%9C%EC%86%8C%EC%A7%81%EC%82%AC%EA%B0%81%ED%98%95</link>
            <guid>https://velog.io/@jinny0_0/%EC%B5%9C%EC%86%8C%EC%A7%81%EC%82%AC%EA%B0%81%ED%98%95</guid>
            <pubDate>Fri, 17 Jan 2025 06:47:57 GMT</pubDate>
            <description><![CDATA[<h3 id="최소직사각형">최소직사각형</h3>
<ul>
<li><p>날짜 / 주차-누적 횟수: 2025.01.16(목) / 3주차-4회</p>
</li>
<li><p>사이트 이름: 프로그래머스</p>
</li>
<li><p>사용 언어: 자바스크립트</p>
</li>
<li><p>문제 고유 번호 및 레벨: 86491 / Lev 1</p>
</li>
<li><p>최적 풀이 방법:</p>
<pre><code class="language-jsx">
  const solution = (sizes) =&gt; {
      // 가로 길이와 세로 길이를 담을 배열 w, h
      let w = [];
      let h = [];
      // 이차원 배열의 큰 값과 작은 값을 구분해서 큰 값은 w, 작은 값은 h에 넣어줍니다.
      sizes.map((v,i) =&gt; {
        w[i]=Math.max(...v)
        h[i]=Math.min(...v)
      })
      // w 와 h 에서 서로 가장 큰 값을 곱하면 끝
      return Math.max(...w)*Math.max(...h);
    }
</code></pre>
<ul>
<li>가로 길이와 세로 길이를 담을 두 배열을 만든다.</li>
<li>map을 활용하여 요소 중 큰 값은 w에 작은 값은 h배열에 넣는다.</li>
<li>각 배열에 서로 다른 큰 값을 곱한다.</li>
</ul>
</li>
<li><p>배운 개념:</p>
<ul>
<li>map으로 각각 2배열에 값을 넣는 방법도 효율적이다.</li>
<li>Math.max() / Math.min()이 기억이 안나서 3분 정도 소요했다. 기억하자.</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Programmers] 예산]]></title>
            <link>https://velog.io/@jinny0_0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%98%88%EC%82%B0</link>
            <guid>https://velog.io/@jinny0_0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%98%88%EC%82%B0</guid>
            <pubDate>Fri, 17 Jan 2025 06:47:39 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>날짜 / 주차-누적 횟수: 2025.01.16(목) / 3주차-3회</p>
</li>
<li><p>사이트 이름: 프로그래머스</p>
</li>
<li><p>사용 언어: 자바스크립트</p>
</li>
<li><p>문제 고유 번호 및 레벨: 12982 / Lev 1</p>
</li>
<li><p>나의 풀이 방법:</p>
<pre><code class="language-jsx">  function solution(d, budget) {
      let left = budget;
      let count = 0;

      let dSorted = d.sort((a, b) =&gt; a - b);

      for (let i = 0; i &lt; dSorted.length; i++) {
          if (dSorted[i] &lt;= left) {
              left -= dSorted[i];
              count++;
          }
      } 

      return count;
  }</code></pre>
<ul>
<li>오름차순으로 배열을 정렬한다.</li>
<li>일반 for 문을 활용하여 예산과 현재 요청 금액을 빼서 count로 횟수 더한다.</li>
</ul>
</li>
<li><p>최적 풀이 방법:</p>
<pre><code class="language-jsx">
  function solution(d, budget) {
      return d.sort((a, b) =&gt; a - b).reduce((count, price) =&gt; {
          return count + ((budget -= price) &gt;= 0);
      }, 0);
  }
</code></pre>
<ul>
<li>d배열을 오름차순으로 정렬한다.</li>
<li>reduce((count, price) ⇒ {…}, 0)<ul>
<li>배열을 순회하며, 각 부서에 예산을 배분하면서 몇 개의 부서에 지원했는지 세는 동작을 수행한다.</li>
<li>누적값 count, 현재값 price를 사용한다.</li>
<li>초기값으로 0을 설정한다.</li>
</ul>
</li>
<li>budget -= price<ul>
<li>현재 부서의 요청 금액 price 만큼 예산을 차감한다.</li>
</ul>
</li>
<li>(budget -= price) ≥ 0<ul>
<li>남은 예산이 0인지 확인한다.</li>
</ul>
</li>
<li>count + (…)<ul>
<li>위에서 나온 결과값을 누적값 count에 더한다.</li>
</ul>
</li>
</ul>
</li>
<li><p>배운 개념:</p>
<ul>
<li>reduce()메소드<ul>
<li>파라미터<ul>
<li>accumulator: callback함수의 반환값을 누적</li>
<li>currentValue: 배열의 현재 요소</li>
<li>index(Optional): 배열의 현재 요소의 인덱스</li>
<li>array(Optional): 호출한 배열</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Programmers] JadenCase문자열 만들기]]></title>
            <link>https://velog.io/@jinny0_0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-JadenCase%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@jinny0_0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-JadenCase%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Fri, 17 Jan 2025 06:47:20 GMT</pubDate>
            <description><![CDATA[<h3 id="jadencase문자열-만들기">JadenCase문자열 만들기</h3>
<ul>
<li><p>날짜 / 주차-누적 횟수: 2025.01.16(목) / 3주차-2회</p>
</li>
<li><p>사이트 이름: 프로그래머스</p>
</li>
<li><p>사용 언어: 자바스크립트</p>
</li>
<li><p>문제 고유 번호 및 레벨: 12951 / Lev 2</p>
</li>
<li><p>나의 풀이 방법:</p>
<pre><code class="language-jsx">
  function solution(s) {
      // JadenCase: 모든 단어의 첫 문자가 대문자 그 외의 알파벳은 소문자 
      // 첫 문자가 알파벳이 아닐 때는 이어지는 알파벳은 소문자로 쓰면 됨 
      const arr = s.split(&#39; &#39;);

      for (let i = 0; i &lt; arr.length; i++) {
          if (arr[i]) {
              arr[i] = arr[i][0].toUpperCase() + arr[i].slice(1).toLowerCase();        
          }
      }
      return arr.join(&#39; &#39;);    
  }</code></pre>
<ul>
<li>arr에 빈 값이 아닌 경우 첫 문자를 대문자로 나머지는 소문자로 변환한다.</li>
</ul>
</li>
<li><p>최적 풀이 방법:</p>
<pre><code class="language-jsx">
  function solution(s) {
      return s.split(&quot; &quot;).map(v =&gt; v.charAt(0).toUpperCase() + v.substring(1).toLowerCase()).join(&quot; &quot;);
  }
</code></pre>
<ul>
<li>빈 값을 기준으로 배열로 나눈다.</li>
<li>첫 번째 글자에는 .toUpperCase()</li>
<li>substirng으로 1번째 문자열부터 쭉 까지는 .toLowerCase()</li>
</ul>
</li>
<li><p>배운 개념:</p>
<ul>
<li>자바스크립트에서 문자열은 불변(immutable)이다. 즉, 특정 인덱스를 직접 수정할 수 없다.</li>
<li>arr[i][0] = arr[i][0].toUpperCase() 이렇게 특정 문자를 직접 변경하려고 하면 오류가 발생하거나, 코드가 예상대로 동작하지 않는다. 대신 문자열을 조합해서 새로 만들어야 된다.</li>
<li>charAt(인수)- 인수번째의 문자를 읽어 낸다.<ul>
<li>e.g. “javascript”.charAt(2)에는 ‘v’가 읽혀진다.</li>
</ul>
</li>
<li>indexOf(인수)-인수가 들어있는 위치를 알려준다.<ul>
<li>e.g. “javascript”.indexOf(’v’)에는 ‘2’가 읽혀진다.</li>
</ul>
</li>
<li>substring(인수, 인수)-charAt은 문자하나를 읽어내지면 substring은 문자열을 읽어낸다.<ul>
<li>e.g. “javascript”.substring(1, 3)에는 ‘ava’가 읽혀진다.</li>
</ul>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Programmers] 완주하지 못한 선수]]></title>
            <link>https://velog.io/@jinny0_0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%99%84%EC%A3%BC%ED%95%98%EC%A7%80-%EB%AA%BB%ED%95%9C-%EC%84%A0%EC%88%98</link>
            <guid>https://velog.io/@jinny0_0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%99%84%EC%A3%BC%ED%95%98%EC%A7%80-%EB%AA%BB%ED%95%9C-%EC%84%A0%EC%88%98</guid>
            <pubDate>Fri, 17 Jan 2025 06:46:53 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>날짜 / 주차-누적 횟수: 2025.01.16(목) / 3주차-1회</p>
</li>
<li><p>사이트 이름: 프로그래머스</p>
</li>
<li><p>사용 언어: 자바스크립트</p>
</li>
<li><p>문제 고유 번호 및 레벨: 42579 / Lev 1</p>
</li>
<li><p>최적 풀이 방법:</p>
<pre><code class="language-jsx">  function solution(participant, completion) {
      // 1. 해시 테이블 생성
      const obj = {};

     // 2. 참가자들의 이름을 해시 테이블에 추가
      for (const p of participant) {
          if(obj[p]) {
              obj[p] += 1;
          } else {
              obj[p] = 1;
          }
      }

      // 3. 완주한 선수들의 이름을 키로 하는 값을 1씩 감소
      for (const c of completion) {
          obj[c] -= 1;
      }

      // 4. 해시 테이블에 남아 있는 선수가 완주하지 못한 선수
      for (const key in obj) {
          if (obj[key] &gt; 0) {
              return key;
          }
      }
  }</code></pre>
<ol>
<li><p>해시 테이블을 생성한다.</p>
<ul>
<li>빈 객체를 만든다. 이후에 이 객체 안에 요소들을 넣을 예정이다.</li>
</ul>
</li>
<li><p>모든 참가자들의 이름을 해시 테이블에 추가한다.
participant를 순회하며 참가자 이름을 오브젝트에 추가한다. 
처음 등장하는 이름은 1, 그렇지 않은 경우는 기존 이름 개수를 +1 한다.</p>
<ul>
<li>for of 반복문으로 participant 배열 (참가자 배열)의 각 요소별로 접근한다.</li>
<li>객체에  obj[p]로 예를 들어 obj[leo]가 true면 obj[leo]에 1을 더한다.</li>
<li>false면 1을 넣는다.</li>
</ul>
</li>
<li><p>완주한 선수들의 이름을 키로 하는 값을 1씩 감소한다.
obj의 키를 completion에서 찾으면 이름 개수를 -1 한다.</p>
<ul>
<li>for of 반복문으로 competion 배열을 돌며 요소에 하나씩 접근한다.</li>
<li>obj[마라토너 이름]을 1씩 감소한다.</li>
</ul>
</li>
<li><p>해시 테이블에 남아있는 선수가 완주하지 못한 선수이다.
순회가 끝난 후 obj에서 값이 0보다 큰 키를 반환한다. 완주를 못한 선수는 단 1명이라고 했으므로 찾는 즉시 해당 값을 반환하며 반복문을 종료 한다.</p>
</li>
</ol>
</li>
<li><p>배운 개념:</p>
<ul>
<li>객체를 생성한 다음에 객체[p] p안에 값을 넣고 숫자를 넣으면 그 숫자가 키 값이 된다.</li>
<li>해시를 이용해서 코딩테스트를 풀면 효율적인 계산이 가능하다.</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[필수 알고리즘 2 '큐' (정리 중)]]></title>
            <link>https://velog.io/@jinny0_0/%ED%95%84%EC%88%98-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-2-%ED%81%90-%EC%A0%95%EB%A6%AC-%EC%A4%91</link>
            <guid>https://velog.io/@jinny0_0/%ED%95%84%EC%88%98-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-2-%ED%81%90-%EC%A0%95%EB%A6%AC-%EC%A4%91</guid>
            <pubDate>Fri, 10 Jan 2025 05:34:16 GMT</pubDate>
            <description><![CDATA[<p>큐(queue) 는 &#39;줄을 서다&#39;라는 뜻을 가지고 있다.
큐는 먼저 들어간 데이터가 먼저 나오는 자료 구조이다.
(맛집에서 먼저 줄을 서면 먼저 들어가는 것 같이!)</p>
<p>FIFO(First In First Out) 선입 선출
스택과 마찬가지로 큐도 삽입하는 연산을 push, 꺼내는 연산을 pop이라고 한다.</p>
<h3 id="큐의-특성을-활용하는-분야">큐의 특성을 활용하는 분야</h3>
<ul>
<li>작업 대기열: 네트워크 통신을 할 때 다수의 클라이언트에서 서버에 작업을 요청하면 서버는 요청이 들어온 순서대로 처리한다. 이때 큐를 활용할 수 있다.</li>
<li>이벤트 처리: 어떤 애플리케이션이나 시스템에서 사용자의 이벤트, 예를 들어 키보드 입력이나 마우스 움직임을 처리할 큐를 활용할 수 있다.</li>
</ul>
<h3 id="큐-규현하기">큐 규현하기</h3>
<ol>
<li>shift() 메서드 사용하기</li>
</ol>
<ul>
<li>push()메서드: 배열의 가장 마지막에 요소를 추가</li>
<li>shift()메서드: 배열의 가장 첫 번째 요소를 삭제</li>
</ul>
<p>위 두 메서드를 이용하면 큐의 선입선출(FIFO)를 흉내낼 수 있지만 shift()메서드의 시간 복잡도가 O(1)이 아니기 때문에 진짜 큐는 아니다.</p>
<ol start="2">
<li>배열 이용하기</li>
</ol>
<ul>
<li>앞서 push()와 shift()메서드를 이용하여 큐를 흉내낼 수 있지만 아무리 최적화가 된다고 해도 진짜 큐의 성능을 따라갈 수는 없다.</li>
<li>만약 많은 요소를 다뤄야 하는 문제라면 shift()메서드를 사용하는 경우 문제가 될 수 있기 때문에 직접 큐를 구현하는 방식도 알아야 된다. 
먼저 배열을 이용하는 방식이다.</li>
</ul>
<ol start="3">
<li>연결 리스트 이용하기</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Programmers] 올바른 괄호]]></title>
            <link>https://velog.io/@jinny0_0/1%EC%9D%BC-1%EC%BD%94%ED%85%8C</link>
            <guid>https://velog.io/@jinny0_0/1%EC%9D%BC-1%EC%BD%94%ED%85%8C</guid>
            <pubDate>Fri, 10 Jan 2025 01:57:44 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>날짜 / 주차-누적 횟수: 2025.01.10(금) / 2주차-18회</p>
</li>
<li><p>사이트 이름: 프로그래머스</p>
</li>
<li><p>사용 언어: 자바스크립트</p>
</li>
<li><p>문제 고유 번호 및 레벨: 12909 / Lev 2</p>
</li>
<li><p>나의 풀이 방법:</p>
<pre><code class="language-jsx">  function solution(s){
      let stack = [];

      if (s[0] === &#39;)&#39;) return false;

      s.split(&#39;&#39;).forEach(v =&gt; {
          if (v === &#39;(&#39;) stack.push(&#39;(&#39;);
          if (v === &#39;)&#39;) stack.pop();
      });

      return stack.length === 0 ? true : false ;
  }</code></pre>
<ul>
<li>stack 빈 배열을 만든다.</li>
<li>열린 괄호가 있으면 stack 배열에 넣고, 닫힌 괄호가 있으면 stack 에 있는 열린 괄호를 없앤다.</li>
<li>최종적으로 stack이 빈 배열이면 true값을 반환, 그렇지 않으면 false값을 반환한다.</li>
</ul>
</li>
<li><p>최적 풀이 방법:</p>
<pre><code class="language-jsx">  function solution(s){
      let cum = 0
      for (let paren of s) {
          cum += paren === &#39;(&#39;? 1: -1
          if(cum &lt; 0) {
              return false
          }
      }
      return cum === 0? true: false;
  }</code></pre>
<ul>
<li>내가 stack을 빈 배열로 만들었다면 . 이분은 cum이라는 변수를 만들었다.</li>
<li>열린괄호가 있으면 1을 추가하고 그렇지 않으면 1을 뺀다.</li>
<li>최종적으로 cum변수의 숫자가 0이면 true를 리턴한다.</li>
</ul>
</li>
<li><p>배운 개념:</p>
<ul>
<li>알고리즘 개념 ‘스택’<ul>
<li>쌓는다는 의미의 어원</li>
<li>먼저 입력한 데이터를 가장 나중에 꺼낼 수 있는 구조</li>
</ul>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[필수 알고리즘 1 '스택']]></title>
            <link>https://velog.io/@jinny0_0/%ED%95%84%EC%88%98-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-1-%EC%8A%A4%ED%83%9D</link>
            <guid>https://velog.io/@jinny0_0/%ED%95%84%EC%88%98-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-1-%EC%8A%A4%ED%83%9D</guid>
            <pubDate>Fri, 10 Jan 2025 01:57:33 GMT</pubDate>
            <description><![CDATA[<p>스택의 어원은 &#39;쌓는다&#39;이다.
<strong>어원에서 짐작할 수 있듯이 먼저 입력한 데이터를 제일 나중에 꺼낼 수 있는 자료 구조</strong>이다.</p>
<p>LIFO(Last In First Out): 먼저 들어간 것이 마지막에 나오는 규칙을 후입선출 또는 LIFO라고 한다.
이때 스택에 삽입하는 연산을 push, 꺼내는 연산을 pop이라고 한다.</p>
<p>ADT(abstract data type): 추상자료형</p>
<ul>
<li>인터페이스만 있고 실제로 구현은 되지 않은 자료형이다.</li>
<li>일종의 자료형의 설계도라고 생각하면 된다.</li>
</ul>
<p>그렇다면 스택은 어떤 정의가 필요한 자료구조 일까?</p>
<h2 id="스택의-adt">스택의 ADT</h2>
<p>우선 다음을 정의해야 된다.</p>
<ul>
<li>push</li>
<li>pop</li>
<li>isFull (가득 찼는지 확인)</li>
<li>isEmpty (비었는지 확인)</li>
<li>top<ul>
<li>스택은 최근에 삽입한 데이터의 위치를 저장할 변수인 top도 있어야 된다. </li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Programmers] 이차원 배열 대각선 순회하기 (JavaScript)]]></title>
            <link>https://velog.io/@jinny0_0/181829</link>
            <guid>https://velog.io/@jinny0_0/181829</guid>
            <pubDate>Fri, 10 Jan 2025 01:45:49 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>날짜 / 주차-누적 횟수: 2025.01.08(수) / 2주차-11회</p>
</li>
<li><p>사이트 이름: 프로그래머스</p>
</li>
<li><p>사용 언어: 자바스크립트</p>
</li>
<li><p>문제 고유 번호 및 레벨: 181829 / Lev 0</p>
</li>
<li><p>나의 풀이 방법:</p>
<pre><code class="language-jsx">  function solution(board, k) {
      // board: 2차원 정수 배열
      // k: 정수 

      // i + j &lt;= k를 만족하는 (i, j)에 대한 board[i][j]의 합을 return 하는 solution함수를 완성

      let result = 0;

      for (let i = 0; i &lt; board.length; i++) {
          for (let j = 0; j &lt; board[0].length; j++) {
              if (i + j &lt;= k) result += board[i][j]; 
          }
      }

      return result;
  }</code></pre>
<ul>
<li>일반 for 문을 중첩하여 사용해서 2차 배열에 접근한다.</li>
</ul>
</li>
<li><p>최적 풀이 방법:</p>
<pre><code class="language-jsx">  function solution(board, k) {
    return board.reduce(
      (total, row, i) =&gt; total + row.reduce((prev, num, j) =&gt; (i + j &lt;= k ? prev + num : prev), 0),
      0,
    );
  }
</code></pre>
<ul>
<li>reduce() 메서드를 사용하여 2차원 배열 전체를 순회한다.<ul>
<li>total: callback함수의 반환값을 누적한다.</li>
<li>row: 배열의 현재 요소</li>
<li>i: 배열의 현재 요소 인덱스</li>
</ul>
</li>
</ul>
</li>
<li><p>배운 개념:</p>
<ul>
<li>2차원 배열을 순회할 때 reduce 중첩해서 사용하면 효과적으로 풀 수 있다.<ul>
<li>reduce: 4가지의 인수를 가진다.<ul>
<li>accumulator: callback함수의 반환값 누적</li>
<li>currentValue: 배열의 현재 요소</li>
<li>index(Optional): 배열의 현재 요소의 인덱스</li>
<li>array(Optional): 호출한 배열</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Programmers] 그림 확대]]></title>
            <link>https://velog.io/@jinny0_0/181836</link>
            <guid>https://velog.io/@jinny0_0/181836</guid>
            <pubDate>Fri, 10 Jan 2025 01:45:36 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>날짜 / 주차-누적 횟수: 2025.01.08(수) / 2주차-12회</p>
</li>
<li><p>사이트 이름: 프로그래머스</p>
</li>
<li><p>사용 언어: 자바스크립트</p>
</li>
<li><p>문제 고유 번호 및 레벨: 181836 / Lev 0</p>
</li>
<li><p>나의 풀이 방법:</p>
<pre><code class="language-jsx">  function solution(picture, k) {
      let result = [];

      picture.forEach(v =&gt; {
          const arr = v.split(&#39;&#39;)
          let oneArr = [];

          for (let i = 0; i &lt; arr.length; i++) {    
              if (arr[i] === &#39;.&#39;) {
                  oneArr += &#39;.&#39;.repeat(k);
              }
              if (arr[i] === &#39;x&#39;) {
                  oneArr += &#39;x&#39;.repeat(k);
              }
          }
          for (let i = 0; i &lt; k; i++) {
              result.push(oneArr);
          }
      });
      return result;
  }</code></pre>
<ul>
<li>일반 for 문을 사용하여 그 안에 if 조건문으로 ‘.’, ‘x’문자를 k 번 repeat한다.</li>
</ul>
</li>
<li><p>최적 풀이 방법:</p>
<pre><code class="language-jsx">  function solution(picture, k) {
      var answer = [];

      picture.forEach((line) =&gt; {
          const expanded = [...line].reduce((acc, cur) =&gt; acc + cur.repeat(k), &#39;&#39;);

          for(let i=0; i&lt;k; i++) answer.push(expanded);
      });

      return answer;
  }</code></pre>
<ul>
<li>forEach()로 picture배열을 모두순회한다.<ul>
<li>각 배열 line을 배열로 변환한다.</li>
<li>reduce()메소드<ul>
<li>accumaulator: callback함수의 반환 값 누적</li>
<li>currentValue: 배열의 현재 요소</li>
</ul>
</li>
<li>누적 된 반환 값 + 현재요소를 k번 repeact한다.</li>
<li>‘’로 초기화 시킨다.</li>
</ul>
</li>
</ul>
</li>
<li><p>배운 개념:</p>
<ul>
<li>reduce() 메소드의 활용도가 넓다. 지속적으로 속지하는 것이 중요해 보인다.</li>
<li>문자열을 배열로 쪼개어 reduce 로 접근하는 방식이 효율적이다.</li>
<li>문자열 같은 경우 ‘’로 초기화를 시키면 된다.</li>
</ul>
</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>