<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>yjs.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Sat, 11 Feb 2023 22:19:01 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>yjs.log</title>
            <url>https://velog.velcdn.com/images/hey_siri/profile/5e8898af-3400-46db-9426-413ab88c2bcc/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. yjs.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/hey_siri" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[programmers] 올바른 괄호 - javascript]]></title>
            <link>https://velog.io/@hey_siri/programmers-%EC%98%AC%EB%B0%94%EB%A5%B8-%EA%B4%84%ED%98%B8-javascript</link>
            <guid>https://velog.io/@hey_siri/programmers-%EC%98%AC%EB%B0%94%EB%A5%B8-%EA%B4%84%ED%98%B8-javascript</guid>
            <pubDate>Sat, 11 Feb 2023 22:19:01 GMT</pubDate>
            <description><![CDATA[<h1 id="문제-링크">문제 링크</h1>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/12909">https://school.programmers.co.kr/learn/courses/30/lessons/12909</a></p>
<h1 id="효율성-통과-못한-코드-1">효율성 통과 못한 코드 1</h1>
<pre><code class="language-javascript">function solution(s) {
  let stack = [];
  for (let i = 0; i &lt; s.length; i++) {
    if (s[i] === &quot;(&quot;) {
      stack.push(0);
    } else {
      if (stack.length !== 0) {
        stack.pop();
      } else {
        return false;
      }
    }
  }
  let answer = stack.length === 0;
  return answer;
}</code></pre>
<h1 id="효율성-통과한-코드">효율성 통과한 코드</h1>
<pre><code class="language-javascript">function solution(s) {
  let cnt = 0;
  for (let x of s) {
    x === &quot;(&quot; ? cnt++ : cnt--;
    if (cnt &lt; 0) return false;
  }
  return !cnt;
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Javascript] 배열의 범위를 벗어난 인덱스로 배열에 접근할 때 어떻게 될까]]></title>
            <link>https://velog.io/@hey_siri/Javascript-%EB%B0%B0%EC%97%B4%EC%9D%98-%EB%B2%94%EC%9C%84%EB%A5%BC-%EB%B2%97%EC%96%B4%EB%82%9C-%EC%9D%B8%EB%8D%B1%EC%8A%A4%EB%A1%9C-%EB%B0%B0%EC%97%B4%EC%97%90-%EC%A0%91%EA%B7%BC%ED%95%A0-%EB%95%8C-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%90%A0%EA%B9%8C</link>
            <guid>https://velog.io/@hey_siri/Javascript-%EB%B0%B0%EC%97%B4%EC%9D%98-%EB%B2%94%EC%9C%84%EB%A5%BC-%EB%B2%97%EC%96%B4%EB%82%9C-%EC%9D%B8%EB%8D%B1%EC%8A%A4%EB%A1%9C-%EB%B0%B0%EC%97%B4%EC%97%90-%EC%A0%91%EA%B7%BC%ED%95%A0-%EB%95%8C-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%90%A0%EA%B9%8C</guid>
            <pubDate>Sat, 11 Feb 2023 14:32:17 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-javascript">let arr = [0];
console.log(arr[1]);//undefined</code></pre>
<p>위 코드를 실행하면 어떻게 될까?</p>
<p>정답: undefined를 출력한다.</p>
<p>다른 언어들과는 달리 index error가 발생하지 않는다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[programmers] 문자열 내 마음대로 정렬하기 #JAVA #숏코딩]]></title>
            <link>https://velog.io/@hey_siri/programmers-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%82%B4-%EB%A7%88%EC%9D%8C%EB%8C%80%EB%A1%9C-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0-%EC%88%8F%EC%BD%94%EB%94%A9</link>
            <guid>https://velog.io/@hey_siri/programmers-%EB%AC%B8%EC%9E%90%EC%97%B4-%EB%82%B4-%EB%A7%88%EC%9D%8C%EB%8C%80%EB%A1%9C-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0-%EC%88%8F%EC%BD%94%EB%94%A9</guid>
            <pubDate>Tue, 24 Jan 2023 20:14:38 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<blockquote>
<p>문자열 내 마음대로 정렬하기
Lv.1
<a href="https://school.programmers.co.kr/learn/courses/30/lessons/12915?language=java">문제 링크</a></p>
</blockquote>
<h1 id="풀이">풀이</h1>
<hr>
<pre><code class="language-java">import java.util.*;
class Solution {
    public String[] solution(String[] strings, int n) {
       Arrays.sort(strings);
        Arrays.sort(strings, (a, b) -&gt; a.charAt(n) - b.charAt(n));
        return strings;
    }
}</code></pre>
<h1 id="결과">결과</h1>
<hr>
<p><img src="https://velog.velcdn.com/images/hey_siri/post/c9731e0a-b946-4863-8355-978f8bdd9229/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Programmers] 나누어 떨어지는 숫자 배열 - Java]]></title>
            <link>https://velog.io/@hey_siri/Programmers-%EB%82%98%EB%88%84%EC%96%B4-%EB%96%A8%EC%96%B4%EC%A7%80%EB%8A%94-%EC%88%AB%EC%9E%90-%EB%B0%B0%EC%97%B4-Java</link>
            <guid>https://velog.io/@hey_siri/Programmers-%EB%82%98%EB%88%84%EC%96%B4-%EB%96%A8%EC%96%B4%EC%A7%80%EB%8A%94-%EC%88%AB%EC%9E%90-%EB%B0%B0%EC%97%B4-Java</guid>
            <pubDate>Tue, 17 Jan 2023 10:42:44 GMT</pubDate>
            <description><![CDATA[<h1 id="문제-정보">문제 정보</h1>
<hr>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/12910">문제 링크</a>
난이도 : Lv.1</p>
<h1 id="풀이1">풀이1</h1>
<hr>
<blockquote>
<p>for문을 사용한 방식보다 느리다는 의견이 있어서 for문을 사용해서 다시 풀어봐야겠다.</p>
</blockquote>
<pre><code class="language-java">import java.util.*;
class Solution {
    public int[] solution(int[] arr, int divisor) {
        int[] answer = Arrays.stream(arr).filter(i -&gt; i % divisor == 0).sorted().toArray();
        return answer.length == 0 ? new int[] {-1} : answer;
    }
}</code></pre>
<p><img src="https://velog.velcdn.com/images/hey_siri/post/15ff119a-79bd-415f-8d6a-6cfc13195b84/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[programmers] 같은 숫자는 싫어 - Java]]></title>
            <link>https://velog.io/@hey_siri/programmers-%EA%B0%99%EC%9D%80-%EC%88%AB%EC%9E%90%EB%8A%94-%EC%8B%AB%EC%96%B4-Java</link>
            <guid>https://velog.io/@hey_siri/programmers-%EA%B0%99%EC%9D%80-%EC%88%AB%EC%9E%90%EB%8A%94-%EC%8B%AB%EC%96%B4-Java</guid>
            <pubDate>Tue, 17 Jan 2023 06:45:02 GMT</pubDate>
            <description><![CDATA[<h1 id="문제-링크">문제 링크</h1>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/12906?language=java">문제 링크</a></p>
<h1 id="풀이">풀이</h1>
<p>배열 arr 원소의 크기가 0~9 이므로
latest를 -1로 초기화 한다.</p>
<p>배열은 크기가 정해져 있으므로 원소를 추가할 수 있는 ArrayList를 만들어준다.
ArrayList를 stream을 사용해서 배열로 변환한다.</p>
<pre><code class="language-java">public class Solution {
    public int[] solution(int[] arr) {
        int latest = -1;
        List&lt;Integer&gt; tmp = new ArrayList&lt;Integer&gt;();
        for (int num : arr) {
            if (latest != num) {
                tmp.add(num);
                latest = num;
            }
        }
        return tmp.stream().mapToInt(i -&gt; i).toArray();
    }</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Codility] FrogJmp - javascript 1줄]]></title>
            <link>https://velog.io/@hey_siri/Codility-FrogJmp-javascript-1%EC%A4%84</link>
            <guid>https://velog.io/@hey_siri/Codility-FrogJmp-javascript-1%EC%A4%84</guid>
            <pubDate>Fri, 02 Dec 2022 09:02:12 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<p><a href="https://app.codility.com/programmers/lessons/3-time_complexity/frog_jmp/">[문제 링크]</a></p>
<p>개구리가 좌표 X부터 좌표 Y 이상까지 D간격으로 점프해서 도착해야한다.
점프를 최소 몇번 해야하는지 return 한다.</p>
<h2 id="예제-1">예제 1</h2>
<h3 id="예제-입력-1">예제 입력 1</h3>
<pre><code>X = 10
Y = 85
D = 30</code></pre><h3 id="예제-출력">예제 출력</h3>
<pre><code>3</code></pre><h1 id="소스코드">소스코드</h1>
<pre><code class="language-javascript">function solution(X, Y, D) {
    return Math.ceil((Y - X) / D);
}</code></pre>
<h1 id="결과">결과</h1>
<p><img src="https://velog.velcdn.com/images/hey_siri/post/65d525c1-4d8f-4185-85f4-0a71f72f3930/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Codility] OddOccurrencesInArray - javascript 3줄]]></title>
            <link>https://velog.io/@hey_siri/Codility-OddOccurrencesInArray-javascript-3%EC%A4%84</link>
            <guid>https://velog.io/@hey_siri/Codility-OddOccurrencesInArray-javascript-3%EC%A4%84</guid>
            <pubDate>Fri, 02 Dec 2022 08:45:20 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<p><a href="https://app.codility.com/programmers/lessons/2-arrays/odd_occurrences_in_array/">[문제 링크]</a></p>
<p>입력으로 주어진 배열 A에서 홀수번 등장한 숫자 1개를 return 한다.</p>
<h1 id="풀이">풀이</h1>
<p>배열을 순회하면서 해당 요소가 집합 answer에 존재하면 제거하고, 존재하지 않으면 추가한다.
반복문을 다 돌고 나면 결국 홀수번 등장한 숫자 1개만 집합 answer에 남게 된다.</p>
<h1 id="소스코드">소스코드</h1>
<pre><code class="language-javascript">function solution(A) {
    let answer = new Set();
    A.forEach((n) =&gt; { answer.has(n) ? answer.delete(n) : answer.add(n) });
    return [...answer][0];
}</code></pre>
<h1 id="결과">결과</h1>
<p><img src="https://velog.velcdn.com/images/hey_siri/post/7b9cddbb-4d0c-411f-91c0-85615748744b/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Codility] CyclicRotation - javascript 2줄]]></title>
            <link>https://velog.io/@hey_siri/Codility-CyclicRotation-javascript</link>
            <guid>https://velog.io/@hey_siri/Codility-CyclicRotation-javascript</guid>
            <pubDate>Fri, 02 Dec 2022 07:26:52 GMT</pubDate>
            <description><![CDATA[<h1 id="문제">문제</h1>
<p><a href="https://app.codility.com/programmers/lessons/2-arrays/cyclic_rotation/">문제 링크</a></p>
<p>배열 A를 K번 회전한 배열을 return하면 되는 문제이다.</p>
<h2 id="예제-1">예제 1</h2>
<h3 id="예제-입력-1">예제 입력 1</h3>
<pre><code>A = [3, 8, 9, 7, 6]
K = 3</code></pre><h3 id="예제-출력-1">예제 출력 1</h3>
<pre><code>[9, 7, 6, 3, 8]</code></pre><h3 id="예제-1-rotation-과정">예제 1 Rotation 과정</h3>
<pre><code>[3, 8, 9, 7, 6] -&gt; [6, 3, 8, 9, 7]
[6, 3, 8, 9, 7] -&gt; [7, 6, 3, 8, 9]
[7, 6, 3, 8, 9] -&gt; [9, 7, 6, 3, 8]</code></pre><h2 id="예제-2">예제 2</h2>
<h3 id="예제-입력-2">예제 입력 2</h3>
<pre><code>A = [0, 0, 0]
K = 1</code></pre><h3 id="예제-출력-2">예제 출력 2</h3>
<pre><code>[0, 0, 0]</code></pre><h2 id="예제-3">예제 3</h2>
<h3 id="예제-입력-3">예제 입력 3</h3>
<pre><code>A = [1, 2, 3, 4]
K = 4</code></pre><h3 id="예제-출력-3">예제 출력 3</h3>
<pre><code>[1, 2, 3, 4]</code></pre><h1 id="소스코드">소스코드</h1>
<pre><code class="language-javascript">function solution(A, K) {
    const N = A.length - (K % A.length);
    return A.slice(N).concat(A.slice(0, N));
}</code></pre>
<h1 id="결과">결과</h1>
<p><img src="https://velog.velcdn.com/images/hey_siri/post/3e8da871-c02f-43b5-8f01-93d368b1b3d8/image.png" alt=""></p>
<hr>
<p>for문을 안쓰고 풀어서 기분이 좋았다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Vue] 새 vue 프로젝트 생성하면 자주 쓰는 것들 모음 - vue project routine]]></title>
            <link>https://velog.io/@hey_siri/Vue-%EC%83%88-vue-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%83%9D%EC%84%B1%ED%95%98%EB%A9%B4-%EC%9E%90%EC%A3%BC-%EC%93%B0%EB%8A%94-%EA%B2%83%EB%93%A4-%EB%AA%A8%EC%9D%8C-vue-project-routine</link>
            <guid>https://velog.io/@hey_siri/Vue-%EC%83%88-vue-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%83%9D%EC%84%B1%ED%95%98%EB%A9%B4-%EC%9E%90%EC%A3%BC-%EC%93%B0%EB%8A%94-%EA%B2%83%EB%93%A4-%EB%AA%A8%EC%9D%8C-vue-project-routine</guid>
            <pubDate>Tue, 29 Nov 2022 12:13:04 GMT</pubDate>
            <description><![CDATA[<h3 id="프로젝트-생성-실행-빌드">프로젝트 생성, 실행, 빌드</h3>
<h4 id="프로젝트-생성">프로젝트 생성</h4>
<pre><code class="language-shell">$ vue create 프로젝트이름</code></pre>
<ul>
<li>프로젝트 이름에는 대문자가 들어갈 수 없다</li>
</ul>
<h4 id="프로젝트-실행">프로젝트 실행</h4>
<pre><code class="language-shell">$ npm run serve</code></pre>
<h4 id="프로젝트-빌드">프로젝트 빌드</h4>
<pre><code class="language-shell">$ npm run build</code></pre>
<h3 id="vueconfigjs-설정">vue.config.js 설정</h3>
<blockquote>
<h4 id="기본값--vue-3213-기준">기본값 ( vue 3.2.13 기준)</h4>
</blockquote>
<pre><code class="language-javascript">const { defineConfig } = require(&#39;@vue/cli-service&#39;)
module.exports = defineConfig({
  transpileDependencies: true
})</code></pre>
<h4 id="github-pages에-배포하기-위한-설정">GitHub Pages에 배포하기 위한 설정</h4>
<ol>
<li>build 파일 저장 경로를 docs로 바꿔주면 편하다.
(기본 저장 경로는 dist이다.)</li>
<li>publicPath를 정해주지 않으면 github pages에 배포시 빈화면이 뜰 수 있다.</li>
<li>assetsDir를 정해주지 않으면 이미지 파일이 제대로 표시되지 않을 수 있다.</li>
<li>github pages 설정에서 folder를 docs로 바꿔주자
<img src="https://velog.velcdn.com/images/hey_siri/post/8d12c961-9847-4cd0-90bf-7bec23316c99/image.png" alt=""></li>
</ol>
<pre><code class="language-javascript">const { defineConfig } = require(&quot;@vue/cli-service&quot;);
module.exports = defineConfig({
  transpileDependencies: true,
  outputDir: &quot;./docs&quot;, //build 결과물을 docs라는 폴더에 저장
  publicPath: &quot;./&quot;,
  assetsDir: &quot;./&quot;,
});</code></pre>
<h3 id="pretendard-폰트-설정">Pretendard 폰트 설정</h3>
<p><a href="https://github.com/orioncactus/pretendard">Github 링크</a></p>
<ol>
<li>가변 다이나믹 서브셋<pre><code class="language-html">&lt;link rel=&quot;stylesheet&quot; as=&quot;style&quot; crossorigin href=&quot;https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.6/dist/web/variable/pretendardvariable-dynamic-subset.css&quot; /&gt;</code></pre>
</li>
</ol>
<pre><code class="language-css">font-family: &quot;Pretendard Variable&quot;, Pretendard, -apple-system, BlinkMacSystemFont, system-ui, Roboto, &quot;Helvetica Neue&quot;, &quot;Segoe UI&quot;, &quot;Apple SD Gothic Neo&quot;, &quot;Noto Sans KR&quot;, &quot;Malgun Gothic&quot;, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, sans-serif;</code></pre>
<ol start="2">
<li>가변 다이나믹 서브셋 - JP<pre><code class="language-html">&lt;link rel=&quot;stylesheet&quot; as=&quot;style&quot; crossorigin href=&quot;https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.6/dist/web/variable/pretendardvariable-jp-dynamic-subset.css&quot; /&gt;</code></pre>
<pre><code class="language-css">font-family: &quot;Pretendard JP Variable&quot;, &quot;Pretendard JP&quot;, Pretendard, -apple-system, BlinkMacSystemFont, system-ui, Roboto, &quot;Helvetica Neue&quot;, &quot;Segoe UI&quot;, &quot;Hiragino Sans&quot;, &quot;Apple SD Gothic Neo&quot;, Meiryo, &quot;Noto Sans JP&quot;, &quot;Noto Sans KR&quot;, &quot;Malgun Gothic&quot;, Osaka, &quot;Apple Color Emoji&quot;, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;, sans-serif;</code></pre>
</li>
</ol>
<h3 id="font-awesome-설정">Font awesome 설정</h3>
<p><a href="https://cdnjs.com/libraries/font-awesome">CDN 주소 모음 링크</a></p>
<h3 id="css-설정">CSS 설정</h3>
<pre><code class="language-css">body,html{
  height: 100%;
}
body {
margin : 0px;
}
#app {
  height: 100%;
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Codility] Binary gap - javascript]]></title>
            <link>https://velog.io/@hey_siri/Codility-Binary-gap</link>
            <guid>https://velog.io/@hey_siri/Codility-Binary-gap</guid>
            <pubDate>Tue, 29 Nov 2022 11:35:47 GMT</pubDate>
            <description><![CDATA[<h2 id="문제">문제</h2>
<p><a href="https://app.codility.com/programmers/lessons/1-iterations/binary_gap/">[문제 링크]</a></p>
<blockquote>
<p>Binary gap의 최댓값을 구하는 문제이다.
Binary gap은 이진수에서  1로 둘러싸인 연속된 0의 개수이다.</p>
</blockquote>
<p>예) </p>
<ol>
<li>9는 이진수로 1001이다. binary gap은 2이다.</li>
<li>529는 이진수로 1000010001이다. binary gap은 4와 3으로 총 2개이다.</li>
<li>20은 이진수로 10100이다. binary gap은 1이다.</li>
<li>15는 이진수로 1111이다. binary gap은 없다.</li>
<li>32는 이진수로 100000이다. binary gap은 없다.</li>
</ol>
<p>양의 정수 N이 주어진다.
가장 긴 binary gap을 반환해야한다.
binary gap이 없다면 0을 반환해야한다.</p>
<pre><code class="language-javascript">function solution(N) {
    const binaryN = N.toString(2); //2진수 문자열로 변환
    let binaryGap = 0;
    let answer = 0;
    for (let i = 1; i &lt; binaryN.length; i++) {
        if (binaryN[i] === &#39;0&#39;) {
            binaryGap++;
        }
        else {
            answer = Math.max(binaryGap, answer);
            binaryGap = 0;
        }
    }
    return answer;
}</code></pre>
<p>binaryN[0]은 무조건 1이므로 binaryN[1]부터 검사한다.</p>
<ul>
<li>0을 만나면 binaryGap을 1씩 증가하고</li>
<li>1을 만나면 answer에 가장 큰 binaryGap을 저장한다.</li>
</ul>
<hr>
<p>for문과 if문을 js스럽게 쓰지 않은 것 같다.
하지만 직관적으로 푼 것 같다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] ERR_OSSL_EVP_UNSUPPORTED 에러 해결]]></title>
            <link>https://velog.io/@hey_siri/TIL-ERROSSLEVPUNSUPPORTED-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0</link>
            <guid>https://velog.io/@hey_siri/TIL-ERROSSLEVPUNSUPPORTED-%EC%97%90%EB%9F%AC-%ED%95%B4%EA%B2%B0</guid>
            <pubDate>Sun, 16 Oct 2022 06:06:19 GMT</pubDate>
            <description><![CDATA[<pre><code class="language-shell">opensslErrorStack: [ &#39;error:03000086:digital envelope routines::initialization error&#39; ],
  library: &#39;digital envelope routines&#39;,
  reason: &#39;unsupported&#39;,
  code: &#39;ERR_OSSL_EVP_UNSUPPORTED&#39;
}</code></pre>
<h3 id="해결방법">해결방법</h3>
<p><code>npm audit fix --force</code></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[알고리즘] 동적계획법]]></title>
            <link>https://velog.io/@hey_siri/TIL-%EB%8F%99%EC%A0%81%EA%B3%84%ED%9A%8D%EB%B2%95-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@hey_siri/TIL-%EB%8F%99%EC%A0%81%EA%B3%84%ED%9A%8D%EB%B2%95-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sun, 02 Oct 2022 14:52:35 GMT</pubDate>
            <description><![CDATA[<h1 id="동적-계획법의-원리와-구현-방식">동적 계획법의 원리와 구현 방식</h1>
<ol>
<li>큰 문제를 작은 문제로 나눌 수 있어야 한다.</li>
<li>작은 문제들이 반복돼 나타나고 사용되며, 이 작은 문제들의 결괏값은 항상 같아야 한다.</li>
<li>모든 작은 문제들은 한 번만 계산해 DP 테이블에 저장하며 추후 재사용할 때는 이 DP 테이블을 이용한다. 이를 메모제이션(memoization) 기법이라고 한다.</li>
<li>동적 계획법은 톱-다운 방식과 바텀-업 방식으로 구현할 수 있다.</li>
</ol>
<h3 id="1--동적-계획법으로-풀-수-있는지-확인하기">1.  동적 계획법으로 풀 수 있는지 확인하기</h3>
<h3 id="2-점화식-세우기">2. 점화식 세우기</h3>
<h3 id="3-메모제이션-원리-이해하기">3. 메모제이션 원리 이해하기</h3>
<h3 id="4-톱-다운-구현-방식-이해하기">4. 톱-다운 구현 방식 이해하기</h3>
<ul>
<li>위에서부터 문제를 파악해 내려오는 방식</li>
<li>주로 재귀함수 형태로 구현</li>
<li>코드의 가독성이 좋고 이해하기 편함</li>
</ul>
<h3 id="5-바텀-업-구현-방식-이해하기">5. 바텀-업 구현 방식 이해하기</h3>
<ul>
<li>가장 작은 부분 문제부터 문제를 해결하면서 점점 큰 문제로 확장해 나가는 방식</li>
<li>주로 반복문의 형태로 구현</li>
</ul>
<h1 id="톱-다운-vs-바텀-업">톱-다운 VS 바텀-업</h1>
<ul>
<li>바텀-업이 좀 더 안전함</li>
<li>톱-다운 방식은 재귀 깊이 깊어지면 런타임 에러 발생 가능</li>
</ul>
<hr>
<h3 id="나의-생각">나의 생각</h3>
<p>동적계획법 문제를 풀다 보면 바텀-업 방식으로 구현할 일이 많은 것 같다.
점화식을 세우는 것이 중요한 것 같다.
점화식을 잘 세우는 친구에게 점화식을 잘 세우는 방법을 물어봤었는데, 처음에는 하나 하나 숫자를 쓰면서 규칙을 찾아보라고 조언해줬다.</p>
<hr>
<h3 id="출처">출처</h3>
<p>Do it 알고리즘 코딩 테스트 파이썬 편</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[네이버 웨일대학] 내가 크롬 대신 웨일만 쓰는 이유 - 개발자 추천 확장앱 7가지!]]></title>
            <link>https://velog.io/@hey_siri/%EB%84%A4%EC%9D%B4%EB%B2%84-%EC%9B%A8%EC%9D%BC%EB%8C%80%ED%95%99-%EB%82%B4%EA%B0%80-%ED%81%AC%EB%A1%AC-%EB%8C%80%EC%8B%A0-%EC%9B%A8%EC%9D%BC%EB%A7%8C-%EC%93%B0%EB%8A%94-%EC%9D%B4%EC%9C%A0-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EC%B6%94%EC%B2%9C-%ED%99%95%EC%9E%A5%EC%95%B1-7%EA%B0%80%EC%A7%80</link>
            <guid>https://velog.io/@hey_siri/%EB%84%A4%EC%9D%B4%EB%B2%84-%EC%9B%A8%EC%9D%BC%EB%8C%80%ED%95%99-%EB%82%B4%EA%B0%80-%ED%81%AC%EB%A1%AC-%EB%8C%80%EC%8B%A0-%EC%9B%A8%EC%9D%BC%EB%A7%8C-%EC%93%B0%EB%8A%94-%EC%9D%B4%EC%9C%A0-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EC%B6%94%EC%B2%9C-%ED%99%95%EC%9E%A5%EC%95%B1-7%EA%B0%80%EC%A7%80</guid>
            <pubDate>Tue, 13 Sep 2022 12:54:14 GMT</pubDate>
            <description><![CDATA[<p>저는 웨일 브라우저가 출시한지 얼마 되지 않았을 때 부터 웨일 브라우저를 사용해왔습니다.
사이드바, 마우스 제스쳐, 드래그 번역, 캡쳐 등.. 크롬보다 편리한 기능이 많으면서도 속도가 빠른편이라 계속 사용해왔습니다 😊
티켓팅, 수강신청에도 불리함을 느끼지 못했을 정도로 속도도 걱정 없는 편입니다.
실제로 이번에 웨일 브라우저로 사이버 강의를 최대 한도까지 수강신청하는데에 성공했기 때문에
이정도면 속도에 대한 걱정은 덜어도 될 것 같습니다.</p>
<h1 id="1-개발자-행사-데브-이벤트">1. <a href="https://store.whale.naver.com/detail/dfhagfnmecmkhdoeggeokfmmkbpiahek">개발자 행사 (데브 이벤트)</a></h1>
<p>개발자 행사들을 모아서 보여주는 사이드바 확장앱입니다.
잘 사용하고 있었는데 최근에 웹페이지에 오류가 난듯합니다 😭</p>
<p>여기서 구름 인프라 세미나, 캐치 LIVE클래스 강의와 같은 좋은 정보를 얻어서 신청도 해봤어요!
<img src="https://velog.velcdn.com/images/hey_siri/post/4d49110c-3201-408a-8560-023194835e4b/image.png" alt=""></p>
<h1 id="2-서핏---매일-성장하는-사람들의-커리어-플랫폼">2. <a href="https://store.whale.naver.com/detail/pbbmipiiemaohkkfebjjjceahfmgnnhj">서핏 - 매일 성장하는 사람들의 커리어 플랫폼</a></h1>
<p><img src="https://velog.velcdn.com/images/hey_siri/post/144a52be-7dd3-4a1d-b632-7a8ec3e290bf/image.png" alt=""></p>
<p>이 확장앱 또한 개발자에게 도움이되는 정보를 모아서 보여주는 프로그램입니다.
새탭 화면을 개발관련 아티클로 바꿔주는 형식입니다.
소셜 로그인을 하고 관심있는 분야를 선택하면 맞춤형으로 정보를 제공해줍니다.
데브 이벤트는 웨비나, 강의 등의 행사를 위주로 보여주지만 이 확장앱은 아티클 위주로 보여준다는게 가장 큰 차이점 같아요!
개발 뿐만 아니라 UI/UX 등 디자인 관련된 주제도 선택해서 볼 수 있어요</p>
<p>새탭만 열어도 매일 새로운 개발 상식과 트렌드를 얻을 수 있어서 추천하고 싶은 확장앱입니다!</p>
<h1 id="3-json-viewer">3. <a href="https://chrome.google.com/webstore/detail/json-viewer/gbmdgpbipfallnflgajpaliibnhdgobh">JSON Viewer</a></h1>
<p><img src="https://velog.velcdn.com/images/hey_siri/post/08d3a25e-4cc0-4b3f-9d13-bdb8aaf0cbfc/image.png" alt=""></p>
<p>JSON 형태의 응답을 라인넘버와 컨벤션을 적용해서 보기 편리하게 보여주는 확장앱입니다.
네이버 웨일은 크로미움 기반 브라우저라 크롬에서 쓸 수 있는 확장앱도 불러와서 사용할 수 있습니다.</p>
<h1 id="4백준허브baekjoonhub">4.<a href="https://chrome.google.com/webstore/detail/%EB%B0%B1%EC%A4%80%ED%97%88%EB%B8%8Cbaekjoonhub/ccammcjdkpgjmcpijpahlehmapgmphmk">백준허브(BaekjoonHub)</a></h1>
<p>깃허브 연동을 해두면 백준 문제를 풀 때마다 지정된 repository에 풀이에 성공한 문제를 파일로 만들어 커밋해줍니다.
하루에 한 문제씩 풀면 1일 1커밋도 자동으로 가능해서 잔디밭 채우기에도 좋아요 🤣</p>
<hr>
<h1 id="🌐-모든-사용자에게-추천하는-확장앱">🌐 모든 사용자에게 추천하는 확장앱</h1>
<p>개발자 뿐만 아니라 모든 사람들에게 추천하는
제가 많이 사용하는 확장앱도 소개해볼게요!</p>
<h1 id="1image-picker">1.<a href="https://store.whale.naver.com/detail/ohglpojaoenhkjeajodiejdjkhannkgp">image-picker</a></h1>
<p><img src="https://velog.velcdn.com/images/hey_siri/post/d58e2877-2282-47b5-984b-01d6ccd56569/image.png" alt=""></p>
<p>현재 보고있는 페이지의 이미지를 다운받을 수 있게 모두 띄워주는 확장앱입니다.
우클릭으로 다운로드가 되지 않는 경우에 유용합니다</p>
<h1 id="2우클릭-차단-해제">2.<a href="https://store.whale.naver.com/detail/ejlcpmnobnaebfcjkkadhppfcglncgak">우클릭 차단 해제</a></h1>
<p>제목 그대로 우클릭이 되지 않는 사이트에서 우클릭을 사용할 수 있게 해주는 확장앱입니다.
이걸 사용해도 우클릭이 되지 않았던적은 없던 것 같아요
거의 모든 사이트의 우클릭을 해제할 수 있습니다.</p>
<h1 id="3웨않되---맞춤법-검사기">3.<a href="https://store.whale.naver.com/detail/gmfkgfndfdfgbghjmmcpakibpbjpbfok">웨않되 - 맞춤법 검사기</a></h1>
<p>네이버 맞춤법 검사기를 활용한 사이드바 앱입니다.
입력폼을 작성할때도 실시간으로 맞춤법 검사를 해주고
사이드바 아이콘을 클릭해서 사이드바에서도 간단하게 맞춤법 검사를 이용할 수 있습니다. </p>
<p><img src="https://velog.velcdn.com/images/hey_siri/post/4e36a89d-e639-4ffe-991c-afcf71e9dc9f/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/hey_siri/post/6b6680e8-7f96-4c6c-acb6-c368e1066891/image.png" alt=""></p>
<hr>
<h1 id="마치며">마치며...</h1>
<p>다른 확장앱이 더 궁금하다면??</p>
<p><a href="https://store.whale.naver.com/extensions/new">웨일 스토어 바로가기</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CSS] 100%,100vh, 100vw의 차이]]></title>
            <link>https://velog.io/@hey_siri/TIL-CSS-100%EC%99%80-100vh-100vw%EC%9D%98-%EC%B0%A8%EC%9D%B4</link>
            <guid>https://velog.io/@hey_siri/TIL-CSS-100%EC%99%80-100vh-100vw%EC%9D%98-%EC%B0%A8%EC%9D%B4</guid>
            <pubDate>Fri, 02 Sep 2022 20:03:17 GMT</pubDate>
            <description><![CDATA[<h2 id="1-100">1. 100%</h2>
<p>100%는 부모 태그의 100%를 사용하겠다는 의미이다.
따라서 height 설정시에는 부모 태그의 height값이 있어야 한다.
width 설정시에는 부모 태그의 width값이 있어야 한다.</p>
<h4 id="주의사항">주의사항</h4>
<p>예를 들어, 부모 태그의 높이 값이 50%이고 자식 태그의 높이 값이 100%라면 자식 태그는 부모태그가 지정한 50%를 100% 보여준다는 의미이다.</p>
<pre><code class="language-css">.parent{
height:50%;
}

.parent &gt; div{
height:100% /*여기서 100%는 100vh와 다르다. (부모 태그에 종속되므로)*/
}</code></pre>
<h2 id="2-100vh">2. 100vh</h2>
<p>높이 설정 방식이다.
100vh는 부모태그와는 관련 없이 사용할 수 있다.
현재 보이는 뷰포트 높이의 100%를 의미한다.</p>
<pre><code class="language-css">.example{
height:100vh;
}</code></pre>
<h2 id="3-100vw">3. 100vw</h2>
<p>넓이 설정 방식이다.
이것 또한 100vh처럼 부모 태그와 관련 없이 사용할 수 있다.
현재 보이는 뷰포트 넓이의 100%를 의미한다.</p>
<pre><code class="language-css">.example{
width:100vw;
}</code></pre>
<hr>
<p>참고 : <a href="https://axce.tistory.com/36">https://axce.tistory.com/36</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[♻️ 1장 매직 넘버를 기호 상수로 치환]]></title>
            <link>https://velog.io/@hey_siri/1%EC%9E%A5-%EB%A7%A4%EC%A7%81-%EB%84%98%EB%B2%84%EB%A5%BC-%EA%B8%B0%ED%98%B8-%EC%83%81%EC%88%98%EB%A1%9C-%EC%B9%98%ED%99%98</link>
            <guid>https://velog.io/@hey_siri/1%EC%9E%A5-%EB%A7%A4%EC%A7%81-%EB%84%98%EB%B2%84%EB%A5%BC-%EA%B8%B0%ED%98%B8-%EC%83%81%EC%88%98%EB%A1%9C-%EC%B9%98%ED%99%98</guid>
            <pubDate>Mon, 22 Aug 2022 12:39:13 GMT</pubDate>
            <description><![CDATA[<h2 id="🌈-111-매직-넘버를-기호-상수로-치환">🌈 1.1.1 매직 넘버를 기호 상수로 치환</h2>
<p>소스코드에 특정한 숫자(<strong>매직 넘버</strong> (magic number))를 직접 적는 건 좋지 않은 코딩 스타일</p>
<h3 id="이유-1-매직넘버의-의미를-알기-어렵다">이유 1. 매직넘버의 의미를 알기 어렵다</h3>
<p><strong>100</strong> : 매직 넘버(의미를 알기 어려움)
<strong>MAX_INPUT_LENGTH</strong> : 기호 상수(의미를 알기 쉬움)</p>
<h3 id="이유-2-매직-넘버는-수정하기-어려움">이유 2. 매직 넘버는 수정하기 어려움</h3>
<blockquote>
<h4 id="매직-넘버-사용">매직 넘버 사용</h4>
</blockquote>
<pre><code class="language-java">if (100 &lt; input.length()){
    ...
}</code></pre>
<h4 id="매직-넘버를-기호-상수로-치환">매직 넘버를 기호 상수로 치환</h4>
<pre><code class="language-java">public class Something {
    public static final int MAX_INPUT_LENGTH = 100;
    ...
}</code></pre>
<pre><code class="language-java">if (Something.MAX_INPUT_LENGTH &lt; input.length()) {
    ...
}</code></pre>
<h2 id="🌈-122-리팩토링-실행">🌈 1.2.2 리팩토링 실행</h2>
<h3 id="1-기호-상수-선언하기">1. 기호 상수 선언하기</h3>
<h4 id="1-기호-상수-선언">(1) 기호 상수 선언</h4>
<p>자바에서 기호 상수를 만드는 방법은 두가지이다.</p>
<ul>
<li>public static final 클래스 필드를 이용하기</li>
<li>enum 사용하기</li>
</ul>
<p>이번에는 <strong>public static final</strong> 클래스 필드를 사용하는 방법을 설명한다.
enum을 사용하는 방법은 &#39;1.3 한걸음 더 나아가기&#39;에서 설명한다.</p>
<p><strong>public static final</strong> 키워드는 다음 목적으로 사용합니다.</p>
<ul>
<li><strong>public</strong>은 클래스 외부에서도 참조할 수 있음</li>
<li><strong>static</strong>은 클래스 필드로 만듦</li>
<li><strong>final</strong>은 잘못해서 할당하지 않도록 함</li>
</ul>
<p>어떤 클래스 안에서만 사용할 기호 상수를 선언한다면 <strong>private ststic final</strong>도 가능.
명령어를 나타내는 기호 상수를 <strong>Robot</strong> 클래스 안에 선언하면 다음과 같다.</p>
<pre><code class="language-java">public static final int COMMAND_WALK = 0;
public static final int COMMAND_STOP = 1;
public static final int COMMAND_JUMP = 2;</code></pre>
<h4 id="2-매직-넘버를-기호-상수로-치환">(2) 매직 넘버를 기호 상수로 치환</h4>
<p><strong>Robot</strong> 클래스에서는 order 메서드를 수정합니다.</p>
<pre><code class="language-java">public void order(int command){
    //if (command == 0){
    if (command == COMMAND_WALK){
        System.out.println(_name + &quot; walks.&quot;);
    //} else if (command == 1){
    } else if (command == COMMAND_STOP){
        System.out.println(_name + &quot; stops.&quot;);
    //} else if (command == 2){
    } else if (command == COMMAND_JUMP){
        System.out.println(_name + &quot; jumps.&quot;);
    } else {
        System.out.println(&quot;Command error. command = &quot; + command);
    }
}</code></pre>
<p><strong>Main</strong> 클래스에서는 <strong>main</strong> 메서드를 변경하는데, <strong>Main</strong> 클래스에서 <strong>Robot</strong> 클래스 상수를 참조하려면 상수 앞에 <strong>Robot.</strong>을 붙여야 합니다.</p>
<pre><code class="language-java">public static void main(String[] args){
    Robot robot = new Robot(&quot;Andrew&quot;);
    robot.order(Robot.COMMAND_WALK);
    robot.order(Robot.COMMAND_STOP);
    robot.order(Robot.COMMAND_JUMP);
}</code></pre>
<h4 id="3-기호-상수에-의존하는-다른-매직-넘버를-찾아서-기호-상수를-사용한-표현식으로-변환중요">(3) 기호 상수에 의존하는 다른 매직 넘버를 찾아서 기호 상수를 사용한 표현식으로 변환(중요)</h4>
<p>이 단계에 대해서는 &#39;상수 의존 관계&#39; 칼럼을 참조.</p>
<blockquote>
<h3 id="상수-의존-관계">상수 의존 관계</h3>
<p><strong>작업영역의 길이는 최대 입력 길이의 2배다.</strong>
의존 관계가 있는 매직 넘버를 이렇게 따로 따로 기호 상수로 만들면 안된다.</p>
</blockquote>
<pre><code class="language-java">  public static final int MAX_INPUT_LENGTH = 100;
  public static final int WORK_AREA_LENGTH = 200;</code></pre>
<p>  그렇게 하면 두 상수 의존 관계를 표현할 수 없기 때문이다. 다음처럼 표현식으로 의존 관계를 표현하는게 올바르다.</p>
<pre><code class="language-java">  public static final int MAX_INPUT_LENGTH = 100;
  public static final int WORK_AREA_LENGTH = MAX_INPUT_LENGTH * 2;</code></pre>
<h4 id="4-컴파일">(4) 컴파일</h4>
<p>기호 상수 치환이 끝나면 컴파일한다.</p>
<h3 id="2-테스트">2. 테스트</h3>
<h4 id="1-모든-기호-상수-치환이-끝나면-컴파일-해서-테스트">(1) 모든 기호 상수 치환이 끝나면 컴파일 해서 테스트</h4>
<p> 테스트 결과는 리팩토링 전과 같아야한다.</p>
<h4 id="2-가능하다면-기호-상숫값을-변경한-후-컴파일해서-테스트중요">(2) 가능하다면 기호 상숫값을 변경한 후 컴파일해서 테스트(중요)</h4>
<p> 기호 상수의 값을 다른 값으로 변경한 후 테스트하면 빠트린 곳이 없는지 확인할 수 있다.</p>
<h2 id="🌈-123-리팩토링-후">🌈 1.2.3 리팩토링 후</h2>
<p> <strong>기호 상수가 충분한 정보를 제공하므로 더는 주석이 필요 없다</strong></p>
<h1 id="13-한걸음-더-나아가기">1.3 한걸음 더 나아가기</h1>
<h2 id="🌈-13-1-분류-코드를-클래스로-치환하기">🌈 1.3 1 분류 코드를 클래스로 치환하기</h2>
<p> 예제에서 소개한 로봇 명령어는 이른바 <strong>분류 코드(type code)</strong>이다.
분류 코드는 타입 문제가 있다. (7장에서 소개 예정)
 <strong>Robot.COMMAND_WALK</strong> 처럼 기호 상수로 만든다고 해도 실제로는 <strong>0</strong>이라는 <strong>int</strong>값이다.
 따라서 프로그래머가 다음과 같이 매직 넘버 <strong>0</strong>을 직접 적어도 컴파일러는 아무런 경로를 출력하지 않는다.</p>
<pre><code class="language-java"> // x 매직 넘버 0을 직접 썼습니다.
 robot.order(0);</code></pre>
<p> 이러면 기호 상수를 도입했는데도 누군가가 실수할수도 있다.
 따라서 분류 코드에 정수를 쓰지 말고 새 타입을 만들어 보자.
 <strong>RobotCommand</strong> 클래스(코드 1-5)는 로봇 명령어를 나타내는 타입이다.</p>
<pre><code class="language-java"> //코드 1-5
 public class RobotCommand{
     private final String _name;
    public RobotCommand(String name) {
        _name = name;
    }
    public String toString() {
        return &quot;[ RobotCommand: &quot; + _name + &quot; ]&quot;;
    }
}</code></pre>
<p><strong>COMMAND_WALK, COMMAND_STOP, COMMAND_JUMP</strong>는 여전히 <strong>Robot</strong> 클래스에서 선언한 <strong>public static final</strong> 기호 상수지만 <strong>int</strong>가 아닌 <strong>RobotCommand</strong> 타입이 된다. (코드 1-6).</p>
<pre><code class="language-java">public class Robot {
    private final String _name;
    public static final RobotCommand COMMAND_WALK = new RobotCommand(&quot;WALK&quot;);
    public static final RobotCommand COMMAND_STOP = new RobotCommand(&quot;STOP&quot;);
    public static final RobotCommand COMMAND_JUMP = new RobotCommand(&quot;JUMP&quot;);
    public Robot (String name) {
        _name = name;
    }
    public void order(RobotCommand command) {
        if (command == COMMAND_WALK) {
            System.out.println(_name + &quot; walks.&quot;);
        } else if (command == COMMAND_STOP) {
            System.out.println(_name + &quot; walks.&quot;);
        } else if (command == COMMAND_JUMP) {
            System.out.println(_name + &quot;jumps.&quot;);
        } else {
            System.out.println(&quot;Command error. command = &quot; + command);
        }
    }
}</code></pre>
<p><strong>Main</strong> 클래스 코드는 변화가 없다.
이렇게 기호 상수를 클래스로 치환 (여기서는 <strong>RobotCommand</strong>)하면, <strong>robot.order(0)</strong>처럼 매직 넘버를 사용해서 <strong>order</strong> 메서드를 호출할수 없게 된다.
만약 매직 넘버를 사용하면 컴파일 에러가 발생한다.</p>
<pre><code class="language-bash">&gt; javac Main.java
Main.java:4: error: incompatible types: int cannot be converted to RobotCommand
    robot.order(0);
                ^
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output 1 error</code></pre>
<h2 id="🌈-132-enum">🌈 1.3.2 enum</h2>
<p>자바 5부터 enum으로 기호 상수를 표현할 수 있게 되었다.</p>
<pre><code class="language-java">public class Robot {
    private final String _name;
    //enum
    public enum Command {
        WALK,
        STOP,
        JUMP,
    };
    public Robot (String name) {
        _name = name;
    }
    public void order(RobotCommand command) {
        if (command == Command.WALK) {
            System.out.println(_name + &quot; walks.&quot;);
        } else if (command == Command.STOP) {
            System.out.println(_name + &quot; walks.&quot;);
        } else if (command == Command.JUMP) {
            System.out.println(_name + &quot;jumps.&quot;);
        } else {
            System.out.println(&quot;Command error. command = &quot; + command);
        }
    }
}</code></pre>
<pre><code class="language-java">public class Main {
    public static void main(String[] args) {
        Robot robot = new Robot(&quot;Andrew&quot;);
        robot.order(Robot.Command.WALK);
        robot.order(Robot.Command.STOP);
        robot.order(Robot.Command.JUMP);
    }
}</code></pre>
<h2 id="🌈-133-기호-상수가-적합하지-않은-경우">🌈 1.3.3 기호 상수가 적합하지 않은 경우</h2>
<p>기호 상수는 편리하지만 기호 상수를 쓰지 않는 게 좋을 때도 있다.
ex) for문에서 배열 길이를 나타낼 때 (java 배열에는 length 필드가 있기 때문)</p>
<p>잘 알려진 값에 기호 상수를 사용해도 소스 코드가 읽기 어려워진다.
ex) 배열 인덱스 최솟값을 MIN_INDEX라고 하는 경우 ( 최솟값은 0으로 정해져 있기 때문)</p>
<h2 id="🌈-144-바이트-코드에-내장된-상수에-주의하기">🌈 1.4.4 바이트 코드에 내장된 상수에 주의하기</h2>
<p>필드 값을 변경하고 다른 클래스도 리컴파일을 해줘야 새로운 값이 넘어간다</p>
<hr>
<h4 id="출처">출처</h4>
<p><a href="https://www.gilbut.co.kr/book/view?bookcode=BN001847">자바로 배우는 리팩토링 입문</a> - 길벗</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[♻️ 0장 리팩토링이란]]></title>
            <link>https://velog.io/@hey_siri/0%EC%9E%A5-%EB%A6%AC%ED%8C%A9%ED%86%A0%EB%A7%81%EC%9D%B4%EB%9E%80</link>
            <guid>https://velog.io/@hey_siri/0%EC%9E%A5-%EB%A6%AC%ED%8C%A9%ED%86%A0%EB%A7%81%EC%9D%B4%EB%9E%80</guid>
            <pubDate>Sat, 13 Aug 2022 18:37:48 GMT</pubDate>
            <description><![CDATA[<h2 id="✅-리팩토링-정의">✅ 리팩토링 정의</h2>
<blockquote>
<p><strong>♻️리팩토링</strong>(refactoring)이란  외부에서 보는 프로그램 동작은 바꾸지 않고 프로그램의 내부 구조를 개선하는 것</p>
</blockquote>
<ul>
<li>리팩토링해도 외부에서 보는 프로그램 동작은 변하지 않는다.</li>
<li>리팩토링하면 프로그램의 내부 구조가 개선된다.</li>
</ul>
<h2 id="💡-리팩토링-퀴즈">💡 리팩토링 퀴즈</h2>
<h4 id="1-버그-수정은-리팩토링-x">1. 버그 수정은 리팩토링? (X)</h4>
<h4 id="2-기능-추가는-리팩토링-x">2. 기능 추가는 리팩토링? (X)</h4>
<h4 id="3-소스-코드-정리는-리팩토링-△">3. 소스 코드 정리는 리팩토링? (△)</h4>
<pre><code>소스코드를 정리하다가 프로그램 동작에 변화가 생기면 리팩토링이 아니다.
리팩토링은 단순히 소스 코드를 정리하는 것이 아니다.
반드시 &#39;외부에서 보는 프로그램 동작에 변화가 없음&#39;을 확인해야 한다.</code></pre><h2 id="🌈-리팩토링과-유닛테스트">🌈 리팩토링과 유닛테스트</h2>
<ul>
<li>리팩토링 전에 테스트합니다.</li>
<li>리팩토링 합니다.</li>
<li>리팩토링 후에 다시 테스트 합니다.</li>
</ul>
<p>자바에서는 JUnit을 많이 사용한다.</p>
<h2 id="🌈-리팩토링의-목적">🌈 리팩토링의 목적</h2>
<h4 id="1-버그를-발견하기-쉽게-만든다">1. 버그를 발견하기 쉽게 만든다</h4>
<h4 id="2-기능을-추가하기-쉽게-만든다">2. 기능을 추가하기 쉽게 만든다</h4>
<h4 id="3-리뷰하기-쉽게-만든다">3. 리뷰하기 쉽게 만든다</h4>
<h2 id="🌈-리팩토링의-한계">🌈 리팩토링의 한계</h2>
<p>리팩토링이 불가능할 때도 있다.</p>
<h4 id="1프로그램이-아직-동작하지-않을-때">1.프로그램이 아직 동작하지 않을 때</h4>
<h4 id="2-시간이-너무-촉박할-때">2. 시간이 너무 촉박할 때</h4>
<pre><code>시간이 촉박할 때 리팩토링을 하는 것은 현명하지 않다.
납품 직전에 대규모로 리팩토링 하는 것도 피해야 한다.</code></pre><hr>
<h4 id="출처">출처</h4>
<p><a href="https://www.gilbut.co.kr/book/view?bookcode=BN001847">자바로 배우는 리팩토링 입문</a> - 길벗</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[마인크래프트 1.18.2 Forge 모드 개발을 시작하면서...]]></title>
            <link>https://velog.io/@hey_siri/%EB%A7%88%EC%9D%B8%ED%81%AC%EB%9E%98%ED%94%84%ED%8A%B8-1.18.2-Forge-%EB%AA%A8%EB%93%9C-%EA%B0%9C%EB%B0%9C%EC%9D%84-%EC%8B%9C%EC%9E%91%ED%95%98%EB%A9%B4%EC%84%9C</link>
            <guid>https://velog.io/@hey_siri/%EB%A7%88%EC%9D%B8%ED%81%AC%EB%9E%98%ED%94%84%ED%8A%B8-1.18.2-Forge-%EB%AA%A8%EB%93%9C-%EA%B0%9C%EB%B0%9C%EC%9D%84-%EC%8B%9C%EC%9E%91%ED%95%98%EB%A9%B4%EC%84%9C</guid>
            <pubDate>Wed, 06 Jul 2022 12:47:07 GMT</pubDate>
            <description><![CDATA[<p>모드 개발을 하려고 하니 한글로 된 자료가 거의 없었다.
영어 공부도 할겸 영어 자료를 찾다가 좋은 유튜브 자료를 발견했다.</p>
<p><a href="https://youtube.com/playlist?list=PLKGarocXCE1Hut51TKKqZKqVZtKLZC48x">Minecraft 1.18.1 Forge Modding Tutorials</a></p>
<p>이 유튜브 플레이 리스트는 70개의 영상으로 이루어져있는데
앞으로 차근차근 들으면서 이곳에 한글로 정리해 올릴 예정이다.</p>
<p>영어도 공부하고 자바도 공부하고 게임도 하는 1석3조 프로젝트가 되었다!
🪨🦜🦜🦜</p>
<p><img src="https://c.tenor.com/PK_ln6GnJksAAAAC/jonah-hill-yay.gif" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[ [백준] 5430 AC (Python)]]></title>
            <link>https://velog.io/@hey_siri/%EB%B0%B1%EC%A4%80-5430-AC-Python</link>
            <guid>https://velog.io/@hey_siri/%EB%B0%B1%EC%A4%80-5430-AC-Python</guid>
            <pubDate>Tue, 17 May 2022 11:22:45 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/hey_siri/post/e212a9c1-49d5-4910-8588-5e596164396c/image.png" alt=""></p>
<h2 id="gold-v-ac---5430">[Gold V] AC - 5430</h2>
<hr>
<blockquote>
<p><strong>[골드 5] AC - 5430</strong>
문제 링크: <a href="https://www.acmicpc.net/problem/5430">https://www.acmicpc.net/problem/5430</a></p>
</blockquote>
<h3 id="예제-입력-1">예제 입력 1)</h3>
<hr>
<pre><code class="language-python">4
RDD
4
[1,2,3,4]
DD
1
[42]
RRD
6
[1,1,2,3,5,8]
D
0
[]</code></pre>
<h3 id="예제-출력-1">예제 출력 1)</h3>
<hr>
<pre><code class="language-python">[2,1]
error
[1,2,3,5,8]
error</code></pre>
<h2 id="전체-코드">전체 코드</h2>
<hr>
<blockquote>
<h3 id="1-가장-짧은-코드">1) 가장 짧은 코드</h3>
</blockquote>
<hr>
<pre><code class="language-python">from collections import deque
for _ in range(int(input())):
    c=input()
    n=int(input())
    q=deque(eval(input()))
    try:
        step=1
        for p in c:
            if p==&quot;R&quot;:
                step*=-1
            else:
                q.popleft() if step==1 else q.pop()
        print(str(list(q)[::step]).replace(&quot; &quot;,&quot;&quot;))
    except:
        print(&#39;error&#39;)</code></pre>
<p>이 코드는 빈 배열을 입력 받을 때에 대한 예외가 없어도 돼서 편하다.</p>
<ul>
<li><p><code>eval()</code> 함수를 활용해서 빈 배열(<code>[]</code>)에 대한 예외처리를 하지 않아도 된다.</p>
</li>
<li><p>빈 <code>deque</code>에서 <code>pop</code>을 하려고 하면 어차피 오류가 나기 때문에 <code>try-except</code> 문을 사용했다.</p>
</li>
<li><p><strong>슬라이싱</strong> (<code>[start : end : step]</code>) 을 활용해서
<code>li[::-1]</code>이런 식으로 리스트를 거꾸로 출력할 수 있다.
<code>li[::1]</code>은 그냥 <code>li</code>와 같다.
따라서 <code>R</code>이 나올 때 마다 <strong>1, -1, 1, -1, 1, -1...</strong> 이런 식으로 값을 바꿔주면 된다.
<code>step</code>을 처음에는 <code>1</code>로 설정하고, <code>R</code>이 나올 때 마다 <code>step</code>에 <code>-1</code>을 곱해준다.
이렇게 하면 마지막 출력 시에 <code>list(q)[::step]</code> 형태로 활용할 수 있다.</p>
</li>
</ul>
<blockquote>
<h3 id="2-가장-빠른-코드-204-ms">2) 가장 빠른 코드 (204 ms)</h3>
</blockquote>
<hr>
<pre><code class="language-python">from collections import deque
for _ in range(int(input())):
    commands=input()
    n=int(input())
    arr=input()
    if n&lt;commands.count(&#39;D&#39;):
        print(&#39;error&#39;)
    elif n==0:
        print(&#39;[]&#39;)
    else:
        queue=deque(arr[1:-1].split(&#39;,&#39;))
        isReversed=False
        for cmd in commands:
            if cmd==&quot;R&quot;:
                isReversed^=True
            else:
                queue.pop() if isReversed else queue.popleft()
        print(&#39;[&#39; + &#39;,&#39;.join(reversed(queue)if isReversed else queue) +&#39;]&#39;)</code></pre>
<ul>
<li><p><code>eval()</code>을 쓰지 않고 <code>split()</code>을 활용했다.
따라서 <code>n</code>이 <code>0</code>일때 예외처리를 해줬다.</p>
</li>
<li><p><code>n</code>이 <code>D</code>의 개수보다 작으면 <strong>&#39;error&#39;</strong>를 출력한다.</p>
</li>
<li><p><code>step</code> 대신 <code>isReversed</code>라는 <code>bool</code>타입 변수를 사용했다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[백준] 2606 바이러스 (Python)]]></title>
            <link>https://velog.io/@hey_siri/%EB%B0%B1%EC%A4%80-2606-%EB%B0%94%EC%9D%B4%EB%9F%AC%EC%8A%A4-Python</link>
            <guid>https://velog.io/@hey_siri/%EB%B0%B1%EC%A4%80-2606-%EB%B0%94%EC%9D%B4%EB%9F%AC%EC%8A%A4-Python</guid>
            <pubDate>Fri, 13 May 2022 12:20:48 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/hey_siri/post/5046e5d9-43e5-4490-91a7-69e371dc37ca/image.png" alt=""></p>
<blockquote>
<p><strong>[실버3]</strong>
<strong>문제 링크 : <a href="https://www.acmicpc.net/problem/2606">https://www.acmicpc.net/problem/2606</a></strong></p>
</blockquote>
<h3 id="예제-입력-1">예제 입력 1</h3>
<hr>
<pre><code>7
6
1 2
2 3
1 5
5 2
5 6
4 7
</code></pre><h3 id="예제-출력-1">예제 출력 1</h3>
<hr>
<pre><code>4</code></pre><h3 id="전체-코드">전체 코드</h3>
<hr>
<pre><code class="language-python">def dfs(v=1): #시작 기본값 1번 컴퓨터
    visited[v]=True
    for i in graph[v]:
        if not visited[i]:
            dfs(i)

n=int(input())

graph=[[] for _ in range(n+1)]
visited=[False]*(n+1)

for _ in range(int(input())):
    x,y=map(int,input().split())
    graph[x].append(y)
    graph[y].append(x)
dfs()
print(sum(visited)-1)</code></pre>
<h3 id="설명">설명</h3>
<hr>
<p>기본 <code>DFS</code> 알고리즘을 그대로 구현하고
마지막에 방문개수 -1만 해주면 되는 간단한 문제이다.</p>
<p><code>방문한 노드의 수</code> <code>-1</code> = <code>감염된 컴퓨터의 수</code> <code>-1</code> = <code>1번이 감염시킨 컴퓨터의 수</code></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[왜 음의 간선이 있을 때 다익스트라 알고리즘을 사용하지 못하는가]]></title>
            <link>https://velog.io/@hey_siri/%EB%8B%A4%EC%9D%B5%EC%8A%A4%ED%8A%B8%EB%9D%BC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%9D%8C%EC%9D%98-%EA%B0%84%EC%84%A0%EC%9D%BC-%EB%95%8C-%EC%95%88%EB%90%98%EB%8A%94-%EC%9D%B4%EC%9C%A0</link>
            <guid>https://velog.io/@hey_siri/%EB%8B%A4%EC%9D%B5%EC%8A%A4%ED%8A%B8%EB%9D%BC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%9D%8C%EC%9D%98-%EA%B0%84%EC%84%A0%EC%9D%BC-%EB%95%8C-%EC%95%88%EB%90%98%EB%8A%94-%EC%9D%B4%EC%9C%A0</guid>
            <pubDate>Fri, 13 May 2022 12:04:05 GMT</pubDate>
            <description><![CDATA[<h3 id="서론">서론</h3>
<hr>
<p>다익스트라 알고리즘에서 음의 간선이 안되는 이유가 궁금해졌다.
안된다고 하는것은 당연히 똑똑한 사람들이 이미 증명한 결과라 안되는것은 맞지만
보다 보면 왠지 될것같기도 하다.
음의 간선일 때 다익스트라 알고리즘을 사용할 수 있는 경우를 들어봐도 글이라서 쉽게 와닿지 않았다.</p>
<p>역시 백문이 불여일견인 것 같다.</p>
<h3 id="1-음의-간선이-안되는-경우">1. 음의 간선이 안되는 경우</h3>
<hr>
<img src=https://velog.velcdn.com/images/hey_siri/post/f53cb309-3957-4e33-8f12-7f0ad6ac7037/image.png>

<p>다음과 같은 경우에 다익스트라 알고리즘은 A-&gt;B-&gt;D 총 비용 22가 가장 최소 경로라고 생각 할 것이다.
하지만 A-&gt;B-&gt;C-&gt;D가 총-90 으로 값이 더 작다.</p>
<blockquote>
<p>그러면 모든 간선에 200을 더해줘서 음수를 없애면 되지 않을까?</p>
</blockquote>
<h3 id="2-어떤-값을-더해서-다-양수로-만들어도-안되는-경우">2. 어떤 값을 더해서 다 양수로 만들어도 안되는 경우</h3>
<hr>
<img src=https://velog.velcdn.com/images/hey_siri/post/eded41e2-3f68-4ca3-b324-ca1ecdf0ab2d/image.png>

<p>안된다.
위의 그림에서 모든 간선에 200을 더해서 음수를 없앴지만
A-&gt;B-&gt;D가 가장 비용이 작은 경로가 되어버린다.</p>
<h3 id="번외">번외</h3>
<hr>
<p>그래프 그려주는 사이트 : <a href="https://csacademy.com/app/graph_editor/">https://csacademy.com/app/graph_editor/</a></p>
]]></description>
        </item>
    </channel>
</rss>