<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>cautious-taco.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Fri, 26 May 2023 10:20:56 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>cautious-taco.log</title>
            <url>https://images.velog.io/images/cautious_taco/profile/e1a7272f-078e-4df2-9c64-7aed80d06f2d/social.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. cautious-taco.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/cautious_taco" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Two Pointer]]></title>
            <link>https://velog.io/@cautious_taco/Two-Pointer</link>
            <guid>https://velog.io/@cautious_taco/Two-Pointer</guid>
            <pubDate>Fri, 26 May 2023 10:20:56 GMT</pubDate>
            <description><![CDATA[<h3 id="two-pointer-테크닉이란">two pointer 테크닉이란,</h3>
<p>다수의 값들 중 특별한 기준을 맞춘 두 개의 지점 혹은 값을 찾을 때 2개의 지점을 이용하는 것을 말한다.</p>
<p>예를들어, 아래와 같은 문제가 있다고 하자.</p>
<ul>
<li>[4, 1, 9, 7, 5, 3, 16] 의 숫자가 있을 때 그 합이 13이 되는 2개의 숫자가 있는지 없는지 구별하시오. 단, 두 개의 동일한 숫자를 사용할 수 없다.</li>
</ul>
<p>이 때, two pointer 테크닉을 이용하자면 다음과 같이 풀 수 있다.</p>
<ul>
<li>먼저 리스트를 오름차순으로 정렬한다.</li>
<li>맨 왼쪽 숫자를 가리키는 Left pointer를 생각하자.</li>
<li>맨 오른쪽 숫자를 가리키는 Right pointer를 생각하자.</li>
<li>L, R pointer가 가리키는 숫자의 합을 생각하자.<ul>
<li>만약 합이 목표로 하는 값과 같다면, 그러한 숫자가 있다는 결론 [끝]</li>
<li>만약 합이 목표로 하는 값보다 작다면, Left pointer를 오른쪽으로 한 칸 옮긴다.</li>
<li>만약 함이 목표로 하는 값보다 크다면, Right pointer를 왼쪽으로 한 칸 옮긴다.</li>
</ul>
</li>
<li>새로운 L, R Pointer 를 대상으로 위의 과정을 반복</li>
<li>만약 두 포인터가 같은 곳을 가리키게 된다면, 그러한 숫자가 없다는 결론 [끝]</li>
</ul>
<p>그럼 two pointer 테크닉을 적용하면 다음과 같이 풀 수 있다.</p>
<ul>
<li><p>정렬</p>
<ul>
<li>[1, 3, 4, 5, 7, 9, 16]</li>
</ul>
</li>
<li><p>Left pointer → 1, Right pointer → 16, 합이 17</p>
</li>
<li><p>17은 13보다 크므로, Right pointer를 왼쪽으로 옮긴다.</p>
</li>
<li><p>Left pointer → 1, Right pointer → 9, 합이 10</p>
</li>
<li><p>10은 13보다 작으므로, Left pointer를 오른쪽으로 옮긴다.</p>
</li>
<li><p>Left pointer → 3, Right pointer → 9, 합이 12</p>
</li>
<li><p>12는 13보다 작으므로, Left pointer를 오른쪽으로 옮긴다.</p>
</li>
<li><p>Left pointer → 4, Right pointer → 9, 합이 13</p>
</li>
<li><p>목표로 하는 값이 나왔으므로, 그 합이 13이 되는 2개의 숫자가 존재한다.</p>
</li>
</ul>
<h3 id="나는-여기서-의문을-가지지-않을-수-없었다">나는 여기서 의문을 가지지 않을 수 없었다.</h3>
<p>지금이야 그 2개의 값이 나왔으니 다행이지만, 나오지 않은 경우는 어찌할 것인가?
two pointer는 모든 조합을 조사하지는 않는 것 같은데, 그럼에도 불구하고 2개의 값이 나오지 않은 경우를 신뢰할 수 있는가? 다른 말로, two pointer 테크닉을 증명할 수 있나?
이 부분이 내가 정말 고민하던 부분이었다. 반례를 구하려고도 했었다.(two pointer 테크닉이 2개의 숫자를 찾을 수 없다고 말하지만, 실제로는 그런 조합이 존재하는 경우)
하지만 처참히 실패했다.
다행하게도, 다음 글을 통해 그 힌트를 발견할 수 있었다.</p>
<ul>
<li><a href="https://m.blog.naver.com/kks227/220795165570">https://m.blog.naver.com/kks227/220795165570</a></li>
<li><a href="https://code-lab1.tistory.com/276">https://code-lab1.tistory.com/276</a></li>
</ul>
<p>여기서 사용된 방법은 해당 테크닉이 해가 있음에도 없다고 말하는 경우가 없다는 것을 증명한 것이다.
동일한 방법으로 위의 two pointer 테크닉을 다음의 2가지로 증명할 수 있다.</p>
<ul>
<li><p>Left가 Left 답에 도착하기 전에 Right가 Right 답 왼쪽으로 이동하는 경우가 없다는 것을 증명하면 된다.
<img src="https://velog.velcdn.com/images/cautious_taco/post/e5b654d6-138f-4ddd-9647-38a89d3fb441/image.jpg" alt=""></p>
</li>
<li><p>Right가 Right 답에 도착하기 전에 Left가 Left 답 오른쪽으로 이동하는 경우가 없다는 것을 증명하면 된다.
<img src="https://velog.velcdn.com/images/cautious_taco/post/4cf81cf0-6cf8-4636-a5e6-4d8dd429a757/image.jpg" alt=""></p>
</li>
<li><p>첫번째 경우 증명
<img src="https://velog.velcdn.com/images/cautious_taco/post/8c281ad8-d65f-4467-b5b6-79c98ee4a780/image.jpg" alt=""></p>
<ul>
<li>Right pointer가 답을 지나려면 답 위치에 와야만 한다.</li>
<li>이 때, Left pointer와 Right pointer가 가리키는 숫자의 합은 답 pointer가 가리키는 숫자의 합보다 언제나 작다. 왜냐하면 Left pointer가 답의 왼쪽에 있기 때문이다.</li>
<li>그렇다면, Right가 아닌 Left pointer가 움직여야 한다. 여기서 Right pointer가 움직일 수 없다.</li>
<li>다른말로 하자면, Right pointer가 답 위치에 있다면 움직일 수 있는 것은 Left pointer일 뿐이므로 첫번째 경우와 같은 일이 일어날 수 없다.</li>
</ul>
</li>
<li><p>두번째 경우 증명
<img src="https://velog.velcdn.com/images/cautious_taco/post/f9c409f4-5a46-4f56-a389-fc697b7ea477/image.jpg" alt=""></p>
<ul>
<li>이것도 마찬가지이다.</li>
<li>Left pointer가 답 위치에 있는 경우라면 Right pointer 밖에 움직일 수 없다.</li>
<li>왜냐하면 두 포인터가 가리키는 숫자의 합이 답 포인터가 가리키는 숫자의 합보다 무조건 크기 때문이다.</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[maven compiler source and target]]></title>
            <link>https://velog.io/@cautious_taco/maven-compiler-source-and-target</link>
            <guid>https://velog.io/@cautious_taco/maven-compiler-source-and-target</guid>
            <pubDate>Sat, 02 Apr 2022 02:42:15 GMT</pubDate>
            <description><![CDATA[<p>pom.xml 파일 안을 보면 다음과 같은 부분이 있다.</p>
<pre><code>&lt;properties&gt;
    &lt;maven.compiler.source&gt;7&lt;/maven.compiler.source&gt;
    &lt;maven.compiler.target&gt;11&lt;/maven.compiler.target&gt;
&lt;/properties&gt;</code></pre><p>이 부분은 무엇을 위한 옵션일까?</p>
<blockquote>
</blockquote>
<p>maven.compiler.source: 소스파일의 Java 버전(문법)
maven.compiler.target: 컴파일 된 바이트 코드가 실행될 JVM 버전</p>
<p>compoiler source를 위한 간단한 실험을 한 번 해보자.</p>
<p><strong>실험1</strong>
다음과 같이 pom.xml에서 source를 8로 맞추어 주었다.
<img src="https://media.vlpt.us/images/cautious_taco/post/cc9aeea9-8601-4733-b1fb-6564e3a4d467/image.png" alt=""></p>
<p>소스파일에서는 Java 8에서부터 도입된 stream과 lambda를 사용하고 있다.
<img src="https://media.vlpt.us/images/cautious_taco/post/05650bfd-91dd-4dfa-9e5d-dfa4063f45d8/image.png" alt=""></p>
<p>이 상태에서 실행을 하거나 컴파일을 하게 되면 문제 없다.</p>
<p><strong>실험2</strong>
다음과 같이 pom.xml에서 source를 7로 낮추었다.
<img src="https://media.vlpt.us/images/cautious_taco/post/8c75bfc9-ba7a-4a9d-a1ab-2ce49e6e6765/image.png" alt=""></p>
<p>소스파일로 가보면 IDE에서 다음과 같이 오류를 보여준다.
<img src="https://media.vlpt.us/images/cautious_taco/post/3472bf0e-3774-44f0-a58a-5f4bd99ead1e/image.png" alt=""></p>
<p>이 상태에서 컴파일은 불가하게 된다.</p>
<p><strong>결론</strong>
즉, maven.compiler.source는 컴파일러에게 &quot;나는 소스 파일을 이 버전으로 작성할거야&quot; 라고 알려주는 역할을 하며, compiler는 당연하게도 소스 파일을 해당 버전에서 기대되는 문법과 기능으로 해석하려 할 것이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[마이크로서비스와 Node.js]]></title>
            <link>https://velog.io/@cautious_taco/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4%EC%99%80-Node.js</link>
            <guid>https://velog.io/@cautious_taco/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4%EC%99%80-Node.js</guid>
            <pubDate>Sat, 26 Mar 2022 05:21:27 GMT</pubDate>
            <description><![CDATA[<p>책의 내용 중 마이크로서비스와 Node.js의 시너지에 대해 설명하는 부분이 있어 정리한다.</p>
<ol>
<li>대부분의 서비스는 정보를 저장하고 조회하는 데 데이터베이스, 파일 등과의 I/O가 필수적이다.</li>
<li>I/O가 동기 방식이라면 응답이 올 때까지 다음 요청을 처리하지 못하기 때문에 성능이 좋지 않다.</li>
<li>보통 이러한 문제는 메시지-큐를 이용해 해결한다.</li>
<li>I/O를 실제로 처리하는 서버를 별도로 두고, 요청을 받은 서버는 큐로 데이터를 전송한 후 이 요청을 처리하고, I/O가 처리되면 클라이언트에 보내는 방식을 사용한다.</li>
<li>위 4번의 메커니즘을 마이크로서비스로 구현해야 한다면, 개발량도 많고 코드 구조도 복잡해진다.</li>
<li>Node.js는 내부적으로 이러한 메커니즘을 모두 처리해 주기 때문에 개발자가 별도로 고민하지 않아도 된다.</li>
<li>이 외에도 Node.js는 싱글 스레드를 기반으로 코딩하기 때문에 스레드 동기화와 교착 상태등을 고려할 필요가 없다.</li>
</ol>
<p>즉, Node.js는 이벤트 큐가 내부적으로 존재하기 때문에 I/O를 처리하는 데 있어 어려움이 없기 때문에 코드를 작고 가볍게 유지할 수 있어 마이크로서비스에 적합하다는 것이 책의 설명이었다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA["Node.js 마이크로서비스 코딩 공작소"를 읽기 시작하다.]]></title>
            <link>https://velog.io/@cautious_taco/Node.js-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%BD%94%EB%94%A9-%EA%B3%B5%EC%9E%91%EC%86%8C-%EC%B1%85%EC%9D%84-%EC%9D%BD%EA%B8%B0-%EC%8B%9C%EC%9E%91%ED%95%98%EB%8B%A4</link>
            <guid>https://velog.io/@cautious_taco/Node.js-%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EC%BD%94%EB%94%A9-%EA%B3%B5%EC%9E%91%EC%86%8C-%EC%B1%85%EC%9D%84-%EC%9D%BD%EA%B8%B0-%EC%8B%9C%EC%9E%91%ED%95%98%EB%8B%A4</guid>
            <pubDate>Sat, 26 Mar 2022 05:02:22 GMT</pubDate>
            <description><![CDATA[<p>평소 MSA에 관심이 많았다.</p>
<p>그러다 발견한 &quot;Node.js 마이크로서비스 코딩 공작소&quot;(저자 정대천님).
노드로 MSA를 설명한 책이나 강좌를 찾기 어려웠는데, 이렇게 책이 있다니 정말 감사할 따름이다.
오늘부터 바로 시작이다! 😊</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[블로그를 시작하다]]></title>
            <link>https://velog.io/@cautious_taco/%EB%B8%94%EB%A1%9C%EA%B7%B8%EB%A5%BC-%EC%8B%9C%EC%9E%91%ED%95%98%EB%8B%A4</link>
            <guid>https://velog.io/@cautious_taco/%EB%B8%94%EB%A1%9C%EA%B7%B8%EB%A5%BC-%EC%8B%9C%EC%9E%91%ED%95%98%EB%8B%A4</guid>
            <pubDate>Sat, 26 Mar 2022 02:49:06 GMT</pubDate>
            <description><![CDATA[<p>개발자 지망생으로서, 더욱 성장하기 위해 블로그를 시작하게 되었다.
지금으로서는 의욕이 앞선 상태인데, 꾸준히 블로그를 올릴 수 있을런지...?</p>
]]></description>
        </item>
    </channel>
</rss>