<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>0_0</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Sun, 10 Apr 2022 16:08:08 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>0_0</title>
            <url>https://images.velog.io/images/0_0/profile/bf9d445e-f302-45eb-8008-4ac952ee532c/KakaoTalk_Photo_2021-03-15-15-32-44.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. 0_0. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/0_0" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Type-Challenges_2 (easy 2 / 2)]]></title>
            <link>https://velog.io/@0_0/Type-Challenges2-easy-2-2</link>
            <guid>https://velog.io/@0_0/Type-Challenges2-easy-2-2</guid>
            <pubDate>Sun, 10 Apr 2022 16:08:08 GMT</pubDate>
            <description><![CDATA[<h2 id="easy">easy</h2>
<h3 id="189---awaited">189 - Awaited</h3>
<blockquote>
</blockquote>
<pre><code class="language-ts">// qs
type MyAwaited = any
// answer
type MyAwaited&lt;T extends Promise&lt;any&gt;&gt; = T extends Promise&lt;infer U&gt; ? (U extends Promise&lt;any&gt; ? MyAwaited&lt;U&gt; : U) : never;</code></pre>
<h3 id="268---if">268 - If</h3>
<blockquote>
</blockquote>
<pre><code class="language-ts">// qs
type If&lt;C, T, F&gt; = any
// answer
type If&lt;C extends boolean, T, F&gt; = C extends true ? T : F;
// test-case
type A = If&lt;true, &#39;a&#39;, &#39;b&#39;&gt;  // expected to be &#39;a&#39;
type B = If&lt;false, &#39;a&#39;, &#39;b&#39;&gt; // expected to be &#39;b&#39;</code></pre>
<h3 id="533---concat">533 - Concat</h3>
<blockquote>
</blockquote>
<pre><code class="language-ts">// qs
type Concat&lt;T, U&gt; = any
// answer
type Concat&lt;T extends any[], U extends any[]&gt; = [...T, ...U]
// test-case
type Result = Concat&lt;[1], [2]&gt; // expected to be [1, 2]</code></pre>
<h3 id="898---includes">898 - Includes</h3>
<blockquote>
</blockquote>
<pre><code class="language-ts">// qs
type Includes&lt;T extends readonly any[], U&gt; = any;
// answer
type Includes&lt;T extends readonly any[], U&gt; = T extends [infer P, ...infer K] ? (Equal&lt;P, U&gt; extends true ? true : Includes&lt;K, U&gt;) : false;
// test-case
type isPillarMen = Includes&lt;[&#39;Kars&#39;, &#39;Esidisi&#39;, &#39;Wamuu&#39;, &#39;Santana&#39;], &#39;Dio&#39;&gt; // expected to be `false`
// 요 부분은 Equal 타입이 구현되어 있어야 동작... 애매...</code></pre>
<h3 id="3057---push">3057 - Push</h3>
<blockquote>
</blockquote>
<pre><code class="language-ts">// qs
type Push&lt;T, U&gt; = any
// answer
type Push&lt;T extends any[], U&gt; = [...T, U]
// test-case
type Result = Push&lt;[1, 2], &#39;3&#39;&gt; // [1, 2, &#39;3&#39;]</code></pre>
<h3 id="3060---unshift">3060 - Unshift</h3>
<blockquote>
</blockquote>
<pre><code class="language-ts">// qs
type Unshift&lt;T, U&gt; = any
// answer
type Unshift&lt;T extends any[], U&gt; = [U, ...T]
// test-case
type Result = Unshift&lt;[1, 2], 0&gt; // [0, 1, 2,]</code></pre>
<h3 id="3312---parameters">3312 - Parameters</h3>
<blockquote>
</blockquote>
<pre><code class="language-ts">// qs
type MyParameters&lt;T extends (...args: any[]) =&gt; any&gt; = any
// answer
type MyParameters&lt;T extends (...args: any[]) =&gt; any&gt; = T extends (...args: infer P) =&gt; any ? P : never;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[Type-Challenges_1 (warm-up ~ easy 1 / 2)]]></title>
            <link>https://velog.io/@0_0/Type-Challenges1</link>
            <guid>https://velog.io/@0_0/Type-Challenges1</guid>
            <pubDate>Sun, 03 Apr 2022 16:26:17 GMT</pubDate>
            <description><![CDATA[<blockquote>
</blockquote>
<p>타입스크립트 관련 재밌는 <em>Challenge</em> 발견!! 🤔
난이도는 warm-up, easy, medium, hard, extreme 총 5단계로 나뉘어져있고
하나씩 진행하며 글 남겨보려 합니다..!!
참고자료 및 출처 👉 <a href="https://github.com/type-challenges/type-challenges">챌린지 사이트</a></p>
<h2 id="warm-up">warm-up</h2>
<h3 id="13---hello-world">13 - Hello World</h3>
<blockquote>
</blockquote>
<pre><code class="language-ts">// qs
type HelloWord = any
// answer
type HelloWord = string</code></pre>
<h2 id="easy">easy</h2>
<h3 id="4---pick">4 - Pick</h3>
<blockquote>
</blockquote>
<pre><code class="language-ts">// qs
type MyPick&lt;T, K&gt; = any
// answer
type MyPick&lt;T, K extends keyof T&gt; = {
  [P in K]: T[P]
}
// test-case
interface Todo {
  title: string
  description: string
  completed: boolean
}
type TodoPreview = MyPick&lt;Todo, &#39;title&#39; | &#39;completed&#39;&gt;
const todo: TodoPreview = {
    title: &#39;Clean room&#39;,
    completed: false,
}</code></pre>
<h3 id="7---readonly">7 - Readonly</h3>
<blockquote>
</blockquote>
<pre><code class="language-ts">// qs
type MyReadonly&lt;T&gt; = any
// answer
type MyReadonly&lt;T&gt; = {
  readonly [K in keyof T]: T[K]
}
// test-case
interface Todo {
  title: string
  description: string
}
const todo: MyReadonly&lt;Todo&gt; = {
  title: &quot;Hey&quot;,
  description: &quot;foobar&quot;
}
todo.title = &quot;Hello&quot; // Error: cannot reassign a readonly property
todo.description = &quot;barFoo&quot; // Error: cannot reassign a readonly property</code></pre>
<h3 id="11---tuple-to-object">11 - Tuple to Object</h3>
<blockquote>
</blockquote>
<pre><code class="language-ts">// qs
type TupleToObject&lt;T extends readonly any[]&gt; = any
// answer
type TupleToObject&lt;T extends readonly string[]&gt; = {
  [K in T[number]]: K
}
// test-case
const tuple = [&#39;tesla&#39;, &#39;model 3&#39;, &#39;model X&#39;, &#39;model Y&#39;] as const
type result = TupleToObject&lt;typeof tuple&gt; // expected { tesla: &#39;tesla&#39;, &#39;model 3&#39;: &#39;model 3&#39;, &#39;model X&#39;: &#39;model X&#39;, &#39;model Y&#39;: &#39;model Y&#39;}</code></pre>
<h3 id="14---first-of-array">14 - First of Array</h3>
<blockquote>
</blockquote>
<pre><code class="language-ts">// qs
type First&lt;T extends any[]&gt; = any
// answer
type First&lt;T extends any[]&gt; = T extends [] ? never : T[0]
// test-case
type arr1 = [&#39;a&#39;, &#39;b&#39;, &#39;c&#39;]
type arr2 = [3, 2, 1]
type head1 = First&lt;arr1&gt; // expected to be &#39;a&#39;
type head2 = First&lt;arr2&gt; // expected to be 3</code></pre>
<h3 id="18---length-of-tuple">18 - Length of Tuple</h3>
<blockquote>
</blockquote>
<pre><code class="language-ts">// qs
type Length&lt;T extends any&gt; = any
// answer
type Length&lt;T extends readonly string[]&gt; = T[&#39;length&#39;]
// test-case
type tesla = [&#39;tesla&#39;, &#39;model 3&#39;, &#39;model X&#39;, &#39;model Y&#39;] as const;
type spaceX = [&#39;FALCON 9&#39;, &#39;FALCON HEAVY&#39;, &#39;DRAGON&#39;, &#39;STARSHIP&#39;, &#39;HUMAN SPACEFLIGHT&#39;] as const;
type teslaLength = Length&lt;tesla&gt;  // expected 4
type spaceXLength = Length&lt;spaceX&gt; // expected 5</code></pre>
<h3 id="43---exclude">43 - Exclude</h3>
<blockquote>
</blockquote>
<pre><code class="language-ts">// qs
type MyExclude&lt;T, U&gt; = any
// answer
type MyExclude&lt;T, U&gt; = T extends U ? never : T
// test-case
type T0 = MyExclude&lt;&quot;a&quot; | &quot;b&quot; | &quot;c&quot;, &quot;a&quot;&gt; // expected &quot;b&quot; | &quot;c&quot;
type T1 = MyExclude&lt;&quot;a&quot; | &quot;b&quot; | &quot;c&quot;, &quot;a&quot; | &quot;b&quot;&gt; // expected &quot;c&quot;
type T2 = MyExclude&lt;string | number | (() =&gt; void), Function&gt; // expected string | number</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] - Level2 MySQL]]></title>
            <link>https://velog.io/@0_0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Level2-MySQL</link>
            <guid>https://velog.io/@0_0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Level2-MySQL</guid>
            <pubDate>Sat, 15 Jan 2022 13:55:49 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<p><a href="https://programmers.co.kr/learn/challenges">링크</a></p>
<h1 id="풀이">풀이</h1>
<h2 id="1-고양이와-개는-몇-마리-있을까">1. 고양이와 개는 몇 마리 있을까</h2>
<pre><code class="language-sql">SELECT ANIMAL_TYPE, COUNT(ANIMAL_TYPE) AS count 
FROM ANIMAL_INS 
GROUP BY ANIMAL_TYPE 
ORDER BY ANIMAL_TYPE;</code></pre>
<h2 id="2-루시와-엘라-찾기">2. 루시와 엘라 찾기</h2>
<pre><code class="language-sql">SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE 
FROM ANIMAL_INS 
WHERE NAME 
IN (&#39;Lucy&#39;, &#39;Ella&#39;, &#39;Pickle&#39;, &#39;Rogan&#39;, &#39;Sabrina&#39;, &#39;Mitty&#39;)
ORDER BY ANIMAL_ID;</code></pre>
<h2 id="3-최솟값-구하기">3. 최솟값 구하기</h2>
<pre><code class="language-sql">SELECT MIN(DATETIME) FROM ANIMAL_INS;</code></pre>
<h2 id="4-동명-동물-수-찾기">4. 동명 동물 수 찾기</h2>
<pre><code class="language-sql">SELECT NAME, COUNT(NAME) AS COUNT 
FROM ANIMAL_INS
GROUP BY NAME
HAVING COUNT(NAME) &gt; 1
ORDER BY NAME;</code></pre>
<h2 id="5-이름에-el이-들어가는-동물-찾기">5. 이름에 el이 들어가는 동물 찾기</h2>
<pre><code class="language-sql">SELECT ANIMAL_ID, NAME 
FROM ANIMAL_INS 
WHERE NAME LIKE &#39;%el%&#39; AND ANIMAL_TYPE = &#39;Dog&#39; 
ORDER BY NAME;</code></pre>
<h2 id="6-동물-수-구하기">6. 동물 수 구하기</h2>
<pre><code class="language-sql">SELECT COUNT(ANIMAL_ID) AS count FROM ANIMAL_INS;</code></pre>
<h2 id="7-입양-시각-구하기1">7. 입양 시각 구하기(1)</h2>
<pre><code class="language-sql">SELECT date_format(DATETIME, &#39;%k&#39;) AS HOUR, COUNT(date_format(DATETIME, &#39;%k&#39;)) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR
HAVING(HOUR &gt; 8) AND (HOUR &lt; 20)
ORDER BY HOUR * 1;</code></pre>
<h2 id="8-null-처리하기">8. NULL 처리하기</h2>
<pre><code class="language-sql">SELECT ANIMAL_TYPE, IFNULL(NAME, &#39;No name&#39;) AS NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;</code></pre>
<h2 id="9-중성화-여부-파악하기">9. 중성화 여부 파악하기</h2>
<pre><code class="language-sql">SELECT ANIMAL_ID, NAME, 
CASE 
    WHEN SEX_UPON_INTAKE LIKE &#39;Neutered%&#39; THEN &#39;O&#39;
    WHEN SEX_UPON_INTAKE LIKE &#39;Spayed%&#39; THEN &#39;O&#39;
    ELSE &#39;X&#39;
END AS &#39;중성화&#39;
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;</code></pre>
<h2 id="10-중복-제거하기">10. 중복 제거하기</h2>
<pre><code class="language-sql">SELECT COUNT(DISTINCT NAME) AS count FROM ANIMAL_INS;</code></pre>
<h2 id="11-datetime에서-date로-형-변환">11. DATETIME에서 DATE로 형 변환</h2>
<pre><code class="language-sql">SELECT ANIMAL_ID, NAME, date_format(DATETIME, &#39;%Y-%m-%d&#39;) AS &#39;날짜&#39;
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] - Level1 MySQL]]></title>
            <link>https://velog.io/@0_0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Level1-MySQL</link>
            <guid>https://velog.io/@0_0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Level1-MySQL</guid>
            <pubDate>Sat, 15 Jan 2022 13:46:34 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<p><a href="https://programmers.co.kr/learn/challenges">링크</a></p>
<h1 id="풀이">풀이</h1>
<h2 id="1-모든-레코드-조회하기">1. 모든 레코드 조회하기</h2>
<pre><code class="language-sql">SELECT * FROM ANIMAL_INS;</code></pre>
<h2 id="2-최댓값-구하기">2. 최댓값 구하기</h2>
<pre><code class="language-sql">SELECT MAX(DATETIME) FROM ANIMAL_INS;</code></pre>
<h2 id="3-이름이-없는-동물의-아이디">3. 이름이 없는 동물의 아이디</h2>
<pre><code class="language-sql">SELECT ANIMAL_ID FROM ANIMAL_INS WHERE NAME IS NULL;</code></pre>
<h2 id="4-역순-정렬하기">4. 역순 정렬하기</h2>
<pre><code class="language-sql">SELECT NAME, DATETIME FROM ANIMAL_INS ORDER BY ANIMAL_ID DESC;</code></pre>
<h2 id="5-이름이-있는-동물의-아이디">5. 이름이 있는 동물의 아이디</h2>
<pre><code class="language-sql">SELECT ANIMAL_ID FROM ANIMAL_INS WHERE NAME IS NOT NULL;</code></pre>
<h2 id="6-아픈-동물-찾기">6. 아픈 동물 찾기</h2>
<pre><code class="language-sql">SELECT ANIMAL_ID, NAME FROM ANIMAL_INS WHERE INTAKE_CONDITION IN (&#39;Sick&#39;);</code></pre>
<h2 id="7-어린-동물-찾기">7. 어린 동물 찾기</h2>
<pre><code class="language-sql">SELECT ANIMAL_ID, NAME FROM ANIMAL_INS WHERE INTAKE_CONDITION NOT IN (&#39;Aged&#39;);</code></pre>
<h2 id="8-동물의-아이디와-이름">8. 동물의 아이디와 이름</h2>
<pre><code class="language-sql">SELECT ANIMAL_ID, NAME FROM ANIMAL_INS ORDER BY ANIMAL_ID;</code></pre>
<h2 id="9-여러-기준으로-정렬하기">9. 여러 기준으로 정렬하기</h2>
<pre><code class="language-sql">SELECT ANIMAL_ID, NAME, DATETIME FROM ANIMAL_INS ORDER BY NAME ASC, DATETIME DESC;</code></pre>
<h2 id="10-상위-n개-레코드">10. 상위 n개 레코드</h2>
<pre><code class="language-sql">SELECT NAME FROM ANIMAL_INS ORDER BY DATETIME ASC LIMIT 1;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] - Level1 신규 아이디 추천]]></title>
            <link>https://velog.io/@0_0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Level1-%EC%8B%A0%EA%B7%9C-%EC%95%84%EC%9D%B4%EB%94%94-%EC%B6%94%EC%B2%9C</link>
            <guid>https://velog.io/@0_0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Level1-%EC%8B%A0%EA%B7%9C-%EC%95%84%EC%9D%B4%EB%94%94-%EC%B6%94%EC%B2%9C</guid>
            <pubDate>Sun, 07 Nov 2021 15:28:19 GMT</pubDate>
            <description><![CDATA[<h3 id="문제링크">문제링크</h3>
<ul>
<li><a href="https://programmers.co.kr/learn/courses/30/lessons/72410">신규 아이디 추천</a></li>
</ul>
<h3 id="생각한-부분">생각한 부분</h3>
<ol>
<li>단계가 7개나 된다... 하나하나 해결하자...</li>
<li>전체적으로 적용되는 규칙이 3가지 있다! 빠트리지 말고 확인하자!</li>
<li>정규표현식 공부하자...!</li>
</ol>
<h3 id="내가-쓴-코드">내가 쓴 코드</h3>
<pre><code class="language-js">function solution(new_id) {
  let answer = &#39;&#39;
  answer = new_id
    .toLowerCase()
    .replace(/[^a-z0-9-_.]/g, &quot;&quot;)
    .replace(/\.{2,}/g, &quot;.&quot;)
    .replace(/^\./g, &quot;&quot;)
    .replace(/\.$/g, &quot;&quot;)
  if (answer.length === 0) answer = &quot;a&quot;
  if (answer.length &gt;= 16) answer = answer.substring(0, 15)
  answer = answer.replace(/\.$/g, &quot;&quot;) // 위에서 한 번 처리 했다고 안해주면 규칙에서 어긋난다 !

  while (answer.length &lt;= 2) {
    answer = answer + answer[answer.length - 1]
  }
  return answer
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] - Level2 스킬트리]]></title>
            <link>https://velog.io/@0_0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Level2-%EC%8A%A4%ED%82%AC%ED%8A%B8%EB%A6%AC</link>
            <guid>https://velog.io/@0_0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Level2-%EC%8A%A4%ED%82%AC%ED%8A%B8%EB%A6%AC</guid>
            <pubDate>Tue, 20 Apr 2021 05:08:29 GMT</pubDate>
            <description><![CDATA[<h3 id="생각한-부분">생각한 부분</h3>
<ol start="0">
<li><p>제한사항 - 이전 스킬을 스킵하고 다음 스킬을 배울 수 없다. 
예를들어 skill &quot;CBD&quot;가 주어졌을 때, C를 배우지 않으면 B, D는 가능하지 않다.
BD, B, D =&gt; 안되는 경우
CD =&gt; 얘도 안됨...왜? B를 배우지 않고 D를 배울 순 없다.
CB =&gt; 가능한 경우</p>
</li>
<li><p>skill_trees에서 skill에 주어진 알파벳을 제외한 나머지 부분을 어떻게 삭제 할 것인가...?
=&gt; filter와 includes로 새로운 배열을 만들어 해결, 마지막에 join 메써드로 배열을 문자열로...!
=&gt; 나머지 부분을 왜 삭제해야하나...? 순서를 비교하기 위해서 !</p>
</li>
<li><p>skill을 substring 메써드로 앞에서부터 잘라서 새로만든 문자열과 비교...!</p>
</li>
</ol>
<h3 id="내가-쓴-코드">내가 쓴 코드</h3>
<pre><code class="language-js">function solution(skill, skill_trees) {
  const toArr = skill.split(&#39;&#39;)
  let result = 0
  let toStr = &#39;&#39;
  for (let i = 0; i &lt; skill_trees.length; i++) {
    toStr = skill_trees[i].split(&#39;&#39;).filter(value =&gt; toArr.includes(value)).join(&#39;&#39;)
    if (toStr === skill.substring(0, toStr.length)) {
      result++
    }
  }
  return result
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스] - Level2 다리를 지나는 트럭]]></title>
            <link>https://velog.io/@0_0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Level2-%EB%8B%A4%EB%A6%AC%EB%A5%BC-%EC%A7%80%EB%82%98%EB%8A%94-%ED%8A%B8%EB%9F%AD</link>
            <guid>https://velog.io/@0_0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-Level2-%EB%8B%A4%EB%A6%AC%EB%A5%BC-%EC%A7%80%EB%82%98%EB%8A%94-%ED%8A%B8%EB%9F%AD</guid>
            <pubDate>Tue, 20 Apr 2021 02:40:32 GMT</pubDate>
            <description><![CDATA[<h3 id="생각한-부분">생각한 부분</h3>
<ol>
<li>주어진 조건 - 다리의 길이, 다리 위에 한 번에 올라갈 수 있는 무게, 트럭의 무게, 트럭은 1초에 1만큼 움직임
(ex. 다리의 길이가 3이면 트럭이 다리를 다 지나가는데 최소 4초가 걸림)</li>
<li>return 값은 모든 트럭이 다리를 다 지나가는 최소한의 시간</li>
<li>빈 배열(arr)에 다리의 길이만큼 0을 넣어준다... 왜? 트럭이 다리 위를 지나가는 시간을 체크하기 위해서!</li>
<li>다리 위에 올라 올 트럭이 남지 않은 경우 arrSum이 0이 될 때까지 arr.pop()만 진행(첫 번째 if문 실행 ❌) 시간(answer)을 체크한다 ! (다리에 남은 트럭을 빼주기만 하는 과정)</li>
<li>아직 다리 위에 올라올 트럭이 남은 경우 (truck_weights.length !== 0) 다음 트럭이 다리 위에 올라 올 수 있을지 없을지 체크 !
5-1. 올라올 수 없는 경우 (arrSum + truck_weights[0] &gt; weight) 다리에 0 하나 unshift로 추가
5-2. 올라올 수 있는 경우 truck_wieghts 배열에 맨 앞에서 하나 뽑아 다리에 올려주고, 다리 무게도 추가해 준다.</li>
<li>반복</li>
</ol>
<h3 id="내가-쓴-코드">내가 쓴 코드</h3>
<pre><code class="language-js">function solution(bridge_length, weight, truck_weights) {
  var answer = 0;
  const arr = [] 
  let arrSum = 0

  for (let i = 0; i &lt; bridge_length; i++) {
    arr.push(0)
  }

  let leftPop = truck_weights.shift() 
  arr.pop()
  arr.unshift(leftPop)
  arrSum += leftPop
  answer++
  // 이 부분에 console.log(arr, arrSum, answer) 찍어보면 순서가 명확히 보입니다!

  while(arrSum) { 
    arrSum -= arr.pop()
    if (truck_weights.length !== 0) {
      if (arrSum + truck_weights[0] &gt; weight) {
      arr.unshift(0)
    } else {
        leftPop = truck_weights.shift()
        arrSum += leftPop
        arr.unshift(leftPop)
      }
    }
    answer++
    // 이 부분에 console.log(arr, arrSum, answer) 찍어보면 순서가 명확히 보입니다!
  }
  return answer;
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[기업협업 프로젝트 정리 및 후기]]></title>
            <link>https://velog.io/@0_0/%EA%B8%B0%EC%97%85%ED%98%91%EC%97%85-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%A0%95%EB%A6%AC-%EB%B0%8F-%ED%9B%84%EA%B8%B0</link>
            <guid>https://velog.io/@0_0/%EA%B8%B0%EC%97%85%ED%98%91%EC%97%85-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%A0%95%EB%A6%AC-%EB%B0%8F-%ED%9B%84%EA%B8%B0</guid>
            <pubDate>Sun, 21 Feb 2021 12:34:11 GMT</pubDate>
            <description><![CDATA[<h1 id="synology-community-클론코딩front-end">Synology community 클론코딩(Front-End)</h1>
<h2 id="프로젝트-소개-🤔">프로젝트 소개 🤔</h2>
<ul>
<li>NAS 제조사인 Synology 사이트의 community 부분을 클론 코딩 하였습니다.</li>
<li><a href="https://github.com/Yoooong-Chan/AbleStore-FrontEnd">Github</a></li>
<li><a href="https://youtu.be/KzV_qOPCeSA">영상</a></li>
</ul>
<h2 id="개발-기간-🤔">개발 기간 🤔</h2>
<ul>
<li>2021년 1월 11일 ~ 2020년 2월 4일(25일)</li>
</ul>
<h2 id="팀원-🤔">팀원 🤔</h2>
<ul>
<li>프론트 3명 (김찬영(PM), 조아람, 최용석(나))</li>
<li>백엔드 1명 (이수한)</li>
</ul>
<h2 id="기술-스택-및-구현-기능-🤔">기술 스택 및 구현 기능 🤔</h2>
<h3 id="프론트엔드">프론트엔드</h3>
<ul>
<li>React (CRA, Functional Component)</li>
<li>React Hook</li>
<li>React Router</li>
<li>Moment.js</li>
<li>Styled-components</li>
<li>Ant Design</li>
</ul>
<h3 id="구현-기능">구현 기능</h3>
<p>제가 구현 한 부분은 ✅, 팀원이 구현 한 부분은 👏🏻</p>
<ol>
<li>회원가입 / 로그인 유효성검사 👏🏻</li>
<li>메인 페이지 ✅</li>
<li>게시판 CRUD 👏🏻</li>
<li>댓글, 댓글의 댓글 생성 및 삭제 👏🏻</li>
<li>솔루션 채택 기능 👏🏻</li>
</ol>
<h3 id="담당한-기능">담당한 기능</h3>
<p>제가 맡은 부분은 <strong>메인 페이지(2)</strong> 입니다.</p>
<ul>
<li>Filtering</li>
<li>Pagination</li>
<li>백엔드에 등록되어 있는 포스팅 시간과 현재 시간의 차이를 통해 몇 분, 몇 시간, 몇 일 전 구현(moment.js)</li>
<li>모든 페이지에 공통적으로 사용되는 Nav, Footer 구현</li>
<li>Categories, Login 되었을 때 모달창 구현</li>
</ul>
<h3 id="아쉬운-부분">아쉬운 부분</h3>
<h4 id="설계를-철저히-할-것인가-vs-많은-페이지를-만들-것인가">설계를 철저히 할 것인가? VS 많은 페이지를 만들 것인가?</h4>
<p>이번 프로젝트에서 기능적으로 어려운 부분은 크게 없었습니다. 다만, 이번 프로젝트는 Atomic Design Pattern을 적용하고, Ant Design을 사용하여 웹페이지를 완성하는 것이 과제였습니다. 처음으로 프로젝트 설계에 대한 고민을 하고, 컴포넌트 하나를 만들어도 어떻게 하면 재사용할 수 있을지 고민하느라 일주일 넘는 시간을 페이지 분석, Atomic Design이 어떤 것인가에 대해 시간을 보냈습니다.
결과적으로 많은 페이지, 기능을 만들진 못했지만 프론트엔드의 설계에 대해 고민해 볼 수 있었던 좋은 기회였습니다. 
또한, 이번 프로젝트에서는 UI 컴포넌트를 독립적으로 볼 수 있는 Storybook, 타입을 지정할 수 있는 TypeScript를 사용할 수 없었지만 다음 프로젝트에는 꼭 적용해 보고 싶습니다!</p>
<h3 id="기억하고-싶은-부분">기억하고 싶은 부분</h3>
<p><img src="https://images.velog.io/images/0_0/post/9a32cd3e-de43-40cc-b2c2-763f0b0b3b9e/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-21%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%208.48.43.png" alt=""></p>
<p>JSX에서는 자바스크립트 조건문처럼 if나 switch문으로 처리가 불가능합니다...
일반적으로는 삼항연산자, &amp;&amp;로 조건을 사용하곤 하는데 저는 3가지 조건으로 구분하여 return 해줬어야 했기 때문에 즉시발동함수(IIFE)를 통해 조건문을 처리 하였습니다.
<a href="https://myhappyman.tistory.com/60">참고자료</a></p>
<h2 id="파일-트리-구조">파일 트리 구조</h2>
<p>├── Components
│   ├── Atoms
│   │   ├── CardButton.js
│   │   ├── CatListCard.js
│   │   ├── CategoryButton.js
│   │   ├── CategorySubButton.js
│   │   ├── FooterAnchor.js
│   │   ├── FormLayout.js
│   │   ├── HeaderButton.js
│   │   ├── Input.js
│   │   ├── MainBannerDescription.js
│   │   ├── MainBannerTitle.js
│   │   └── SectionTitle.js
│   ├── Molecules
│   │   ├── CardCollection.js
│   │   ├── CatListMain.js
│   │   ├── CatListTop.js
│   │   ├── CategoriesItemInfo.js
│   │   ├── CategoriesItemInfoSub.js
│   │   ├── CategoryDropDown.js
│   │   ├── HeaderLogo.js
│   │   ├── HeaderMenu.js
│   │   ├── HeaderSignin.js
│   │   ├── LoginLayout.js
│   │   ├── MainBannerDescriptions.js
│   │   ├── MainCard.js
│   │   └── SignUpLayout.js
│   └── Organisms
│       ├── Categories
│       │   └── Categories.js
│       ├── CategoryListLayout
│       │   └── CategoryListLayout.js
│       ├── Discussions
│       │   └── Discussions.js
│       ├── Footer
│       │   └── Footer.js
│       ├── Header
│       │   └── Header.js
│       └── MainBanner
│           └── MainBanner.js
├── Define
│   ├── Constant.js
│   └── Enum.js
├── Enum.js
├── Pages
│   ├── CategoryBoard
│   │   ├── Board.css
│   │   ├── CategoryBoard.js
│   │   ├── CategoryForm.js
│   │   ├── CategoryHeader.js
│   │   └── CategoryPost.js
│   ├── CategoryList
│   │   └── CategoryList.js
│   ├── Login
│   │   └── Login.js
│   ├── Main
│   │   └── Main.js
│   ├── MyPage
│   │   └── MyPage.js
│   ├── Signup
│   │   └── Signup.js
│   └── Users
│       ├── BoardDetail.js
│       ├── CommentReply.js
│       ├── CommentView.js
│       ├── CommentWrite.js
│       ├── EditBoard.js
│       ├── EditUser.js
│       ├── LikeDisLike.js
│       ├── SingleComment.js
│       └── View.js
├── Routes.js
├── Styles
│   ├── GlobalStyles.js
│   └── Theme.js
├── index.js
└── store
    ├── actions
    │   └── index.js
    └── reducers
        └── index.js</p>
<p>23 directories, 58 files</p>
<h2 id="느낀점">느낀점...</h2>
<ul>
<li>기업협업 나갔던 에이블스토어에 대해 말씀 드리고 싶습니다. 개인적으로는 앞으로의 제 개발 인생에 정말 큰 도움이 되었다고 생각합니다. 10년차 개발자 분을 직접만나 이야기 나눠볼 수 있는 기회가 흔한 것이 아니었고, 저희의 고민들을 다 들어주시고, 저희의 입장에서 항상 말씀 해 주셨습니다. 
기업협업 나간 첫 날 차장님 께서 해주셨던 말씀이 참 기억에 남습니다. &quot;철학, 전략, 툴을 항상 고민해야한다. 툴은 나머지 두 개 보다 중요도가 떨어진다.&quot;, &quot;항상 그걸 왜 그렇게 썼는지 고민하는 것이 중요하다.&quot;
너무 좋은 말씀들을 25일 동안 들었고 정말 감사하다고 다시 한 번 전하고 싶습니다!</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[2차 프로젝트 후기]]></title>
            <link>https://velog.io/@0_0/2%EC%B0%A8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%ED%9B%84%EA%B8%B0</link>
            <guid>https://velog.io/@0_0/2%EC%B0%A8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%ED%9B%84%EA%B8%B0</guid>
            <pubDate>Sun, 17 Jan 2021 13:39:13 GMT</pubDate>
            <description><![CDATA[<h1 id="wecode-tway항공-클론코딩front-end">WeCode Tway항공 클론코딩(Front-End)</h1>
<h2 id="프로젝트-소개-🤔">프로젝트 소개 🤔</h2>
<ul>
<li>Tway 항공 공식홈페이지의 메인, 로그인 &amp; 회원가입, 예매페이지, 탑승자 정보 페이지 등을 학습 목적으로 클론코딩 하였습니다.</li>
<li><a href="https://github.com/wecode-bootcamp-korea/15-2nd-tangWay-frontend">Github</a></li>
<li><a href="https://www.youtube.com/watch?v=PH3TYy1CKzo">영상</a></li>
</ul>
<h2 id="개발-기간-🤔">개발 기간 🤔</h2>
<ul>
<li>2020년 12월 28일 ~ 2021년 01월 08일(12일)</li>
</ul>
<h2 id="팀원-🤔">팀원 🤔</h2>
<ul>
<li>프론트 4명 (나(PM), 임대호, 김찬영, 강경오)</li>
<li>백엔드 2명 (문승희, 최선우)</li>
</ul>
<h2 id="기술-스택-및-구현-기능-🤔">기술 스택 및 구현 기능 🤔</h2>
<h3 id="프론트엔드">프론트엔드</h3>
<ul>
<li>HTML</li>
<li>JavaScript</li>
<li>React(CRA, Functional Component)</li>
<li>hook</li>
<li>Sass</li>
<li>Redux</li>
<li>styled-component</li>
</ul>
<h3 id="구현-기능">구현 기능</h3>
<p>제가 구현 한 부분은 ✅, 팀원이 구현 한 부분은 👏🏻</p>
<ol>
<li>회원가입(소셜 로그인) / 로그인 페이지 👏🏻</li>
<li>메인 페이지 👏🏻</li>
<li>항공권 예매 페이지 ✅</li>
<li>탑승자 정보 페이지 👏🏻</li>
</ol>
<h3 id="담당한-기능">담당한 기능</h3>
<p>제가 맡은 부분은 <strong>항공권 예매 페이지(3)</strong> 입니다.</p>
<ul>
<li>함수형 컴포넌트, React hooks를 사용하여 state관리</li>
<li>useEffect, keyframes로 로딩스피너 구현</li>
<li>백엔드에서 fetch 함수로 받아온 데이터를 화면 UI에 맞게 가공</li>
<li>협업 과정에서 나타날 수 있는 Git conflict 해결, Git squash, rebase 사용요령 습득</li>
<li>styled-component의 theme, GlobalStyles 관리 및 props 사용을 통한 UI 변화</li>
<li>백엔드에 등록되어 있는 출발 시간, 도착 시간 차이를 통한 UI 구성 (moment.js)</li>
</ul>
<h3 id="아쉬운-부분">아쉬운 부분</h3>
<p><strong>전역으로 상태를 관리할 수 있는 방법(Context API, 리덕스)을 알았다면...</strong>
T&#39;way 홈페이지가 항공 예매 웹사이트인 만큼 예매 플로우를 구현하려 정말 노력을 많이 했습니다. 구현을 하다보니 메인 페이지에 썼던 상태 값들이 백엔드와 통신 없이 예매 페이지에서도 필요한 경우가 많았습니다. 이러한 문제를 해결하기 위해 전역으로 상태를 관리할 수 있는 방법을 찾아야 했습니다. 결국 리덕스를 사용 하였지만 사실 제가 정확하게 알고 썼다고 자부할 수 없었습니다. 이제 필요성을 알았으니 다음 프로젝트에서 만약 상태를 전역으로 관리해야 한다면 Context API, 리덕스 둘의 차이점을 정확하게 알고 목적에 맞게 사용할 수 있도록 하겠습니다.</p>
<h3 id="기억하고-싶은-코드">기억하고 싶은 코드</h3>
<p><img src="https://images.velog.io/images/0_0/post/8bd5b03b-4a7a-4a43-b857-5152b682ec46/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-02-22%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.20.16.png" alt=""></p>
<h2 id="느낀점">느낀점...</h2>
<ul>
<li>이전 프로젝트에서는 branch만 각각 파서 commit을 여러 번 남기며 Github에 push 하였는데, 이번엔 Git rebase, squash를 통해 commit을 하나만 남겨야 한다는 과제를 받았습니다. 처음엔 어렵고, 잘못하면 commit이 다 날라갈 수도 있고(옆 동기분께서 직접 보여주셨습니다...), 시간여행에 빠질 수 있는(본인이 원하지 않는 commit 상태로 돌아간 경우) rebase, squash를 왜 하나 생각했습니다! 그렇지만, 사실 지금의 프로젝트 크기가 아니라 하나의 repository에 100명, 200명 아니면 그 이상의 개발자들이 commit을 남긴다면 참 관리하기 힘들겠구나... 라는 생각이 들었습니다. Git에 대해 조금 더 공부할 필요성을 느꼈습니다!!</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[1차 프로젝트 후기]]></title>
            <link>https://velog.io/@0_0/1%EC%B0%A8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%ED%9B%84%EA%B8%B0</link>
            <guid>https://velog.io/@0_0/1%EC%B0%A8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%ED%9B%84%EA%B8%B0</guid>
            <pubDate>Sun, 27 Dec 2020 05:30:42 GMT</pubDate>
            <description><![CDATA[<h1 id="wecode-boopdoggy-클론코딩front-end">WeCode boopdoggy 클론코딩(Front-End)</h1>
<h2 id="프로젝트-소개-🤔">프로젝트 소개 🤔</h2>
<ul>
<li>강아지 사료를 전문적으로 제공하는 외국 커머스 사이트 클론 코딩</li>
<li><a href="https://github.com/wecode-bootcamp-korea/15-1st-boomdoggy-frontend">Github</a></li>
<li><a href="https://www.youtube.com/watch?v=F87SbtYNMQs">영상</a></li>
</ul>
<h2 id="개발-기간-🤔">개발 기간 🤔</h2>
<ul>
<li>2020년 12월 14일 ~ 2020년 12월 24일(11일)</li>
</ul>
<h2 id="팀원-🤔">팀원 🤔</h2>
<ul>
<li>프론트 3명</li>
<li>백엔드 2명</li>
</ul>
<h2 id="기술-스택-및-구현-기능-🤔">기술 스택 및 구현 기능 🤔</h2>
<h3 id="프론트엔드">프론트엔드</h3>
<ul>
<li>React.js(class component)</li>
<li>React Router</li>
<li>Sass/Scss</li>
</ul>
<h3 id="구현-기능">구현 기능</h3>
<p>제가 구현 한 부분은 ✅, 팀원이 구현 한 부분은 👏🏻</p>
<ol>
<li>회원가입 / 로그인 페이지 👏🏻</li>
<li>메인 페이지 👏🏻</li>
<li>상품 리스트 페이지 ✅</li>
<li>상품 디테일 페이지 👏🏻</li>
<li>장바구니 👏🏻</li>
<li>전체상품 search 페이지 ✅</li>
<li>리뷰 페이지 👏🏻</li>
</ol>
<p>제가 맡은 부분은 <strong>상품 리스트 페이지(3), 전체상품 search 페이지(6)</strong> 입니다.
특히, <strong>상품 리스트 페이지의 경우 category가 바뀔 때 마다 다른 상품의 데이터를 받아올 수 있도록 코드를 작성 하였고, title 기준 오름 / 내림차순, price 기준 오름 / 내림차순 정렬 할 수 있도록 로직을 구성했습니다.</strong></p>
<h3 id="아쉬운-부분">아쉬운 부분</h3>
<p><img src="https://images.velog.io/images/0_0/post/9e565fab-858a-49cb-bc4c-579408335a22/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-12-27%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%203.41.38.png" alt=""></p>
<p>상품 리스트는 총 3가지 경우로 분리되었습니다. (일반 상품, 세일 하는 상품, 재고가 없는(Sold Out) 상품) 
세 가지 컴포넌트를 따로 만들어 조건을 걸어 렌더링 해주었는데, 세 가지 컴포넌트에도 서로서로 겹치는 부분이 많았습니다. 이에, 세 가지 컴포넌트에 공통적인 부분을 하나의 컴포넌트로 만들고, 달라지는 부분만 조건을 다르게 걸어 렌더링 했다면 조금 더 반복되는 코드가 줄어들었을 거라 생각합니다.</p>
<h3 id="기억하고-싶은-부분-1">기억하고 싶은 부분 1</h3>
<p>카테고리를 구성할 때 select, option Tag를 사용하여 하였습니다.
문제는! 제가 페이지를 새로고침 했을 때 제가 선택한 카테고리에 있지 않고, 항상 첫 카테고리로 UI가 바뀌는 것을 확인할 수 있었습니다.
<img src="https://images.velog.io/images/0_0/post/1062c9cf-072c-42f7-bd1e-ed0b7db4c639/%EC%8A%A4%ED%81%AC%EB%A6%B0%EC%83%B7%202020-12-19%20%EC%98%A4%EC%A0%84%201.04.03.jpg" alt="">
이 부분에서 공식문서의 중요성을 한 번 더 느낄 수 있었습니다. 제가 참고한 부분은 <a href="https://ko.reactjs.org/docs/forms.html">https://ko.reactjs.org/docs/forms.html</a> 의 select 태그 부분입니다.
상품 카테고리가 바뀔 때 마다 option tag의 value부분에 사용 했던 값을 setState 해주고, 그 값을 select tag의 value부분에 할당 했습니다.</p>
<h3 id="기억하고-싶은-부분-2">기억하고 싶은 부분 2</h3>
<pre><code>product.price.toLocaleString(&#39;en-US&#39;, {
                  style: &#39;currency&#39;,
                  currency: &#39;EUR&#39;,
                })</code></pre><p>가격을 받아 원하는 형식으로 처리해주기 위해서 toLocaleString 메서드를 사용하였습니다. mdn 사이트에서 참고 하였습니다.
<a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/toLocaleString">https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/toLocaleString</a></p>
<h2 id="파일-트리-구조">파일 트리 구조</h2>
<p>├── Components
│   ├── Footer
│   │   ├── Footer.jsx
│   │   └── Footer.scss
│   ├── MainHeader
│   │   ├── MainHeader.jsx
│   │   ├── MainHeader.scss
│   │   └── mainHeader_img.jpg
│   ├── Nav
│   │   ├── Nav.jsx
│   │   └── Nav.scss
│   ├── Reviews
│   │   ├── Components
│   │   │   └── ReviewCard
│   │   │       ├── ReviewCard.jsx
│   │   │       └── ReviewCard.scss
│   │   ├── Reviews.jsx
│   │   └── Reviews.scss
│   └── Search
│       ├── SearchBarModal.jsx
│       ├── SearchBarModal.scss
│       ├── SearchResults.jsx
│       └── SearchResults.scss
├── Pages
│   ├── Account
│   │   ├── Account.jsx
│   │   └── Account.scss
│   ├── Cart
│   │   ├── Cart.jsx
│   │   ├── Cart.scss
│   │   └── Components
│   │       └── CartList
│   │           ├── CartList.jsx
│   │           └── CartList.scss
│   ├── Login
│   │   ├── Components
│   │   │   ├── SignIn.jsx
│   │   │   ├── SignIn.scss
│   │   │   ├── SignUp.jsx
│   │   │   └── SignUp.scss
│   │   ├── Login.jsx
│   │   └── Login.scss
│   ├── Main
│   │   ├── Components
│   │   │   ├── Categories
│   │   │   │   ├── Categories.jsx
│   │   │   │   └── Categories.scss
│   │   │   ├── FeaturedProduct
│   │   │   │   ├── FeaturedProduct.jsx
│   │   │   │   └── FeaturedProduct.scss
│   │   │   ├── Features
│   │   │   │   ├── Features.jsx
│   │   │   │   ├── Features.scss
│   │   │   │   └── features_img.jpg
│   │   │   ├── Intro
│   │   │   │   ├── Intro.jsx
│   │   │   │   └── Intro.scss
│   │   │   └── Steps
│   │   │       ├── Steps.jsx
│   │   │       └── Steps.scss
│   │   └── Main.jsx
│   ├── ProductDetail
│   │   ├── Components
│   │   │   ├── ProductSection.jsx
│   │   │   ├── ProductSection.scss
│   │   │   ├── ReviewCard.jsx
│   │   │   ├── ReviewCard.scss
│   │   │   ├── Reviews.jsx
│   │   │   └── Reviews.scss
│   │   ├── ProductDetail.jsx
│   │   └── ProductDetail.scss
│   └── ProductList
│       ├── Components
│       │   ├── Option.jsx
│       │   ├── Product.jsx
│       │   ├── Product.scss
│       │   ├── ProductListHeader.jsx
│       │   ├── ProductListHeader.scss
│       │   ├── ProductSale.jsx
│       │   ├── ProductSale.scss
│       │   ├── ProductSoldOut.jsx
│       │   └── ProductSoldOut.scss
│       ├── Data
│       │   └── ProudctListData.js
│       ├── ProductList.jsx
│       └── ProductList.scss
├── Routes.js
├── config.js
├── fonts
│   ├── THICCCBOI-Black.woff2
│   ├── THICCCBOI-Bold.woff2
│   ├── THICCCBOI-ExtraBold.woff2
│   ├── THICCCBOI-Light.woff2
│   ├── THICCCBOI-Medium.woff2
│   ├── THICCCBOI-Regular.woff2
│   ├── THICCCBOI-SemiBold.woff2
│   ├── THICCCBOI-ThicccAF.woff2
│   └── THICCCBOI-Thin.woff2
├── index.js
└── styles
    ├── _color.scss
    ├── _font.scss
    ├── common.scss
    └── reset.scss</p>
<p>29 directories, 75 files</p>
<h2 id="느낀점">느낀점...</h2>
<ul>
<li>백엔드와의 소통이 정말 중요하다는 것을 느낄 수 있었습니다. 일단 제가 맡은 페이지가 백엔드에서 정보를 받아와서 보여줘야하는 부분이였는데 key값은 어떻게 줄 것인지, api 주소는 어떻게 되는지 하나하나 맞춰 가는 과정이 다들 처음이다 보니 순탄치 않았습니다. 다음 프로젝트에서는 이런 부분을 조금 보완해서 프로젝트를 진행해야 할 필요성을 뼈저리게 실감 하였습니다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[JS(Westagram.2)]]></title>
            <link>https://velog.io/@0_0/We.14JSWestagram.2</link>
            <guid>https://velog.io/@0_0/We.14JSWestagram.2</guid>
            <pubDate>Sun, 29 Nov 2020 12:54:53 GMT</pubDate>
            <description><![CDATA[<blockquote>
</blockquote>
<p>westagram에서 js로 기능 구현 했던 것 중 하나만 더 집고 넘어가고자 한다.</p>
<h3 id="아이디-검색-기능을-구현하며">아이디 검색 기능을 구현하며...</h3>
<blockquote>
</blockquote>
<p>핵심이라고 생각 했던 부분에서는 그렇게 헤메지 않았던 것 같은데 layout 부분에서 많이 헤맸던 것 같다.
먼저 헤맸던 부분을 살펴 보자면
<img src="https://images.velog.io/images/0_0/post/b6d44b99-7656-4c4b-8d5a-e3440ed959f0/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-11-29%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.26.26.png" alt="">
id search input과 그 모달창의 layout이 지금은 큰 문제 없이 잘 정렬되어 있다. 화면을 줄이거나 늘려도 layout이 무너지지 않는다. 하지만 이렇게 수정하기 전에는 화면을 줄였을 때 모달창의 layout과 id search input의 layout이 맞지 않는 현상을 발견했다. 문제를 해결하기 위하여 먼저 id search input과 모달창을 하나의 박스로 묶어 주었다.
<img src="https://images.velog.io/images/0_0/post/a4624880-c1ef-4a54-aac3-90d9a3868cd8/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-11-29%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.32.41.png" alt="">
그 후 css에서
<img src="https://images.velog.io/images/0_0/post/5523ec03-b41d-4979-a9d2-007bf9051432/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-11-29%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.34.17.png" alt="">
모달창의 상위태그인 wrapping 박스를 position: relative로 주고
<img src="https://images.velog.io/images/0_0/post/421211d7-697d-44d0-a79b-8fe29d5b3ec5/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-11-29%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.35.25.png" alt="">
모달창의 position을 absolute로 줘서 모달창이 warpping 박스를 기준으로 움직일 수있게 하였더니 해결 되었다!</p>
<h3 id="아이디-검색-기능">아이디 검색 기능</h3>
<blockquote>
</blockquote>
<p>본론으로 돌아와 아이디 검색은 다음과 같이 하고자 하였다</p>
<ul>
<li>search input에 값이 없을 때, focusout 됐을 때, modal창 display: none처리</li>
<li>search input에 일치하는 id가 있을 때 modal창 display: block 처리</li>
<li>search input에 일치하는 id가 없을 때 id가 존재하지 않음을 처리</li>
<li>search input에 다시 focusin 됐을 때, modal창에 현재 input value 값이 나올 수 있도록 구현</li>
</ul>
<blockquote>
</blockquote>
<ul>
<li>아이디 검색 코드
<img src="https://images.velog.io/images/0_0/post/20f1e6c5-3910-4979-89b0-8a326848e165/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-11-29%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.41.28.png" alt="">
위에서 설명한 대로 input에 addEventListener를 등록하여 keyup이 되고 input.value에 값이 있을 경우 findSearchid라는 함수를 동작하게 하였다.
<img src="https://images.velog.io/images/0_0/post/26e03569-861c-4253-95cc-87e8eaf000d6/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-11-29%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.44.00.png" alt="">
findSearchId 함수에서는 obj에 dummyDate의 데이터를 하나씩 가져와 filter 함수를 통해 문자열에 navInput.value 값이 있는지 없는지를 비교하였다. indexOf 함수를 사용하여 매치되는 문자열이 없다면 -1을 리턴할 것이기 때문에 -1이 아닌 모든 값을 배열로 만들어 showSearchValue함수로 전달해 주었다.
<img src="https://images.velog.io/images/0_0/post/861534d1-af2f-4b2c-91ce-1bafbb8b9fc5/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-11-29%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.49.54.png" alt="">
showSearchValue 함수에서는 findSearchId함수의 리턴 값을 받아 화면에 layout 해주는 역할을 하였다. </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[JS(Westagram.1)]]></title>
            <link>https://velog.io/@0_0/We.14JSWestagram.1</link>
            <guid>https://velog.io/@0_0/We.14JSWestagram.1</guid>
            <pubDate>Sun, 29 Nov 2020 12:01:13 GMT</pubDate>
            <description><![CDATA[<h3 id="westagram-정리를-시작하며">westagram 정리를 시작하며...</h3>
<blockquote>
</blockquote>
<p>한동안 블로그를 소홀히 했다... 사실이다... 변명을 조금 해보자면 이번에 부트캠프에서 코딩을 공부하게 되었는데 내가 소화할 수 있는 양보다 더 많은 것들을 소화해 내야 했다... 또 조금이라도 이해가 안가거나 이상하면 완전히 이해가 될 때 까지 파고 드는 성격 탓에 남들보다 시간이 더 많이 걸리는 것 같기도 하다... 컨디션도 정상이 아니였다... 부트캠프에 조금은 적응 한 것 같으니 일단 욕심을 조금 버리고(안버려진다...ㅜㅜ) westagram clone 코딩 한 부분 중 정리하고 싶은 부분을 블로그 한다!</p>
<h3 id="먼저-레이아웃-입니다">먼저! 레이아웃 입니다!</h3>
<blockquote>
</blockquote>
<p><img src="https://images.velog.io/images/0_0/post/9c232750-5037-4c09-87d9-38912489f435/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-11-29%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%207.25.02.png" alt="">
이런식으로 만들어 보았습니다.</p>
<h3 id="js-구현-사항">js 구현 사항</h3>
<blockquote>
</blockquote>
<ul>
<li>ID, PW 입력 시 로그인 버튼 활성화 기능</li>
<li>댓글 내용 입력 후 Enter press, 혹은 게시 버튼 클릭 시 댓글 추가 기능</li>
<li>ID, PW validation</li>
<li>댓글 좋아요 / 삭제 기능</li>
<li>아이디 검색 기능</li>
<li>nav 프로필 사진 클릭 시 메뉴 박스 생성</li>
</ul>
<h3 id="정리하고-싶은-부분">정리하고 싶은 부분</h3>
<blockquote>
</blockquote>
<ul>
<li>기능 구현에 앞서 ...
필요한 개념은 event.target, 고유한 id, capturing/bubbling, 좋아요를 불리언 값으로 생각 했을 때 그에 대한 정보는 어떻게 처리할 것인가 입니다!
먼저 댓글을 생성할 때 고유한 id를 부여합니다.
new Date().getTime() 은 현재시간을 ms단위로 바꿔주는 함순인데 완전히 고유한 id는 아니지만, 기계로 누르지 않는 이상 고유한 id로 사용할 수 있을 것 같아 댓글 생성의 id로 사용하게 되었습니다.<br></li>
<li>댓글 삭제 기능 코드
<img src="https://images.velog.io/images/0_0/post/2cb61aaf-2a62-4c62-b17a-97b4b196aba7/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-11-29%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%208.08.07.png" alt="">
<img src="https://images.velog.io/images/0_0/post/e926fcca-44ee-4f8a-bd4d-9e4e897d8fce/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-11-29%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%208.56.08.png" alt="">
댓글삭제 버튼을 눌렀을 때 그와 일치하는 id를 가진 상위 태그를 가져와 지워버리는 흐름으로 진행 했습니다. 그와 동시에 obj에 담겨져 있던 댓글 좋아요의 정보도 같이 삭제(deleteObjCommentLike()) 하고 다시 받아 올 수 있도록(refreshLikeNumber()) 함수를 구성 하였습니다. <br></li>
<li>이벤트는 버블링으로 인해 자식 요소에서 이벤트가 발생해도 부모 요소가 그 이벤트를 들을 수 있습니다. 그렇기 때문에 addEventListener 함수를 상위 태그에 걸어 주었습니다
<img src="https://images.velog.io/images/0_0/post/a75ec738-cbed-43d1-ac69-d6f5c743eda9/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-11-29%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%208.13.49.png" alt=""></li>
</ul>
<blockquote>
</blockquote>
<ul>
<li>댓글 좋아요
<img src="https://images.velog.io/images/0_0/post/57aabcbb-b425-4fe8-a834-f1f4215d6adb/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-11-29%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%208.22.01.png" alt="">
<img src="https://images.velog.io/images/0_0/post/99a8020c-1faf-4bf2-b6ad-1b79a4ddd662/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-11-29%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%208.27.53.png" alt="">
제가 고민한 부분은 좋아요 버튼을 누르면 누른 그 버튼은 빨간색으로 바뀌고 좋아요 숫자도 변경 가능하게 구현 하였습니다. 만약 여기서 좋아요 누른 버튼을 삭제 한다면 그에 따라 값이 변경 될 수 있도록 구현 하였습니다.
<img src="https://images.velog.io/images/0_0/post/01bbb8f2-1b67-40f0-8349-458bfbd13490/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-11-29%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%208.32.34.png" alt="">
좋아요를 취소한다면 그에 맞게 좋아요 숫자가 변화 할 수 있게 구현 하였습니다.
<img src="https://images.velog.io/images/0_0/post/cf913ae3-119c-4276-879a-8d0f54f4b492/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-11-29%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%208.33.46.png" alt=""><br></li>
<li>좋아요 버튼 코드
<img src="https://images.velog.io/images/0_0/post/6ad24d87-b801-4571-910f-e72135e2bd6d/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-11-29%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%208.37.03.png" alt="">
<img src="https://images.velog.io/images/0_0/post/42a078bc-f58b-4189-97c3-4207d76d6914/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-11-29%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%208.37.13.png" alt="">
클릭 되었을 때 그 버튼의 고유한 id를 obj에 저장 된 각 item의 id와 비교합니다. 이때, map 함수를 사용하여 지금 클릭한 id와 obj에 저장 된 item의 id가 같은 경우 좋아요 버튼의 불리언 값을 비교 합니다. 만약 그 값이 true 였다면 false로 바꿔주고, false 였다면 true로 바꿔 obj 값을 update해 줍니다. 그 이후 refreshLikeNumber 함수를 호출 하여 filter 함수로 obj의 item 중 좋아요 버튼이 true 값들만 다시 만들어줍니다. 그 값의 길이를 innerText로 업데이트 하는 방식을 구현했습니다.</li>
</ul>
<blockquote>
</blockquote>
<h3 id="정리를-마치며">정리를 마치며...</h3>
<p>항상 코드를 짜거나 뭔가를 할 때 남에게 충분히 설명할 수 있게 하려 합니다. 설명이 가능하다는 것은 제가 100% 이해 했기 때문에 저한테도 좋고, 상대방도 뭔가를 배울 수 있어 서로 Win-Win 할 수 있습니다. 아직 많이 아쉬운 코드들이긴 하지만 조금씩 조금씩 고쳐 나가겠습니다!
<strong>2탄에 계속됩니다 !</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL. 201101_PYTHON(4)]]></title>
            <link>https://velog.io/@0_0/TIL.-201101PYTHON4</link>
            <guid>https://velog.io/@0_0/TIL.-201101PYTHON4</guid>
            <pubDate>Sun, 01 Nov 2020 12:19:13 GMT</pubDate>
            <description><![CDATA[<h2 id="61-70-리뷰">61-70 리뷰</h2>
<ul>
<li><h3 id="61-문자열-압축하기">61: 문자열 압축하기</h3>
<blockquote>
</blockquote>
<pre><code>data = list(input())
s = &#39;&#39;
count = 0
s += data[0]
for i in range(0, len(data) -1):
  count += 1
  if data[i] != data[i+1]: # 문자열이 바뀔 때 처리 !
      s += str(count)
      s += data[i+1]
      count = 0
  if len(data)-2 == i: # 문자열의 마지막 문자 처리 !
      count += 1
      s += str(count) 
print(s)</code></pre></li>
</ul>
<h3 id="62-20190923-출력하기">62: 20190923 출력하기</h3>
<blockquote>
</blockquote>
<pre><code>data = &quot;aacdddddddddeee&quot;
a = str(data.count(&quot;a&quot;))
b = str(data.count(&quot;b&quot;))
c = str(data.count(&quot;c&quot;))
d = str(data.count(&quot;d&quot;))
e = str(data.count(&quot;e&quot;))
print(a+b+c+d+b+d+a+e)</code></pre><h3 id="63-친해지고-싶어">63: 친해지고 싶어</h3>
<blockquote>
</blockquote>
<pre><code>data = list(map(str, input().split()))
for sentence in data:
    print(sentence[0], end = &quot;&quot;)</code></pre><h3 id="64-이상한-엘레베이터">64: 이상한 엘레베이터</h3>
<blockquote>
</blockquote>
<pre><code>num = int(input())
def check(num):
    if num % 7 == 0:
        return num // 7
    elif (num % 7) % 3 == 0:
        return (num // 7) + ((num % 7) // 3)
    elif num % 3 == 0:
        return num // 3
    else:
        return -1 
print(check(num))</code></pre><ul>
<li>이렇게 처리할 수 도 있음!(답안)<pre><code># 답안
N = int(input())
result = 0
while True:
  if N%7 ==0:
      result += N//7
      print(result)
      break
  N -= 3
  result += 1
  if N &lt; 0:
      print(-1)
      break</code></pre></li>
</ul>
<h3 id="65-변형된-리스트">65: 변형된 리스트</h3>
<blockquote>
</blockquote>
<pre><code>a = [1, 2, 3, 4]
b = [&#39;a&#39;,&#39;b&#39;,&#39;c&#39;,&#39;d&#39;]
l = []
for i in range(0, len(a)):
    if i % 2 == 0:
        l.append([a[i],b[i]])
    else:
        l.append([b[i],a[i]])
print(l)</code></pre><ul>
<li>답안이 조금 더 깔끔 (zip함수)<pre><code># 답안
a = input().split(&#39; &#39;)
b = input().split(&#39; &#39;)
c = []
count = 0
for i, j in zip(a, b):
  if count % 2 == 0:
      c.append([i, j])
  else:
      c.append([j, i])
  count += 1
print(c)</code></pre></li>
</ul>
<h3 id="66-블럭탑쌓기">66: 블럭탑쌓기</h3>
<blockquote>
</blockquote>
<p>예를 들면 정해진 순서가 BAC 라면 A 다음 C가 쌓아져야 합니다.
선행으로 쌓아야 하는 블럭이 만족된 경우라면 탑이 무너지지 않습니다.</p>
<ol>
<li>B를 쌓지 않아도 A와 C를 쌓을 수 있습니다.</li>
<li>B 다음 블럭이 C가 될 수 있습니다.</li>
<li>블럭은 알파벳 대문자로 표기합니다.</li>
<li>규칙에 없는 블럭이 사용될 수 있습니다.</li>
<li>중복된 블럭은 존재하지 않습니다.<pre><code>탑 = [&quot;ABCDEF&quot;, &quot;BCAD&quot;, &quot;ADEFQRX&quot;, &quot;BEDFG&quot;, &quot;EFGHZ&quot;]
규칙 = &quot;ABD&quot;
result = []
def solution(top, rule):
 l = []
 for e in rule:
     if e in top:
         l.append(top.index(e))
 if l == sorted(l):
     result.append(&quot;가능&quot;)
 else:
     result.append(&quot;불가능&quot;)
for i in range(0, len(탑)):
 solution(탑[i], 규칙)            
print(result)</code></pre></li>
</ol>
<ul>
<li>답안<pre><code># 답안
탑 = [&quot;ABCDEF&quot;, &quot;BCAD&quot;, &quot;ADEFQRX&quot;, &quot;BEDFG&quot;, &quot;EFGHZ&quot;]
규칙 = &quot;ABD&quot;
result = []
def solution(top, rule):
  st = rule.index(rule[0]) # 기준점을 잡는다...
  for e in top:
      if e in rule:
          if st &gt; rule.index(e):
              return &quot;불가능&quot;
          st = rule.index(e) # 기준점을 바꾸면서 규칙을 다시 확인한다... index를 비교한다 !
  return &quot;가능&quot;
for i in range(0, len(탑)):
  result.append(solution(탑[i], 규칙))           
print(result)</code></pre></li>
<li>내가 푼 것과 답안의 차이 !
나는 rule을 for문으로 돌리고 탑의 index 값을 가져와서 sorted로 비교 !
답안은 rule값 하나를 기준으로 잡고, 탑을 for문으로 돌리며 기준으로 잡은 값과 index 비교</li>
</ul>
<h3 id="67-민규의-악수">67: 민규의 악수</h3>
<blockquote>
</blockquote>
<ol>
<li>악수는 모두 1대 1로 진행이 된다.</li>
<li>민규를 제외한 모든 참가자는 자신을 제외한 참가자와 모두 한번씩 악수를 한다.</li>
<li>같은 상대와 중복된 악수는 카운트 하지 않는다.</li>
<li>민규를 제외한 참가자는 행사를 모두 마쳤다.<pre><code>def solution(n):
 a = 1
 while (a * (a - 1)) / 2 &lt; n:
     a += 1
 t = int(n - ((a - 1) * (a - 2) / 2))
 print([t, a]) 
solution(int(input()))</code></pre></li>
</ol>
<ul>
<li>a는 행사 참가자</li>
<li>t는 중간에 나간 사람(민규)의 악수 횟수</li>
</ul>
<h3 id="68-버스-시간표">68: 버스 시간표</h3>
<blockquote>
</blockquote>
<pre><code>data = [&quot;12:30&quot;, &quot;13:20&quot;, &quot;14:13&quot;]
time = list(map(int, input().split(&#39;:&#39;)))
time = time[0] * 60 + time[1]
time_change = []
result = []
for i in range(0, len(data)):
    e = list(map(int, data[i].split(&#39;:&#39;)))
    minute_convert = e[0] * 60 + e[1]
    time_change.append(minute_convert) 
for i in range(0, len(time_change)):
    change = time_change[i] - time
    if change &lt; 0:
        result.append(&#39;지나갔습니다&#39;)
    elif change &gt; 0:
        hour = change // 60
        if hour &lt; 10:
            hour = &#39;0&#39;+ str(hour)
        minute = change % 60
        if minute &lt; 10:
            minute = &#39;0&#39; + str(minute)
        result.append(f&#39;{hour}시간 {minute}분&#39;)        
print(result)</code></pre><ul>
<li>zfill 사용할 수 있다 !</li>
<li>파이썬 문자열 앞 0으로 채우기 !</li>
<li>&quot;3&quot;.zfill(3) -&gt; 003</li>
</ul>
<h3 id="69-골드바흐의-추측">69: 골드바흐의 추측</h3>
<blockquote>
</blockquote>
<p>골드바흐의 추측(Goldbach&#39;s sonjecture)은 오래전부터 알려진 정수론의 미해결 문제로, 2보다 큰 모든 짝수는 두 개의 소수(Prime number)의 합으로 표시할 수 있다는 것이다. 이때 하나의 소수를 두 번 사용하는 것은 허용한다. -위키백과 <br>
위 설명에서 2보다 큰 모든 짝수를 두 소수의 합으로 나타낸 것을 골드바흐 파티션이라고 합니다. <br>
예)
100 == 47 + 53
56 == 19 + 37 <br>
2보다 큰 짝수 n이 주어졌을 때, 골드바흐 파티션을 출력하는 코드를 작성하세요.</p>
<pre><code># 소수 구하기
def prime_list(n):
    # 에라토스테네스의 체 초기화: n개 요소에 True 설정(소수로 간주)
    sieve = [True] * n
    # n의 최대 약수가 sqrt(n) 이하이므로 i=sqrt(n)까지 검사
    m = int(n ** 0.5)
    for i in range(2, m + 1):
        if sieve[i] == True:           # i가 소수인 경우
            for j in range(i+i, n, i): # i이후 i의 배수들을 False 판정
                sieve[j] = False
    # 소수 목록 산출
    return [i for i in range(2, n) if sieve[i] == True]
#골드바흐 파티션
prime_numbers = prime_list(10000) # 10000까지의 수에서 소수를 다 구해 놓는다 !
number = int(input())
one_prime = 2
l = []
while True:
    if one_prime == 2:
        if one_prime in prime_numbers:
            two_prime = number - one_prime
            if two_prime in prime_numbers:
                l.append((one_prime, two_prime))
        one_prime += 1
    else:    
        if one_prime in prime_numbers:
            two_prime = number - one_prime
            if two_prime in prime_numbers:
                l.append((one_prime, two_prime))
        one_prime += 2
    if one_prime &gt; number:
        break
print(l)</code></pre><ul>
<li>에라토스테네스의 체를 통해서 일정 수준 이상의 소수를 전부 구해 놓고,</li>
<li>number를 받았을 때 구해 놓은 소수를 하나하나 비교하는 방식으로 풀이</li>
<li>소수 2부터 시작해서 홀수 값만 비교 ! 왜...? -&gt; 짝수값은 소수가 될 수 없음</li>
<li>소수 값 하나와 그 소수 값을 number에서 뺏을 때 소수 값이 나오면 출력</li>
</ul>
<h3 id="70-행렬-곱하기">70: 행렬 곱하기</h3>
<blockquote>
</blockquote>
<pre><code>a = ([1, 2],
     [2, 4])
b = ([1, 0],
     [0, 3])
def check(a, b):
    if len(a[0]) != len(b):
        print(-1) 
    else:
        result_1 = (a[0][0] * b[0][0] + a[0][1] * b[1][0])
        result_2 = (a[0][0] * b[0][1] + a[0][1] * b[1][1])
        result_3 = (a[1][0] * b[0][0] + a[1][1] * b[1][0])
        result_4 = (a[1][0] * b[0][1] + a[1][1] * b[1][1])
        print(f&quot;([{result_1}, {result_2}], [{result_3}, {result_4}])&quot;)    
check(a, b)</code></pre><ul>
<li>답안<pre><code>a = ([1, 2],
   [2, 4])
b = ([1, 0],
   [0, 3])
def sol(a, b):
  c = []
  if len(a[0]) == len(b):
      for i in range(len(a)):
          c.append([0]*len(b[0])) # 값이 들어갈 자리를 셋팅 0으로 !
          print(c)
      for i in range(len(c)): # (0, 0) -&gt; (1, 0)
          for j in range(len(c[i])): # (0, 0) -&gt; (0, 1)
              for k in range(len(a[i])): # A[0][0] * B[0][0] -&gt; A[0][1] * B[1][0] 
                  c[i][j] += a[i][k] * b[k][j] # for문 3개 돌리기...아...
      return c
  else:
      return -1
sol(a, b)</code></pre></li>
<li>list comprehension + zip함수로 문제를 푼 경우<pre><code>a = ([1, 2],
   [2, 4])
b = ([1, 0],
   [0, 3])
def productMatrix(A, B):
  return [[sum(a*b for a, b in zip(A_row,B_col)) for B_col in zip(*B)] for A_row in A] # zip(*) -&gt; 열(column)으로 묶어준다...
productMatrix(a, b)</code></pre></li>
<li>출처: <a href="https://geonlee.tistory.com/110">https://geonlee.tistory.com/110</a> [빠리의 택시 운전사]</li>
<li>마지막 방법이 정말 깔끔하다고 느꼈는데... 저렇게 생각하기가 쉽지 않았다..</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL. 201030_PYTHON(3)]]></title>
            <link>https://velog.io/@0_0/TIL.-201030PYTHON3</link>
            <guid>https://velog.io/@0_0/TIL.-201030PYTHON3</guid>
            <pubDate>Fri, 30 Oct 2020 13:53:44 GMT</pubDate>
            <description><![CDATA[<h2 id="51-60-리뷰">51-60 리뷰</h2>
<p>개인적으로 너무 어려웠고...한 문제 푸는데 시간도 오래걸린다...
자료구조&amp;알고리즘 처음 공부하는 거니 욕심버리고 꾸준히 할 것 !</p>
<h3 id="51-merge-sort를-만들어보자">51: merge sort를 만들어보자</h3>
<blockquote>
<p>병합정렬(merge sort)은 대표적인 정렬 알고리즘 중 하나로 다음과 같이 동작합니다.</p>
</blockquote>
<ol>
<li>리스트의 길이가 0또는 1이면 이미 정렬된 것으로 본다. 그렇지 않은 경우에는</li>
<li>정렬되지 않은 리스트를 절반으로 잘라 비슷한 크기의 두 부분 리스트로 나눈다.</li>
<li>각 부분 리스트를 재귀적으로 합병 정렬을 이용해 정렬한다.</li>
<li>두 부분 리스트를 다시 하나의 정렬된 리스트로 합병한다.
(출처: 위키피디아)<pre><code>def 병합정렬(입력리스트):
 입력리스트길이 = len(입력리스트)
 if 입력리스트길이 &lt;= 1:
     return 입력리스트
 중간값 = 입력리스트길이 // 2
 그룹_하나 = 병합정렬(입력리스트[:중간값])
 그룹_둘 = 병합정렬(입력리스트[중간값:])
 결과값 = []
 while (그룹_하나) and (그룹_둘):
     if (그룹_하나 &lt; 그룹_둘):
         결과값.append(그룹_하나.pop(0))
     else:
         결과값.append(그룹_둘.pop(0))
 while 그룹_하나:
     결과값.append(그룹_하나.pop(0))
 while 그룹_둘:
     결과값.append(그룹_둘.pop(0))
 return 결과값
주어진리스트 = [180, 145, 165, 45, 170, 175, 173, 171]
print(병합정렬(주어진리스트))</code></pre></li>
</ol>
<h3 id="52-quick-sort">52: quick sort</h3>
<blockquote>
</blockquote>
<pre><code>def 퀵정렬(입력리스트):
    입력리스트의길이 = len(입력리스트)
    if 입력리스트의길이 &lt;= 1:
        return 입력리스트
    기준값 = 입력리스트.pop(입력리스트의길이//2)
    그룹_하나 = []
    그룹_둘 = []
    for i in range(입력리스트의길이-1):
        if 기준값 &gt; 입력리스트[i]:
            그룹_하나.append(입력리스트[i])
        else:
            그룹_둘.append(입력리스트[i])
    return 퀵정렬(그룹_하나) + [기준값] + 퀵정렬(그룹_둘)
주어진리스트 = input().split(&#39; &#39;)
주어진리스트 = [int(i) for i in 주어진리스트]
print(퀵정렬(주어진리스트))</code></pre><h3 id="53-괄호-문자열">53: 괄호 문자열</h3>
<blockquote>
</blockquote>
<pre><code>def math(e):
    if e.count(&#39;(&#39;) != e.count(&#39;)&#39;):
        return False
    괄호 = []
    for i in e:
        if i == &#39;(&#39;:
            괄호.append(&#39;(&#39;)
        if i == &#39;)&#39;:
            if len(괄호) == 0:
                return False
            괄호.pop()
    return True
n = input()
if math(n) == True:
    print(&quot;YES&quot;)
else:
    print(&quot;NO&quot;)</code></pre><ul>
<li>일단 &#39;(&#39;와 &#39;)&#39;의 갯수가 맞아야한다</li>
<li>&#39;)&#39;가 먼저 나오는 순간 잘못된 문자열</li>
<li>&#39;(&#39;가 나오는 순간 &#39;)&#39;도 언젠간 나와야한다</li>
<li>&#39;(&#39;와 &#39;)&#39;을 짝지어 준다고 생각하자...! 짝이 맞는 순간 pop 해버리자</li>
</ul>
<h3 id="54-연속되는-수">54: 연속되는 수</h3>
<blockquote>
</blockquote>
<pre><code>data = list(map(int, input().split()))
data.sort()
def check():
    for i in range(0, len(data) - 1):
        if data[i] + 1 != data[i+1]:
            return print(&quot;NO&quot;)
    return print(&quot;YES&quot;)
check()</code></pre><h3 id="55-하노이의-탑">55: 하노이의 탑</h3>
<blockquote>
</blockquote>
<p>하노이의 탑은 프랑스 수학자 에두아르드가 처음으로 발표한 게임입니다. 하노이의 탑은 A, B, C 3대의 기둥과 기둥에 꽂을 수 있는 N개의 원판으로 이루어져 있습니다. 이 게임에서 다음의 규칙을 만족해야 합니다.</p>
<ol>
<li>처음에 모든 원판은 A기둥에 꽂혀 있다.</li>
<li>모든 원판의 지름은 다르다.</li>
<li>이 원반은 세 개의 기둥 중 하나에 반드시 꽂혀야 한다.</li>
<li>작은 원반 위에 큰 원반을 놓을 수 없다.</li>
<li>한 번에 하나의 원판(가장 위에 있는 원판) 만을 옮길 수 있다.<pre><code>원판의이동경로 = []
def 하노이(원반의수, 시작기둥, 목표기둥, 보조기둥):
 #원판이 한개일 때에는 옮기면 됩니다.
 if 원반의수 == 1:
     원판의이동경로.append([시작기둥, 목표기둥]) 
     return None
 #원반의 n-1개를 보조기둥으로 옮기고
 하노이(원반의수-1, 시작기둥, 보조기둥, 목표기둥)
 #가장 큰 원반은 목표기둥으로
 원판의이동경로.append([시작기둥, 목표기둥]) 
 #보조기둥과 시작기둥을 바꿉니다!
 하노이(원반의수-1, 보조기둥, 목표기둥, 시작기둥)
하노이(3,&#39;A&#39;,&#39;C&#39;,&#39;B&#39;)
print(원판의이동경로)
print(len(원판의이동경로))</code></pre></li>
</ol>
<ul>
<li>재귀함수...하노이탑
뭘 하고싶은가..(A출발, C끝, B임시)</li>
</ul>
<ol>
<li>A에 있는걸, C로 옮기고 싶다</li>
<li>3개의 원판이 있다면 2개를 B로 보내야한다.</li>
<li>A에 남은 원판 하나 C에 넣는다</li>
<li>B에 있는 원판 2개를 C에 넣는다...
 탈출조건은 재귀함수에서 원판이 하나인 경우 C로 가면 함수 return 한다...
 3개일 때는 2개 2개일 때는 1개...n개일 때는 n-1개
 나눠서 생각할 것 !</li>
</ol>
<ul>
<li>진짜 쉽게 다시 한번 더!
나는 원판 3개 가지고 있다...
2개는 B로 보내야한다. -&gt;(A출발, B끝, C임시)
나머지 남은 하나는 C로 보낸다
B로 보낸 원판 2개를 C로 보낸다 -&gt; (B출발, C끝, A임시)</li>
<li>n개도 마찬가지 원리 적용!</li>
<li>추상화 -&gt; 구체화</li>
</ul>
<h3 id="56-리스트의-함수-응용">56: 리스트의 함수 응용</h3>
<blockquote>
</blockquote>
<pre><code>nationWidth = {
    &#39;korea&#39;: 220877,
    &#39;Rusia&#39;: 17098242,
    &#39;China&#39;: 9596961,
    &#39;France&#39;: 543965,
    &#39;Japan&#39;: 377915,
    &#39;England&#39;: 242900
}
nationWidth_list = list(nationWidth.values())
nationWidth_list.sort()
for i in nationWidth.keys():
    if nationWidth[i] == nationWidth_list[1]:
        print(i, nationWidth_list[1] - nationWidth_list[0])</code></pre><h3 id="57-내장함수-응용하기">57: 내장함수 응용하기</h3>
<blockquote>
</blockquote>
<pre><code>s = []
count = 0
for i in range(0, 1001):
    s.append(str(i))
s = &quot;&quot;.join(s)
for i in s:
    if i == &quot;1&quot;:
        count += 1
print(count)</code></pre><h3 id="58-콤마-찍기">58: 콤마 찍기</h3>
<blockquote>
</blockquote>
<pre><code>num = int(input())
print(format(num, &quot;,&quot;))</code></pre><h3 id="59-빈칸채우기">59: 빈칸채우기</h3>
<blockquote>
</blockquote>
<pre><code>data = input()
data = data.center(50,&quot;=&quot;)
print(data)</code></pre><ul>
<li>이렇게도 가능<pre><code>user_input = input()
print(&quot;{0:=^50}&quot;.format(user_input))</code></pre></li>
</ul>
<h3 id="60-enumerate">60: enumerate</h3>
<blockquote>
</blockquote>
<pre><code>student = [&#39;강은지&#39;, &#39;김유정&#39;, &#39;박현서&#39;, &#39;최성훈&#39;, &#39;홍유진&#39;, &#39;박지호&#39;, &#39;권윤일&#39;, &#39;김채리&#39;, &#39;한지호&#39;, &#39;김진이&#39;, &#39;김민호&#39;, &#39;강채연&#39;]
student.sort()
for i, name in enumerate(student):
    print(f&quot;번호: {i+1}, 이름: {name}&quot;)</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[TIL. 201028_PYTHON(2)]]></title>
            <link>https://velog.io/@0_0/TIL.-201028PYTHON2</link>
            <guid>https://velog.io/@0_0/TIL.-201028PYTHON2</guid>
            <pubDate>Wed, 28 Oct 2020 10:58:47 GMT</pubDate>
            <description><![CDATA[<h2 id="1-50-리뷰">1-50 리뷰</h2>
<p>개인적으로 공부하면서 조금 어려웠다! 기억하고 싶다! 생각되는 부분을 남깁니다.</p>
<h3 id="8-딕셔너리-키-이름-중복">8: 딕셔너리 키 이름 중복</h3>
<blockquote>
<pre><code>d = {&#39;height&#39;: 100, &#39;weight&#39;:78, &#39;weight&#39;: 84, &#39;temparture&#39;: 36, &#39;eyesight&#39;:1 }
print(d[&#39;weight&#39;])</code></pre></blockquote>
<pre><code>- 키 값 중복 될 경우 마지막 값 출력(오른쪽 값이 덮어 씌여졌다고 생각)

### 10: 별 찍기
&gt;```
n = int(input())
for i in range(1, n+1):
        print(&quot; &quot;*(n-i), &quot;*&quot; * (2*i-1))</code></pre><p><img src="https://images.velog.io/images/0_0/post/183eb13c-de58-4b69-9241-9b08d06c03d1/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-10-28%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%206.56.44.png" alt="">
    * 뿐만 아니라 공백을 어떻게 처리해야할지 살짝 고민이 필요했던 문제</p>
<h3 id="12-게임-캐릭터-클래스-만들기">12: 게임 캐릭터 클래스 만들기</h3>
<blockquote>
<pre><code>class Wizard:
    def __init__(self, health, mana, armor):
        self.health = health
        self.mana = mana
        self.armor = armor
    def attack(self):
        print(&quot;파이어볼&quot;)
x = Wizard(health = 545, mana = 210, armor = 10)
print(x.health, x.mana, x.armor)
x.attack()</code></pre></blockquote>
<pre><code>- 간단한 클래스 작성이었지만 클래스 공부가 더 필요하다고 느꼈던 부분!

### 27: 딕셔너리 만들기
&gt;```
keys = input().split()
values = map(int, input().split()
result = dict(zip(keys, values))
print(result)</code></pre><ul>
<li>zip함수 
zip(*iterable)은 동일한 개수로 이루어진 자료형을 묶어 주는 역할을 하는 함수이다.
※ 여기서 사용한 *iterable은 반복 가능(iterable)한 자료형 여러 개를 입력할 수 있다는 의미이다.
참고: <a href="https://wikidocs.net/32#zip">https://wikidocs.net/32#zip</a> -점프 투 파이썬</li>
</ul>
<h3 id="30-문자열-속-문자-찾기">30: 문자열 속 문자 찾기</h3>
<blockquote>
<pre><code>a = input()
b = input()
result = a.index(b)
print(result)</code></pre></blockquote>
<pre><code>- index와 find의 차이는 find는 존재하지 않는 문자나 문자열을 찾을 경우 -1 반환, index는 존재하지 않는 문자나 문자열을 찾을 경우 오류 발생 !

### 33: 거꾸로 출력하기
&gt;```
n = input().split()
n.reverse()
print(&#39; &#39;.join(n))</code></pre><ul>
<li>reverse 와 reversed 차이</li>
<li>reverse는 list타입에서 제공하는 함수</li>
<li>reverse는 값을 반환하지 않는다. 단순히 해당 list를 뒤섞어준다</li>
<li>reversed는 내장함수로 list에서 제공하는 함수가 아니다.</li>
<li>reversed는 객체를 반환한다.</li>
<li>사용하고 싶다면 list(반환객체) or join문을 통해 문자열로 만들도록 하자 !</li>
</ul>
<h3 id="34-sort-구현하기">34: sort 구현하기</h3>
<blockquote>
<pre><code>data = list(map(int, input().split()))
data_d = data.copy()
data.sort()
if data_d == data:
    print(&quot;YES&quot;)
else:
    print(&quot;NO&quot;)</code></pre></blockquote>
<pre><code>- data_d = data 이런식으로 복제하면 안됨
- 왜...? -&gt; 같은 객체를 참고해서 data 값을 바꾸면 data_d 값도 같이 바뀜
- sort() 와 sorted() 의 차이
- a는 어떤 리스트 라고 가정
- print(a.sort()) -&gt; None 출력
- a.sort() -&gt; print(a) -&gt; 정상적으로 sort값 출력
- sorted(a) -&gt; 정상적으로 sort값 출력

### 41: 소수판별
&gt;- 소수: 1과 자기자신만 나머지가 0
- 소수(素數, 발음: [소쑤], 문화어: 씨수, 영어: prime number)는 자신보다 작은 두 개의 자연수를 곱하여 만들 수 없는 1보다 큰 자연수이다. - 위키백과</code></pre><p>import math
def prime_number(n):
    i = 3
    if n == 2:
        return print(&quot;YES&quot;)
    if n == 1:
        return print(&quot;NO&quot;)
    if n % 2 == 0:
        return print(&quot;NO&quot;)
    n_sqrt = math.sqrt(n)
    while i &lt;= n_sqrt:
        if n % i == 0:
            return print(&quot;NO&quot;)
        else:
            i = i + 2
        return print(&quot;YES&quot;)
    return print(&quot;YES&quot;)
prime_number(int(input()))</p>
<pre><code>- 나누어보는 숫자 범위를 줄인다...왜? -&gt; 시간 복잡도를 n에서 sqrt(n)으로 만들기 위해서 !
- N = A * B
- 어떤 수 n이 소수가 아닌 경우 n = a * b 관계이다. a &lt; b 라고 가정
- 루트n 을 기준으로 루트n 보다 작은 a가 적어도 하나 존재한다.
- 결론적으로 루트 n 보다 작은 수(a) 가 n에 나눠 0이 나오면 소수가 아니다. 1, 2제외

### 41(번외편): 에라토스네테스의 체
&gt;- 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. 그림에서 회색 사각형으로 두른 수들이 여기에 해당한다.
- 2는 소수이므로 오른쪽에 2를 쓴다.
- 자기 자신을 제외한 2의 배수를 모두 지운다.
- 남아있는 수 가운데 3은 소수이므로 오른쪽에 3을 쓴다.
- 자기 자신을 제외한 3의 배수를 모두 지운다.
- 남아있는 수 가운데 5는 소수이므로 오른쪽에 5를 쓴다.
- 자기 자신을 제외한 5의 배수를 모두 지운다.
- 남아있는 수 가운데 7은 소수이므로 오른쪽에 7을 쓴다. 
- 자기 자신을 제외한 7의 배수를 모두 지운다.
- 위의 과정을 반복하면 구하는 구간의 모든 소수가 남는다.</code></pre><p>def prime_list(n):
    # 에라토스테네스의 체 초기화: n개 요소에 True 설정(소수로 간주)
    sieve = [True] * n
    # n의 최대 약수가 sqrt(n) 이하이므로 i=sqrt(n)까지 검사
    m = int(n ** 0.5)
    for i in range(2, m + 1):
        if sieve[i] == True:           # i가 소수인 경우
            for j in range(i+i, n, i): # i이후 i의 배수들을 False 판정
                sieve[j] = False
    # 소수 목록 산출
    return print([i for i in range(2, n) if sieve[i] == True])
prime_list(int(input()))</p>
<pre><code>- 참고자료: 위키백과(에라토스테네스의 체)

### 42: 2020년
&gt;- datetime 모듈 사용</code></pre><p>import datetime
a = int(input())
b = int(input())
data = [&#39;MON&#39;, &#39;TUE&#39;, &#39;WED&#39;, &#39;THU&#39;, &#39;FRI&#39;, &#39;SAT&#39;, &#39;SUN&#39;]
d = datetime.date(2020, a, b)
print(data[d.weekday()])</p>
<pre><code>- time 모듈 없이 구현
##### https://zetawiki.com/wiki/Zeller%EC%9D%98_%EA%B3%B5%EC%8B%9D (Zeller의 공식 참고...ㅜ)

### 50: 버블정렬 구현하기
&gt;```
def bubble(n, data):
    for i in range(n-1):
        for j in range(len(data)-1):
            if data[j] &gt; data[j+1]:
                temp = data[j+1]
                data[j+1] = data[j]
                data[j] = temp
    for i in range(n):
        print(data[i], end=&quot; &quot;)
n = int(input())
data = list(map(int, input().split()))
bubble(n, data)</code></pre><ul>
<li>최소 하나는 자기 자리를 찾아간다...</li>
<li>for문 한번 돌리면 맨 마지막에 올 숫자가 정해진다...!</li>
<li>temp 쓰지말고 data[j], data[j+1] = data[j+1], data[j] 이렇게 쓸 것! 파이썬은 가능 !</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL. 201026_PYTHON(1)]]></title>
            <link>https://velog.io/@0_0/TIL.-201026PYTHON1</link>
            <guid>https://velog.io/@0_0/TIL.-201026PYTHON1</guid>
            <pubDate>Mon, 26 Oct 2020 07:01:42 GMT</pubDate>
            <description><![CDATA[<h2 id="이번-주-목표">이번 주 목표</h2>
<ul>
<li><a href="http://paullab.co.kr/codefestival.html?ckattempt=1">http://paullab.co.kr/codefestival.html?ckattempt=1</a>
파이썬 부분 100제 혼자 힘으로 완성 후 리뷰</li>
<li></li>
<li>파이썬 알고리즘 인터뷰(책) 조금씩 진도 나가기</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[TIL. 201024_Vanilla JS]]></title>
            <link>https://velog.io/@0_0/TIL.-201024Vanilla-JS</link>
            <guid>https://velog.io/@0_0/TIL.-201024Vanilla-JS</guid>
            <pubDate>Sat, 24 Oct 2020 14:49:52 GMT</pubDate>
            <description><![CDATA[<h2 id="calculator">Calculator</h2>
<ul>
<li>예전에 만들다 포기 한 적 있지만, 이번 부트캠프에서 JS 과제로 꼭 완성 시켜보고 싶었습니다...</li>
<li>평소에 쉽게쉽게 쓰던 걸 직접 만들어 보려 했는데... 쉽지는 않았습니다...</li>
<li>로직을 잘 구성해서 작은 부분부터 하나하나 분할정복 해야 한다는 것을 알았습니다 !</li>
</ul>
<h3 id="html">HTML</h3>
<p>기본적으로 button 으로 숫자패드, 연산자 등을 구현 했고,
<img src="https://images.velog.io/images/0_0/post/11776c4e-2ed1-4f0b-a095-9cb04a1bd065/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-10-25%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2012.18.47.png" alt=""></p>
<p>onlick 으로 js에서 숫자를 받아올 수 있게 구성했습니다.</p>
<h3 id="js">JS</h3>
<p><img src="https://images.velog.io/images/0_0/post/22082101-2610-42e9-98f6-de6bbee28e8f/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-10-25%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2012.21.27.png" alt=""></p>
<p>문자로 받아와서 계산 할때 parseInt로 변환하는 방식을 거쳤습니다.
왜..? -&gt; 예를들어 77 이라는 숫자를 만들고 싶으면 숫자패드에서 7을 두번 눌러야 하는데, 이때 문자가 아닌 number로 받을 경우 7이 2번 더해져 14가 되었습니다.
이런 경우를 피하기 위해 문자로 받아와서 원하는 숫자가 만들어지면 미리 만들어 놓은 변수에 전달 하는 형식으로 진행했습니다. 그 구분은 boolean으로 하였습니다.</p>
<p><img src="https://images.velog.io/images/0_0/post/8ccffa9c-4145-4d15-ac8b-d7c4b4a28103/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-10-25%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2012.34.07.png" alt=""></p>
<p>&amp;&amp; -&gt; AND 연산자
return 값은 &#39;=&#39; 버튼을 눌렀을 때 switch문을 통해 필요한 로직을 수행할 수 있게 구성했습니다.</p>
<p><img src="https://images.velog.io/images/0_0/post/095a5dd5-7758-440e-a314-c152584f702c/%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202020-10-25%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2012.41.36.png" alt=""></p>
<p>링크: <a href="https://zoo0190.github.io/we_calculator/">https://zoo0190.github.io/we_calculator/</a></p>
<h3 id="아쉬웠던-점">아쉬웠던 점</h3>
<ul>
<li>중복되는 코드가 많았음</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>