<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>ki_blank.log</title>
        <link>https://velog.io/</link>
        <description>갈고 닦자.</description>
        <lastBuildDate>Fri, 20 Dec 2019 01:55:22 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>ki_blank.log</title>
            <url>https://images.velog.io/images/ki_blank/profile/028e5c10-e325-11e9-b4fe-3b819bdaf3d2/-.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. ki_blank.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/ki_blank" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[알고리즘 - freeCodeCamp - Map the Debris]]></title>
            <link>https://velog.io/@ki_blank/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-freeCodeCamp-Map-the-Debris</link>
            <guid>https://velog.io/@ki_blank/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-freeCodeCamp-Map-the-Debris</guid>
            <pubDate>Fri, 20 Dec 2019 01:55:22 GMT</pubDate>
            <description><![CDATA[<h4 id="문제">문제</h4>
<p>{ name: &quot;name&quot;, avgAlt: &quot;avgAlt&quot;} 에서 <code>avgAlt</code>는 <code>average altitude</code>이며 평균 고도를 나타낸다. 고도는 지구 표면에서 물체가 떨어져 있는 높이를 나타낸다. 이 문제는 지구를 기준으로 떨어져 있는 달, 위성, 화성... 등의 평균고도의 값이 있는 객체형태를 배열 안에 나열되어있다. <code>avgAlt</code>를 <code>orbitalPeriod</code>로 바꿔서 새로운 배열로 반환해야한다.</p>
<h4 id="예시">예시</h4>
<pre><code>orbitalPeriod([{name : &quot;sputnik&quot;, avgAlt : 35873.5553}]) 
--&gt; [{name: &quot;sputnik&quot;, orbitalPeriod: 86400}]

orbitalPeriod([{name: &quot;iss&quot;, avgAlt: 413.6}, {name: &quot;hubble&quot;, avgAlt: 556.7}, {name: &quot;moon&quot;, avgAlt: 378632.553}]) 
--&gt; [{name : &quot;iss&quot;, orbitalPeriod: 5557}, {name: &quot;hubble&quot;, orbitalPeriod: 5734}, {name: &quot;moon&quot;, orbitalPeriod: 2377399}]</code></pre><h4 id="풀이">풀이</h4>
<pre><code class="language-javascript">function orbitalPeriod(arr) {
  var GM = 398600.4418;
  var earthRadius = 6367.4447;
  const calculate = val =&gt; {
    const { name, avgAlt } = val;
    const orbitalsSemiMajorAxis = earthRadius + avgAlt; // 지구 중심에서 물체까지의 거리
    const orbitalPeriod = Math.round(
      2 * Math.PI * Math.sqrt(
        Math.pow(orbitalsSemiMajorAxis, 3) / GM
      )
    )
    return { name, orbitalPeriod };
  }
  return arr.map(calculate);
}</code></pre>
<p>공전 주기를 구하는데 필요한 참고자료를 제공해 준다.
<a href="https://en.wikipedia.org/wiki/Orbital_period">https://en.wikipedia.org/wiki/Orbital_period</a>
위에 나와 있는 공식을 이해하는데 시간이 걸렸다. <code>orbitalsSemiMajorAxis</code>만 알면 나머지는 공식대로 적절할 메소드를 사용했다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[알고리즘 - freeCodeCamp - Arguments Optional]]></title>
            <link>https://velog.io/@ki_blank/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-freeCodeCamp-Arguments-Optional</link>
            <guid>https://velog.io/@ki_blank/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-freeCodeCamp-Arguments-Optional</guid>
            <pubDate>Tue, 17 Dec 2019 02:03:05 GMT</pubDate>
            <description><![CDATA[<h4 id="문제">문제</h4>
<p>매개변수가 두개 라면 더한 값을 반환하시오.
매개변수가 하나라면 함수를 반환하고, 반환한 함수를 이용해서 값을 더하시오.</p>
<h4 id="예시">예시</h4>
<pre><code>addTogether(2, 3) --&gt; 5.
addTogether(2)(3) --&gt; 5.
addTogether(&quot;http://bit.ly/IqT6zt&quot;) --&gt; undefined.
addTogether(2, &quot;3&quot;) --&gt; undefined.
addTogether(2)([3]) --&gt; undefined.</code></pre><h4 id="풀이">풀이</h4>
<pre><code class="language-javascript">function addTogether() {
  const [num1, num2] = arguments; // 가.

  if (typeof num1 !== &quot;number&quot;){
    return ;
  } else if (num2 !== undefined) {
    if (typeof num2 !== &quot;number&quot;) {
      return ;
    }
    return num1 + num2;
  }

  return function(val) { // 나.
    if (typeof val !== &quot;number&quot;){
      return ;
    }
    return num1 + val;
  }
}</code></pre>
<p>가. 함수 addTogether에 들어온 매개변수를 조회할 수 있다. <code>arguments</code>로 조회할 수 있다. 사용한 방법은 비구조화할당이다.</p>
<p>매개변수가 두개로 들어오면 num1, num2가 숫자 타입인지 확인한다. 숫자타입이 아니라면, <code>undefined</code>를 반환한다. 반환할 때 <code>undefined</code>를 적어줘도 되지만 적어주지 않아도 세미콜론 하나만 적어도 된다. num2가 있고, 숫자 타입이면 <code>num1 + num2</code>를 반환한다.</p>
<p>나. 위에 조건들이 맞지 않다면 함수를 반환한다. 반환한 함수에 매개변수를 입력하면 매개변수가 숫자타입인지 확인하고, 숫자타입이 아니라면 <code>undefined</code>를 반환한다. 조건에 걸리지 않다면 <code>num1 + val</code>를 반환한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[알고리즘 - freeCodeCamp - Everything Be TruePassed ]]></title>
            <link>https://velog.io/@ki_blank/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-Everything-Be-TruePassed-freeCodeCamp</link>
            <guid>https://velog.io/@ki_blank/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-Everything-Be-TruePassed-freeCodeCamp</guid>
            <pubDate>Sun, 15 Dec 2019 02:24:56 GMT</pubDate>
            <description><![CDATA[<h4 id="문제">문제</h4>
<p><code>collection</code>에서 <code>pre</code>키를 가지고 있는지 확인하고 <code>Boolean</code>형태로 반환하시오.</p>
<h4 id="예시">예시</h4>
<pre><code>truthCheck([{&quot;user&quot;: &quot;Tinky-Winky&quot;, &quot;sex&quot;: &quot;male&quot;}, {&quot;user&quot;: &quot;Dipsy&quot;, &quot;sex&quot;: &quot;male&quot;}, {&quot;user&quot;: &quot;Laa-Laa&quot;, &quot;sex&quot;: &quot;female&quot;}, {&quot;user&quot;: &quot;Po&quot;, &quot;sex&quot;: &quot;female&quot;}], &quot;sex&quot;) --&gt; true.
truthCheck([{&quot;user&quot;: &quot;Tinky-Winky&quot;, &quot;sex&quot;: &quot;male&quot;}, {&quot;user&quot;: &quot;Dipsy&quot;}, {&quot;user&quot;: &quot;Laa-Laa&quot;, &quot;sex&quot;: &quot;female&quot;}, {&quot;user&quot;: &quot;Po&quot;, &quot;sex&quot;: &quot;female&quot;}], &quot;sex&quot;) --&gt; false.
truthCheck([{&quot;user&quot;: &quot;Tinky-Winky&quot;, &quot;sex&quot;: &quot;male&quot;, &quot;age&quot;: 0}, {&quot;user&quot;: &quot;Dipsy&quot;, &quot;sex&quot;: &quot;male&quot;, &quot;age&quot;: 3}, {&quot;user&quot;: &quot;Laa-Laa&quot;, &quot;sex&quot;: &quot;female&quot;, &quot;age&quot;: 5}, {&quot;user&quot;: &quot;Po&quot;, &quot;sex&quot;: &quot;female&quot;, &quot;age&quot;: 4}], &quot;age&quot;) --&gt; false.
truthCheck([{&quot;name&quot;: &quot;Pete&quot;, &quot;onBoat&quot;: true}, {&quot;name&quot;: &quot;Repeat&quot;, &quot;onBoat&quot;: true}, {&quot;name&quot;: &quot;FastFoward&quot;, &quot;onBoat&quot;: null}], &quot;onBoat&quot;) --&gt; false
truthCheck([{&quot;name&quot;: &quot;Pete&quot;, &quot;onBoat&quot;: true}, {&quot;name&quot;: &quot;Repeat&quot;, &quot;onBoat&quot;: true, &quot;alias&quot;: &quot;Repete&quot;}, {&quot;name&quot;: &quot;FastFoward&quot;, &quot;onBoat&quot;: true}], &quot;onBoat&quot;) --&gt; true
truthCheck([{&quot;single&quot;: &quot;yes&quot;}], &quot;single&quot;) --&gt; true
truthCheck([{&quot;single&quot;: &quot;&quot;}, {&quot;single&quot;: &quot;double&quot;}], &quot;single&quot;) --&gt; false
truthCheck([{&quot;single&quot;: &quot;double&quot;}, {&quot;single&quot;: undefined}], &quot;single&quot;) --&gt; false
truthCheck([{&quot;single&quot;: &quot;double&quot;}, {&quot;single&quot;: NaN}], &quot;single&quot;) --&gt; false</code></pre><h4 id="풀이">풀이</h4>
<pre><code class="language-javascript">function truthCheck(collection, pre) {
  // Is everyone being true?
  for (let i = 0; i &lt; collection.length; i++) {
    if (!collection[i][pre]){
      return false;
    }
  }
  return true;
}</code></pre>
<p>매개변수 <code>collection</code>에는 같은 형태의 객체가 여러개 담긴 배열이 들어온다. <code>pre</code>는 <code>collection</code>의 <code>key</code>가 있는지, <code>key</code>의<code>value</code>가 <code>0(숫자)</code>,<code>NaN</code>,<code>undefined</code>,<code>&quot;&quot;</code>,<code>null</code>인지 확인한다. 확인한 결과값을 <code>Boolean</code>형태로 반환한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[알고리즘 - freeCodeCamp - Binary Agents]]></title>
            <link>https://velog.io/@ki_blank/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-freeCodeCamp-Binary-Agents</link>
            <guid>https://velog.io/@ki_blank/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-freeCodeCamp-Binary-Agents</guid>
            <pubDate>Sat, 14 Dec 2019 04:38:35 GMT</pubDate>
            <description><![CDATA[<h4 id="문제">문제</h4>
<p>이진 수를 해석하시오.</p>
<h4 id="예시">예시</h4>
<p>binaryAgent(&quot;01000001 01110010 01100101 01101110 00100111 01110100 00100000 01100010 01101111 01101110 01100110 01101001 01110010 01100101 01110011 00100000 01100110 01110101 01101110 00100001 00111111&quot;) --&gt; &quot;Aren&#39;t bonfires fun!?&quot;
binaryAgent(&quot;01001001 00100000 01101100 01101111 01110110 01100101 00100000 01000110 01110010 01100101 01100101 01000011 01101111 01100100 01100101 01000011 01100001 01101101 01110000 00100001&quot;) --&gt; &quot;I love FreeCodeCamp!&quot;</p>
<h4 id="풀이">풀이</h4>
<pre><code class="language-javascript">function binaryAgent(str) {
  let splitedStr = str.split(&quot; &quot;);
  for (let i = 0; i &lt; splitedStr.length; i++){
    splitedStr[i] = parseInt(splitedStr[i], 2);
  }
  return String.fromCharCode(...splitedStr);;
}
</code></pre>
<p>매개변수 <code>str</code>이 간격을 경계로 들어오고 있다. 문자열을 분리한다. <code>splitedStr</code>의 각 인덱스의 값을 10진수로 바꿔야한다. <code>parseInt</code>를 이용해서 2진수를 10진수 숫자로 바꾼 후에 <code>splitedStr</code>의 각 인덱스에 할당한다. <code>fromCharCode</code>는 숫자가 매개변수로 한다. 숫자를 조회하고 아스키코드와 일치한 문자를 반환하다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[알고리즘 - freeCodeCamp - Streamroller]]></title>
            <link>https://velog.io/@ki_blank/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-freeCodeCamp-Streamroller</link>
            <guid>https://velog.io/@ki_blank/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-freeCodeCamp-Streamroller</guid>
            <pubDate>Tue, 10 Dec 2019 00:27:55 GMT</pubDate>
            <description><![CDATA[<h4 id="문제">문제</h4>
<p>중첩된 배열을 없애고 하나의 배열로 반환하시오.</p>
<h4 id="예시">예시</h4>
<p>steamrollArray([[[&quot;a&quot;]], [[&quot;b&quot;]]]) --&gt; [&quot;a&quot;, &quot;b&quot;]
steamrollArray([1, [2], [3, [[4]]]]) --&gt; [1, 2, 3, 4]
steamrollArray([1, [], [3, [[4]]]]) --&gt; [1, 3, 4]
steamrollArray([1, {}, [3, [[4]]]]) --&gt; [1, {}, 3, 4]</p>
<h4 id="풀이">풀이</h4>
<pre><code class="language-javascript">function steamrollArray(arr) {
  // I&#39;m a steamroller, baby
  let pureArr = [];
  for (let i = 0; i &lt; arr.length; i++){
    recursionFunc(arr[i], pureArr);
  }
  return pureArr;
}

function recursionFunc (val, arr = []) {
  if (!Array.isArray(val)) {
    arr.push(val);
  } else if (Array.isArray(val) &amp;&amp; val.length === 1){
    recursionFunc(...val, arr);
  } else if (Array.isArray(val) &amp;&amp; val.length &gt; 1){
    for (let i = 0; i &lt; val.length; i++){
      recursionFunc(val[i], arr)
    }
  }
  return;
}

steamrollArray([1, [2], [3, [[4]]]]);</code></pre>
<p>재귀함수를 작성했다.
매개변수로 <code>val</code>과 <code>arr</code>인데 <code>arr</code>은 기본 배열을 가지고 있는 매개변수다. 조건문의 내용은 <code>val</code>이 배열이 아니었을 때 배열 안에 값을 담는다. <code>val</code>이 배열이고 길이가 1 이면 다시 <code>recursionFunc</code>를 실행시킨다. 그렇지 않고 중첩된 배열에서 2 이상의 길이를 가지고 있는 배열이라고 한다면 중첩된 배열 안에서도 또 중첩된 배열이 있으면 그 값도 조회해야 한다. 그러므로 반복문을 이용하고 <code>recursionFunc</code>를 다시 실행한다. 매개변수 <code>arr</code>은 계속 가지고 다닌다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[알고리즘 - freeCodeCamp - dropElements]]></title>
            <link>https://velog.io/@ki_blank/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-freeCodeCamp-dropElements</link>
            <guid>https://velog.io/@ki_blank/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-freeCodeCamp-dropElements</guid>
            <pubDate>Sun, 08 Dec 2019 01:29:54 GMT</pubDate>
            <description><![CDATA[<h4 id="문제">문제</h4>
<p>배열을 반복문을 이용해서 콜백이 true를 반환하면 true를 반환하는 부분부터 배열을 반환하시오.</p>
<h4 id="예시">예시</h4>
<ul>
<li>dropElements([0, 1, 0, 1], function(n) {return n === 1;}) --&gt; [1, 0, 1]</li>
<li>dropElements([1, 2, 3, 9, 2], function(n) {return n &gt; 2;}) --&gt; [3, 9, 2]</li>
</ul>
<h4 id="풀이">풀이</h4>
<pre><code class="language-javascript">function dropElements(arr, func) {
  // Drop them elements.
  for (let i = 0; i &lt; arr.length; i++){
    if (func(arr[i])) { // 가.
      return arr.slice(i); // 나.
    }
  }
  return []; // 다.
}</code></pre>
<p>가. <code>func</code>가 <code>true</code>를 반환하면
나. <code>true</code>를 반환한     <code>i</code>번째 부터 마지막까지 배열을 잘라서 반환
다. 조건에 만족하지 않다면 <code>[]</code>를 반환</p>
<h4 id="하면서">하면서...</h4>
<p>풀이 과정에서 <code>slice</code>대신 <code>splice</code>를 사용했다. <code>splice</code>를 사용했을 때 조건이 <code>false</code>일 때 값을 하나씩 제거했다. 그 결과 배열이 하나씩 앞으로 당겨지면서 바로 다음 배열로 가는게 아니라 하나 건너띄어서 값을 탐색된다. 고민하다가 떠오른게 <code>slice</code>였다. <code>i</code> 번째가 조건이 맞으면 <code>i</code>번째 포함해서 배열을 반환했다.
위의 글을 작성하면서 <code>splice</code>로 해결할 수 있는 방법을 생각했다. <code>i</code>값을 변화시키지 않고, <code>func</code>가 <code>false</code>를 반환하면 <code>splice</code>의 의해서 제거가 되니깐 한칸씩 앞으로 오게 되고 <code>true</code>가 나올 때까지 앞으로 당겨진다. <code>true</code>이면 나머지를 반환한다. </p>
<pre><code class="language-javascript">function dropElements(arr, func) {
  // Drop them elements.
  for (let i = 0; i &lt; arr.length;){
    if (!func(arr[i])) {
      arr.splice(i, 1);
    } else {
      return arr;
    }
  }
  return [];
}</code></pre>
<p>이 방법이 지어진 함수명(<code>dropElements</code>)과 가깝다고 생각된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[19.12.06.금 - TIL]]></title>
            <link>https://velog.io/@ki_blank/19.12.06.%EA%B8%88-TIL</link>
            <guid>https://velog.io/@ki_blank/19.12.06.%EA%B8%88-TIL</guid>
            <pubDate>Fri, 06 Dec 2019 11:03:39 GMT</pubDate>
            <description><![CDATA[<ul>
<li>GraphQL에서 같은 resolver의 같은 Query 에서 데이터를 공유할 수 있다.</li>
<li>A Guide to Common Resolver Patterns-
<a href="https://www.prisma.io/tutorials/a-guide-to-common-resolver-patterns-ct08">https://www.prisma.io/tutorials/a-guide-to-common-resolver-patterns-ct08</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[알고리즘 - freeCodeCamp - Smallest Common Multiple.part3]]></title>
            <link>https://velog.io/@ki_blank/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-freeCodeCamp-Smallest-Common-Multiple.part3</link>
            <guid>https://velog.io/@ki_blank/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-freeCodeCamp-Smallest-Common-Multiple.part3</guid>
            <pubDate>Fri, 06 Dec 2019 10:32:26 GMT</pubDate>
            <description><![CDATA[<p>매일 한 시간씩 3일에 걸쳐서 풀었다. 해결방법은 freeCodeCamp 힌트를 이용했다.
힌트에서 위키백과에 있는 최소공배수를 참고하라고 링크를 해놨다. 최소공배수를 구하려면 최대공약수를 이용한다. 위키백과에서 최대공약수를 참고하니 유클리드 호제법이 있었다. 먼저 두 수가 있으면 가장 큰 수를 작은 수로 나눈다. 나눠서 나온 나머지가 <code>0</code>이 아니면 <code>나누는 수</code>를 <code>나머지</code>로 나눈다. <code>나머지</code>가 <code>0</code>이 될 때까지 반복한다. <code>나머지</code>가 <code>0</code>이 될 때 <code>나누는 수</code>가 최대공약수가 된다.</p>
<p>최소공배수는 주어진 두 수를 곱하고 최대 공약수로 나누면 최소공배수가 나오게 된다.</p>
<h4 id="풀이">풀이</h4>
<pre><code class="language-javascript">function smallestCommons(arr) {
  const sortedArr = arr.sort((a, b) =&gt; a - b); // 가.

  let leastCommonMultiple = 1; // 나.

  for (let i = sortedArr[0]; i &lt;= sortedArr[1]; i++) { // 다.
    leastCommonMultiple = 
    (leastCommonMultiple * i) 
    / greatestCommonDivisor(leastCommonMultiple, i)
  }

  return leastCommonMultiple;
}

function greatestCommonDivisor(num1, num2) { // 라.
  let remainder = num1 % num2;
  if (!remainder){ // 마.
    return num2;
  } else if (remainder === 1){ // 바.
    return 1;
  } else {
    return greatestCommonDivisor(num2, remainder); // 사.
  }
}

smallestCommons([1, 5]);</code></pre>
<p>가. 매개변수로 들어오는 배열이 큰 수가 0번째로 들어오는 걸 정렬로 작은 수부터 큰 수로 정렬
나. 두 수의 최소공배수가 되는 <code>leastCommonMultiple</code>변수 선언
다. <code>leastCommonMultiple</code>과 <code>i</code>의 곱을 <code>greatestCommonDivisor(유클리드 호제법)</code>의 결과로 나눈 값을 <code>leastCommonMultiple</code>에 할당한다. 주어진 범위까지 반복한다.
라. 최대공약수를 구하는 함수
마. <code>remainder</code>가 <code>0</code>이면 나눈 값인 <code>num2</code>를 반환
바. <code>remainder</code>가 <code>1</code>이면 서로소라고 해서 서로 최대공약수가 <code>1</code> 이외엔 없다. <code>1</code>를 반환
사. <code>0</code>, <code>1</code>의 조건들이 전부 아니었을 때 재귀</p>
<h4 id="느낀점">느낀점</h4>
<p>이번 알고리즘을 풀면서 최대공약수에 대한 코드도 구현해서 좋았다. 그리고 여러번 수정을 했다. 이게 최종본이다. 이전에는 함수 안에 <code>numbers</code> 배열이 하나 더 있었다. 매개변수로 들어온 배열에는 두 수가 있는데 두 수 범위 안에 있는 모든 수를 <code>numbers</code> 배열에 담는다. 반복문을 하나 더 만들어야했다. 해결하긴 했지만 코드를 다시 보니깐 줄일 수도 있겠다는 생각을 했다. <code>numbers</code> 배열에 숫자들을 넣는 과정에서 계산을 하면 반복문을 하나 더 만들지 않아도 될 거 같다는 가정을 했다. 그리고 <code>leastCommonMultiple</code> 변수도 처음에 1이 있는 범위가 있으면 <code>1</code>를 곱하는건 필요하지 않는거 같았다. <code>1</code>이 포함된 배열이 들어오면 <code>1</code>다음 수과 그 다음 수를 곱해서 leastCommonMutiple에 할당했다. 그렇게 해보니 다른 것도 따로 코딩을 해줘야 했다. 차라리 <code>leastCommonMultiple</code>에 <code>1</code>을 할당하면 다른 코드들을 작성하는게 필요치 않게 된다고 생각하게 됐다. 두 가지 생각을 정리를 잘해서, 적용을 해보니 코드가 훨씬 줄어들었다. </p>
<p>유클리드 호제법 - 최대공약수 구하는 방법: <a href="https://ko.wikipedia.org/wiki/%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C_%ED%98%B8%EC%A0%9C%EB%B2%9">https://ko.wikipedia.org/wiki/%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C_%ED%98%B8%EC%A0%9C%EB%B2%9</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[19.12.05.목 - TIL]]></title>
            <link>https://velog.io/@ki_blank/19.12.05.%EB%AA%A9-TIL</link>
            <guid>https://velog.io/@ki_blank/19.12.05.%EB%AA%A9-TIL</guid>
            <pubDate>Thu, 05 Dec 2019 11:17:58 GMT</pubDate>
            <description><![CDATA[<ul>
<li>passport-jwt의 사용방법을 익혔다. 처음에 강의를 보고만 해서 동작방법을 제대로 익히지 못했었다. 다시 보면서 코드 하나의 의미가 무엇인지 파악하면서 알아냈다. <pre><code class="language-javascript">// server.js
//...
import authenticateJwt from &quot;./passport&quot;;
express.use(authenticateJwt);
// passport.js
import { Strategy, ExtractJwt } from &quot;passport-jwt&quot;;
const jwtOptions = {
  jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
    secretOrKey: &quot;무작위글자를넣는게좋아요&quot; // 보안을 위해 .env파일에 넣어서 불러오는게 좋다.
}
const verify = (payload, done) =&gt; {
try {
    if (user
      return done(null, user);
  }
  return done(null, false);
} catch (error) {
  return done(error, false);
}
}
export default authenticateJwt = (req, res, next) =&gt;
  passport.authenticate(&quot;jwt&quot;, { session: false }, (error, user) =&gt; {
        if (user) {
          req.user = user;
      }
        next();
  })(req, res, next);
passport.use(new Strategy(jwtOptions, verify));
passport.initialize();</code></pre>
</li>
<li>authenticateJwt가 실행이 되면 passport가 &#39;jwt&#39; 전략 사용한다.</li>
<li>passport는 &#39;jwt&#39; 전략에서 jwtOptions로 token에 있는 정보를 추출한다.</li>
<li>추출한 정보가 verify 함수의 매개변수로 들어간다.</li>
<li>verify 함수는 payload에 정보가 있으면 매개변수로 done 을 실행하는데 이 done은
passport.authenticate의 세번째 인자다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[알고리즘 - freeCodeCamp - Smallest Common Multiple.part2]]></title>
            <link>https://velog.io/@ki_blank/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-freeCodeCamp-Smallest-Common-Multiple.part2</link>
            <guid>https://velog.io/@ki_blank/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-freeCodeCamp-Smallest-Common-Multiple.part2</guid>
            <pubDate>Thu, 05 Dec 2019 01:46:53 GMT</pubDate>
            <description><![CDATA[<p>진행중인 문제에 이어서 푸는 중이다.
어제 생각했던 풀이로 해봤다.</p>
<pre><code class="language-javascript">function smallestCommons(arr) {
  let sortedArr = arr.sort((a, b) =&gt; a - b);

  let result = sortedArr[0]

  for (let i = sortedArr[0] + 1; i &lt;= sortedArr[1]; i++) {
    result = addRecursion(result, i);
  }
  return result;
}

function addRecursion(num1, num2) {
  let resultNum = 0;
  const searchCommonNumber = (n1, n2) =&gt; {
    if (n1 === n2) {
      return n1;
    } else if (n1 &lt; n2) {
      resultNum = n1;
      resultNum += num1;
      return searchCommonNumber(resultNum, n2);
    } else if (n1 &gt; n2) {
      resultNum = n2;
      resultNum += num2;
      return searchCommonNumber(n1, resultNum);
    }
  }
  return searchCommonNumber(num1, num2);
}</code></pre>
<p>총 통과해야하는 단계가 6개가 있는데 그 중에 4개를 통과했다. 나머지 2개는 call stack이 초과해서 문제를 통과하지 못했다. 왜 call stack이 초과하냐면 첫 조건이 재귀함수 종료 조건인데 종료조건이 될 때까지 함수가 실행되고 그 과정에서 실행되는 함수가 너무 많아서 call stack이 초과한다.
call stack이 초과되지 않는 방법을 생각해 내야겠다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[19.12.4.수 TIL]]></title>
            <link>https://velog.io/@ki_blank/19.12.4.%EC%88%98-TIL</link>
            <guid>https://velog.io/@ki_blank/19.12.4.%EC%88%98-TIL</guid>
            <pubDate>Wed, 04 Dec 2019 11:30:15 GMT</pubDate>
            <description><![CDATA[<ul>
<li>강의를 통해서 nodemailer와 sendgrid를 알게됐다. 사용했던 방법은 로그인 과정에서 사용자에게 주어지는 loginSecret 문자가 있다. 이 문자가 DB에서 생성이 되고, 생성되는 함수에서 사용자 메일로 loginSecret 문자를 보낸다. 두개가 일치하면 JWT를 발급해 주는 방식이다. 이 방법 외에 다른 방식을 통해서 email를 보내는 것도 가능할 거 같다. 새로운 소식을 알려준다든지, 로켓펀치에서 보내주는 채용공고, Medium의 포스트, 알림메일 등 여러기능을 할 수 있다. 사용방법이 무궁무진 하겠구만!</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[자기주도적인 개발과 따라하기 개발의 차이점]]></title>
            <link>https://velog.io/@ki_blank/%EC%9E%90%EA%B8%B0%EC%A3%BC%EB%8F%84%EC%A0%81%EC%9D%B8-%EA%B0%9C%EB%B0%9C%EA%B3%BC-%EB%94%B0%EB%9D%BC%ED%95%98%EA%B8%B0-%EA%B0%9C%EB%B0%9C%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90</link>
            <guid>https://velog.io/@ki_blank/%EC%9E%90%EA%B8%B0%EC%A3%BC%EB%8F%84%EC%A0%81%EC%9D%B8-%EA%B0%9C%EB%B0%9C%EA%B3%BC-%EB%94%B0%EB%9D%BC%ED%95%98%EA%B8%B0-%EA%B0%9C%EB%B0%9C%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90</guid>
            <pubDate>Wed, 04 Dec 2019 10:00:56 GMT</pubDate>
            <description><![CDATA[<p>따라하기 개발은 프레임 워크를 어떻게 사용하는지를 알고 싶고, 다른 사람은 어떤 방식으로 개발을 하는지를 알아갈 때는 좋다. 그렇지만 강의를 보면서 하고 있으면 뭔가는 하고 있는데 손만 따라하고 있지 받아들여지는게 적은거 같다. 이유는 내가 직접 경험하지 않았고 다른 사람의 경험에서 한 것이기에 그 사람의 개발 방식과 내 개발방식은 다르고 정리하는 것도 서로 달라서 막상 하다보면 따라만 치고 있다. 따라하기 개발에서 내 것으로 습득한 지식을 혼자 따로 정리를 해야한다. 강의에서 했던 내용들을 떠올리면서 <code>왜</code>를 떠올리면서 강의하는 사람이 왜 이렇게 했는지 생각하고, 나는 어떡해 적용할 것인가를 생각하면서 나름대로 정리를 하는게 좋다. 따라하기 개발은 그 때 뿐이 아니라 복습을 통해서 더 많이 알아가는거 같다.
자기주도적인 개발은 만들고 싶은 프로젝트를 구상하는 것에서 시작한다. 어떤 프로젝트를 만들 것인지 생각하고, 프로젝트에 사용할 언어, 프레임워크, DB, 서버 등등을 생각해야되기 때문이다. 하면서 실수하고 왜 실수했는지 원인을 파악하고, 고치고를 반복한다. 검색, 블로그, 포스트, stackoverflower 등을 돌아다니면서 습득한 지식이 더욱 기억에 오래남게 된다. 대부분 사이드 프로젝트에서 완성하는게 힘들지만 완성하는게 중요하다. 완성하고 개발과정을 되돌아 봤을 때, 어떤 점을 실수 했었는지, 이 프로젝트를 통해 배운점이 무엇인지, 다시 만든다면 어떤 방식으로 만들것인지 등 생각을 정리하면서 나에게 쌓이게 된다. 쌓이면 쌓일 수록 자신이 성장해 가는 개발 방법이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[알고리즘 - freeCodeCamp - Smallest Common Multiple.part1]]></title>
            <link>https://velog.io/@ki_blank/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-Smallest-Common-Multiple-freeCodeCamp-%EC%A7%84%ED%96%89%EC%A4%91</link>
            <guid>https://velog.io/@ki_blank/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-Smallest-Common-Multiple-freeCodeCamp-%EC%A7%84%ED%96%89%EC%A4%91</guid>
            <pubDate>Wed, 04 Dec 2019 01:43:06 GMT</pubDate>
            <description><![CDATA[<h4 id="문제">문제</h4>
<p>두 숫자를 포함한 두 숫자 사이의 모든 값들의 최소공배수를 구하시오.</p>
<h4 id="예시">예시</h4>
<p>[1,5] --&gt; 1, 2, 3, 4, 5 의 최소 공배수는 60
[10, 1] --&gt; 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 의 최소 공배수는 2520</p>
<h4 id="풀이---진행중">풀이 - 진행중</h4>
<pre><code class="language-javascript">function smallestCommons(arr) {
  const sortedArr = arr.sort((a, b) =&gt; {
    return a - b;
  });

  let straightNumbers = [];

  for (let i = sortedArr[0]; i &lt;= sortedArr[1]; i++) {
    straightNumbers.push(i);
  }

  return arr;
}

let one = 23;
let four = 18;

function addRecursion(num1, num2) {
  const addnum1 = one;
  const addnum2 = four;
  console.log(num1, num2);
  if (num1 === num2) {
    return num1;
  }
  if (num1 &lt; num2) {
    return addRecursion((num1 + addnum1), num2);
  } else if (num1 &gt; num2) {
    return addRecursion(num1, (num2 + addnum2));
  }
}

console.log(addRecursion(one, four));
smallestCommons([1,5]);</code></pre>
<p>아직 해결하지 못하고 진행중이다. 처음에 생각을 했을 때 어떻게 전부 나누고 곱할지 생각했다. 공통된 수로 안 나눠질 때까지 나눈뒤 똑같이 나눈 값들을 곱하면 될거 같다고 생각했다. 하지만 생각처럼 쉽지가 않았다.
다른 방법으로 소수를 활용하는 방법이 있을거 같다라는 생각이 들었다. 하지만 이것 또한 복잡하다고 생각됐다. 어떻게 하려고 했냐면, 두 수의 범위 안에 있는 소수를 이용해서 각 숫자를 반복문으로 돌려서 각 숫자를 소수로 나눈다. 그러면 몫이 나올 것이고 몫을 또 나눈다. 나눈 반복되는 값을 객체에 저장해서 소수로 몇번 나눴는지 카운터를 알아내고 객체에 있는 key 와 value를 곱하고 곱한 값을 다른 소수와 같이 곱하면 최소공배수가 된다.
하지만 이건 너무 복잡하다는 생각이 들었다. 다시 생각했다. freeCodeCamp 에 힌트를 주는 페이지가 있어서 그걸 활용했다. 보니깐 곱은 같은 숫자를 여러번 더한 것을 편리하게 숫자로 표현한 거와 같다라는 힌트를 얻게 됐다.
바로 생각난게 여러번 같은 숫자를 더하는 거면 두 수가 같을 때까지 더하면 된다고 생각했고, 재귀함수를 활용할 수 있다는 생각을 했다. 위에 보면 <code>addRecursion</code>함수가 있다. 두 수가 같을 때까지 계속 더하는 함수를 만들었다. 알고리즘 푸는 시간을 정해서 하고 있는데 정한 시간에 하지 못해서 진행중이다. 내일은 해결할 수 있을 거 같다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[19.12.3.화 - TIL]]></title>
            <link>https://velog.io/@ki_blank/19.12.3.%ED%99%94-TIL</link>
            <guid>https://velog.io/@ki_blank/19.12.3.%ED%99%94-TIL</guid>
            <pubDate>Tue, 03 Dec 2019 11:45:37 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>nodemon를 추가하고 nodemon.json 파일을 생성 후에 파일 안에서 &quot;ext&quot;에 확장자를 추가하면 추가된 파일이 생성되거나 수정되면 다시 서버가 다시 동작한다.</p>
<pre><code class="language-json">{
   &quot;ext&quot;: &quot;js graphql&quot;
}</code></pre>
<p>.js 확장자, .graphql 확장자를 가진 파일이 생성 되거나 수정될 때 서버가 다시 nodemon이 동작한다.</p>
</li>
<li><p>graphql-yoga 모듈에서 사용하는 GraphQLServer에는 express서버가 내장되어 있다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[알고리즘 - freeCodeCamp - Sum All Primes ver.1]]></title>
            <link>https://velog.io/@ki_blank/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-freeCodeCamp-Sum-All-Primes-1</link>
            <guid>https://velog.io/@ki_blank/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-freeCodeCamp-Sum-All-Primes-1</guid>
            <pubDate>Sun, 01 Dec 2019 02:05:17 GMT</pubDate>
            <description><![CDATA[<h4 id="문제">문제</h4>
<p>주어진 숫자 범위 안에서 소수를 전부 더하시오.</p>
<h4 id="예시">예시</h4>
<p>10이 주어지면 2, 3, 5, 7 이 소수이며 합이 17이다.</p>
<h4 id="풀이">풀이</h4>
<pre><code class="language-javascript">function sumPrimes(num) {
  let numbers = []; // 가.

  for (let i = 2; i &lt;= num; i++){ // 나.
    numbers.push(i);
  }

  for (let i = 2; i &lt;= num; i++){ // 다.
    for (let j = 0; j &lt; numbers.length; j++){ // 라.
      if (Number.isInteger(numbers[j] / i) &amp;&amp; (numbers[j] / i) &gt; 1) { // 마.
        numbers.splice(j, 1);
      }
    }
  }
  const sumOfPrimes = (acc, curr) =&gt; acc + curr; // 바.

  return numbers.reduce(sumOfPrimes);
}</code></pre>
<p>가. <code>numbers</code>변수는 2부터 주어진 숫자까지 담는 배열이다.
나. 2부터 주어진 숫자까지 반복한다.
다. 2부터 주어진 숫자까지 반복하고
라. 0부터 <code>numbers</code> 길이보다 작을 때까지 반복한다.
마. <code>numbers</code>의 <code>j</code>번째의 숫자를 <code>i</code>로 나눴을 때 정수이면서, 1보다 크면 <code>i</code>의 배수의 이므로 소수에서 제외된다.
바. 변수 <code>sumOfPrimes</code>는 reduce 메소드의 callback 함수로 사용되는 함수를 정의했다.</p>
<p>풀이하면서 반복문을 중첩해서 사용한 점이 마음에 안 든다. 반복문을 중첩해서 사용하지 않고 풀이하는 방법이 있을 거 같다. 좀 더 생각해 보고 다른 풀이 방법을 생각해 봐야겠다.
위의 풀이 방법은 에라토스테네스의 체를 구현 방법이다. 연속되는 숫자들 중에 2는 자기자신과 1로 나누어 지고 나머지 숫자들은 2로 나누어지는 것들은 제외한다는 소수판별법이다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[19.11.29.금 TIL]]></title>
            <link>https://velog.io/@ki_blank/19.11.29.%EA%B8%88-TIL</link>
            <guid>https://velog.io/@ki_blank/19.11.29.%EA%B8%88-TIL</guid>
            <pubDate>Fri, 29 Nov 2019 10:57:46 GMT</pubDate>
            <description><![CDATA[<ul>
<li>GraphQL을 공부했다. GraphQL에서는 Query와 Resolver의 관계가 중요하다. Query에서 원하는 값을 정의하고 Resolver에서 원하는 값을 얻는다. resolver에서 api로 접근할 수 있고, DB에도 접근이 가능하다. overfetching과 underfetching도 알게 됐다. overfetching은 필요한 데이터만 가져와야하는데 필요하지 않은 정보까지도 가져오는데 overfetching이다. underfetching은 데이터를 한번에 조회하면 이상적인데 데이터를 여러 개를 걸쳐서 가져와야하는게 underfetching이다. graphql은 이런게 과정이 두개의 과정이 필요치 않고 가져올 수 있는 장점이 있다고 한다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[알고리즘 - freeCodeCamp - Sum All Odd Fibonacci Numbers]]></title>
            <link>https://velog.io/@ki_blank/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-freeCodeCamp-Sum-All-Odd-Fibonacci-Numbers</link>
            <guid>https://velog.io/@ki_blank/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-freeCodeCamp-Sum-All-Odd-Fibonacci-Numbers</guid>
            <pubDate>Fri, 29 Nov 2019 02:05:28 GMT</pubDate>
            <description><![CDATA[<h4 id="문제">문제</h4>
<p>매개변수 num까지 범위에서 fibonacci 수열 중에 홀수 인 숫자들의 합을 구하시오.</p>
<h4 id="풀이">풀이</h4>
<pre><code class="language-javascript">function sumFibs(num) {
  let num1 = 0;
  let num2 = 1;
  let sumNumbers = 1;

  const recursion = originNum =&gt; {
    let result = num1 + num2;
    if (result &gt; originNum) {
      return sumNumbers;
    } else if (result &lt;= originNum) {
      if (isOdd(result)) {
        sumNumbers += result;
      }
      num1 = num2; 
      num2 = result;
      return recursion(originNum);
    }
  }

  return recursion(num);
}

function isOdd(num) {
  if (num % 2) {
    return true;
  }
  return false;
}</code></pre>
<p>피보나치수열이 어떤건지 알아야 한다. f1은 0, f2 는 1 이라고 한다면 f1과 f2의 합은 1 이다. 결과값을 f3이라 하자. f3에 f2의 값을 더하면 2가 되고 2 에 f3의 값을 더하면 3, 3에 2(이전 결과값)를 더하면 5 가 됩니다. 결과값의 이전의 결과값을 더 해가면서 수가 점점 커지게 된다.
피보나치 수열이 0부터 시작한다고 가정하고 변수 num1 = 0, num2 = 1 선언한다.
sumNumbers의 값은 1이다. 왜냐면 recursion 함수에서 재귀하면서 결과값에 더하기 때문에 1이 한번 밖에 나오지 않으니 1를 할당한다.
recursion 함수에는 result 변수가 있다. result 값은 num1과 num2의 더한 값이다. result가 매개변수 값보다 크면 sumNumbers를 반환한다. 그렇지 않고 result값이 매개변수 값보다 적거나 같으면 홀수 인지 판별한다. 홀수면 sumNumbers에 값을 더한다. 그리고 홀수, 짝수 상관없이 num1 은 num2의 값이 되고, num2는 result의 값이 된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[19.11.27.수 - TIL]]></title>
            <link>https://velog.io/@ki_blank/19.11.27.%EC%88%98-TIL</link>
            <guid>https://velog.io/@ki_blank/19.11.27.%EC%88%98-TIL</guid>
            <pubDate>Wed, 27 Nov 2019 11:31:26 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>TypeScript를 알게됐다. TypeScript를 기초부터 공부했는데 type을 정해주고, object의 타입들을 정해서 그걸로 매개변수의 타입으로 정한 후 사용한다. interface가 그 기능이다. 왠지 interface의 타입을 중복해서 써야하는 상황이 올거 같다. 그러면 헷갈리지 않을까라는 생각이 든다. 중첩해서 사용하게 된다면 함수형 프로그래밍 처럼 같은 결과로만 나오게 신경써서 사용해야겠다. 꼬이지 않게.....</p>
</li>
<li><p>다음할 일
TypeScript + react를 이용해서 TodoList 만들기</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[TypeScript - 간단한 예제로 JS에서 TypeScript 사용하기]]></title>
            <link>https://velog.io/@ki_blank/TypeScript-%EA%B0%84%EB%8B%A8%ED%95%9C-%EC%98%88%EC%A0%9C%EB%A1%9C-JS%EC%97%90%EC%84%9C-TypeScript-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-g7k3h71wv4</link>
            <guid>https://velog.io/@ki_blank/TypeScript-%EA%B0%84%EB%8B%A8%ED%95%9C-%EC%98%88%EC%A0%9C%EB%A1%9C-JS%EC%97%90%EC%84%9C-TypeScript-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-g7k3h71wv4</guid>
            <pubDate>Wed, 27 Nov 2019 11:25:25 GMT</pubDate>
            <description><![CDATA[<p>공식문서를 보며 TypeScript를 공부한 내용을 기록합니다. </p>
<p>타입스크립트를 설치합시다.</p>
<pre><code class="language-shell">npm install -g typescript</code></pre>
<h4 id="파일구조">파일구조</h4>
<pre><code class="language-shell">index.html
greeter.ts</code></pre>
<h4 id="indexhtml">index.html</h4>
<pre><code class="language-javascript">&lt;!doctype html&gt;
&lt;html&gt;
  &lt;body&gt;
      &lt;script src=&quot;greeter.js&quot;&gt;&lt;/script&gt;
  &lt;/body&gt;
&lt;/html&gt;</code></pre>
<h4 id="greeterts">greeter.ts</h4>
<pre><code class="language-typescript">function greeter(person) {
    return &quot;Hello, &quot; + person;
}

let user = &quot;Jane User&quot;;

document.body.textContent = greeter(user);</code></pre>
<p>greeter.js 파일이 없어서 <code>script</code>태그에서 사용할 수 없습니다. .ts 파일을 .js 파일로 <code>complie</code>를 해야합니다. 컴파일 할 땐 terminal에서</p>
<pre><code class="language-shell">tsc greeter.ts</code></pre>
<p>명령어를 터미널에서 입력해야합니다. 그럼 <code>greeter.js</code> 파일이 생성됩니다. ts 파일을 js 파일로 complie하는 방법을 알았습니다. 👏👏👏</p>
<p>하지만 파일들을 살펴보면 별반 다를게 없습니다. greeter.ts 파일엣 TypeScript의 타입 주석을 greeter 함수의 매개변수에 추가해 보도록 하겠습니다.</p>
<h4 id="greeterts-에-타입-주석-추가하기">greeter.ts 에 타입 주석 추가하기</h4>
<pre><code class="language-typescript">function greeter(person: string) {
    return &quot;Hello, &quot; + person;
}

let user = &quot;Jane User&quot;;

document.body.textContent = greeter(user);</code></pre>
<p>위에 코드를 보면 매개변수에 <code>: string</code>을 추가되 있는걸 확인할 수 있습니다.
<code>user</code>변수를 숫자 배열로 바꿔서 complie를 하겠습니다.</p>
<pre><code class="language-javascript">//...
let user = [0, 1, 2];
//...</code></pre>
<pre><code class="language-shell">tsc greeter.ts</code></pre>
<p>에러가 발생합니다. </p>
<pre><code>Argument of type &#39;number[]&#39; is not assignable to parameter of type &#39;string&#39;.</code></pre><p>TypeScript는 매개변수로 어떤 타입이 들어올지 정할 수 있고, 정해준 타입되로 들어오지 않는다면 에러메세지를 보여주고 어디가 틀렸는지 나타내 줍니다.</p>
<p>object의 type의 형태는 <code>interface</code>를 이용해서 정할 수 있습니다.</p>
<h4 id="typescript---interface">TypeScript - interface</h4>
<pre><code class="language-typescript">interface Person { // 가.
    firstName: string; // 나.
    lastName: string; // 다.
}

function greeter(person: Person) { // 라.
    return &quot;Hello, &quot; + person.firstName + &quot; &quot; + person.lastName;
}

let user = { firstName: &quot;Jane&quot;, lastName: &quot;User&quot;};

document.body.textContent = greeter(user);</code></pre>
<p>가. interface 로 Person 이름의 타입을 정의합니다.
나. firstName의 타입은 string.
다. lastName의 타입은 string.
라. 매개변수로 사용하는 타입은 Person 을 사용한다.</p>
<p>lastName을 숫자로 바꾸면
<img src="https://images.velog.io/post-images/ki_blank/62a64ad0-1107-11ea-9390-0df3f5a79e40/-2019-11-27-8.15.47.png" alt="스크린샷 2019-11-27 오후 8.15.47.png">
에러를 발생합니다.</p>
<p>TypeScript는 정말 강력한 무기인 거 같습니다. .ts 파일을 새로작성하거나 수정하면 complie를 꼭 해줘야 합니다. 계속 일일이 complie 한다면 효율적이지 않습니다. package.json, webpack 설정 또는 비슷한 설정을 통해서 complie 할 수 있을 겁니다.</p>
<p>댓글은 환영입니다~</p>
<p>참고문서
<a href="https://www.typescriptlang.org/docs/handbook/typescript-in-5-minutes.html">https://www.typescriptlang.org/docs/handbook/typescript-in-5-minutes.html</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[알고리즘 - freeCodeCamp -  Convert HTML EntitiesPassed]]></title>
            <link>https://velog.io/@ki_blank/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-freeCodeCamp-Convert-HTML-EntitiesPassed</link>
            <guid>https://velog.io/@ki_blank/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-freeCodeCamp-Convert-HTML-EntitiesPassed</guid>
            <pubDate>Wed, 27 Nov 2019 01:35:32 GMT</pubDate>
            <description><![CDATA[<h4 id="문제">문제</h4>
<p>특수 문자 <code>&amp;, &lt;, &gt;, &quot;, &#39;</code>를 <code>&amp;amp;, &amp;lt;, &amp;gt;, &amp;quot;, &amp;apos;</code> 로 변경하세요.</p>
<h4 id="예시">예시</h4>
<p>&quot;Hamburgers &lt; Pizza &lt; Tacos&quot; --&gt; &quot;Hamburgers &lt; Pizza &lt; Tacos&quot;
&quot;Dolce &amp; Gabbana&quot; --&gt; &quot;Dolce &amp; Gabbana&quot;
&quot;Schindler&#39;s List&quot; --&gt; &quot;Schindler&apos;s List&quot;
&quot;abc&quot; --&gt; &quot;abc&quot;</p>
<h4 id="해결방법">해결방법</h4>
<pre><code class="language-javascript">function convertHTML(str) {
  // &amp;colon;&amp;rpar;
  let specialLetter = `&amp;&lt;&gt;&quot;&#39;`
  for (let i = 0; i &lt; str.length; i++) {
    if (specialLetter.search(str[i]) &gt; -1) {
      str = str.replace(str[i], searchChart(str[i]));
    }
  }
  return str;
}

function ampSemi(str) {
  return `&amp;${str};`
}

function searchChart(str) {
  switch (str) {
    case &quot;&amp;&quot; :
    return ampSemi(&quot;amp&quot;);
    case &quot;&lt;&quot; :
    return ampSemi(&quot;lt&quot;);
    case &quot;&gt;&quot; :
    return ampSemi(&quot;gt&quot;);
    case `&quot;` :
    return ampSemi(&quot;quot&quot;);
    case &quot;&#39;&quot; :
    return ampSemi(&quot;apos&quot;);
  }
}</code></pre>
<p>변수 선언을 해서 특수 문자를 값으로 할당합니다. 반환값에 <code>&amp;</code>와<code>;</code>이 있어서 항상 같은 값을 반환하는 <code>ampSemi</code>함수를 생성합니다. <code>searchChart</code>함수는 switch문을 사용해서 각 특수문자에 맞는 값을 반환하도록 했습니다. <code>convertHTML</code>함수는 반복문을 통해 특수문자가 있는지 확인하고 값을 반환합니다.  </p>
]]></description>
        </item>
    </channel>
</rss>