<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Just Coding</title>
        <link>https://velog.io/</link>
        <description>도전하자</description>
        <lastBuildDate>Wed, 21 Jun 2023 06:49:59 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Just Coding</title>
            <url>https://velog.velcdn.com/images/just_coding/profile/40a64e39-7811-4684-a522-cb4de1eb0fcb/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. Just Coding. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/just_coding" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[오브젝트 #1]-객체, 설계]]></title>
            <link>https://velog.io/@just_coding/%EC%98%A4%EB%B8%8C%EC%A0%9D%ED%8A%B8-1-%EA%B0%9D%EC%B2%B4-%EC%84%A4%EA%B3%84</link>
            <guid>https://velog.io/@just_coding/%EC%98%A4%EB%B8%8C%EC%A0%9D%ED%8A%B8-1-%EA%B0%9D%EC%B2%B4-%EC%84%A4%EA%B3%84</guid>
            <pubDate>Wed, 21 Jun 2023 06:49:59 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/just_coding/post/52bef776-132d-4949-9c61-1d4b59466fd2/image.png" alt=""></p>
<h2 id="오브젝트-조영호-책을-보면서-공부하면서-정리한-글입니다"><a href="https://www.yes24.com/Product/Goods/74219491">오브젝트-조영호</a> 책을 보면서 공부하면서 정리한 글입니다.</h2>
<hr>
<h2 id="소프트웨어-모듈의-세-가지-목적">소프트웨어 모듈의 세 가지 목적</h2>
<ol>
<li>실행 중에 제대로 동작하는 것</li>
<li>변경을 위해 존재하는 것</li>
<li>코드를 읽는 사람과 의사소통하는 것</li>
</ol>
<h2 id="설계의-목표">설계의 목표</h2>
<ul>
<li>객체 사이의 결합도를 낮춰 변경이 용이한 설계를 만드는 것이어야 한다.<ul>
<li>목표를 이루기 위해서는?<ol>
<li><a href="#%EC%BA%A1%EC%8A%90%ED%99%94">캡슐화</a>를 이용해 의존성을 적절히 관리함으로써 객체 사이의 결합도를 낮추는 것</li>
<li>자율성을 높인다 -&gt; 자신의 문제를 스스로 해결하도록 코드를 변경</li>
<li>기본적인 원칙을 따라야한다.<ul>
<li><a href="#%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4">인터페이스(Interface)</a>와 <a href="#%EA%B5%AC%ED%98%84">구현(Implementation)</a>으로 나누고 인터페이스는 공개하고 구현은 공개하지 않는 것이 객체 사이의 결합도를 낮추고 변경하기 쉬운 코드를 작성하기 위해 따라야하는 기본적인 설계원칙이다.</li>
</ul>
</li>
</ol>
</li>
</ul>
</li>
</ul>
<h2 id="응집도-높게-낮게">응집도 높게? 낮게?</h2>
<ul>
<li>응집도를 높게 해야한다.<ul>
<li>밀접하게 연관된 작업만을 수행하고 연관성 없는 작업은 다른 객체에게 위임하는 객체를 가리켜 응집도가 높다고 말한다.</li>
<li>결합도를 낮추면 응집도가 높아짐</li>
<li>자신의 데이터를 책임져야 응집도가 높아짐</li>
</ul>
</li>
</ul>
<h2 id="절차지향과-객체지향">절차지향과 객체지향</h2>
<ul>
<li>절차적 프로그래밍 : 프로세스와 데이터를 별도의 모듈에 위치시키는 방식</li>
<li>객체지향 프로그래밍 : 프로세스와 데이터가 동일한 모듈 내부에 위치하도록 프로그래밍하는 방식 (자신의 문제를 스스로 처리한다(자율성))<ul>
<li>훌륭한 객체지향 설계의 핵심 : 캡슐화를 이용해 의존성을 적절히 관리함으로써 객체 사이의 결합도를 낮추는 것</li>
</ul>
</li>
</ul>
<h2 id="설계를-어렵게-하는-것">설계를 어렵게 하는 것</h2>
<ul>
<li>설계를 어렵게 하는것은 <strong>의존성</strong>이다.</li>
<li>해결방법<ol>
<li>불필요한 의존성을 제거함으로써 객체 상의 결합도를 낮추는 것</li>
<li>세부사항을 객체 내부로 감춰 캡슐화를 하는 것</li>
</ol>
</li>
</ul>
<h2 id="결론">결론</h2>
<ul>
<li>불필요한 세부사항을 객체 내부로 <strong>캡슐화</strong>하고, 객체의 <strong>자율성</strong>을 높이고 <strong>응집도 높은 객체</strong>들의 공통체를 창조하여 <strong>낮은 결합도</strong>와 <strong>높은 응집도</strong>를 가지고 협력하도록 최소한의 의존성만을 남기는 것을 훌륭한 객체지향 설계라 할 수 있다.</li>
</ul>
<hr>
<h3 id="캡슐화">*캡슐화</h3>
<ul>
<li>개념적이나 물리적으로 객체 내부의 세부적인 사항을 감추는 것</li>
<li>목적은 변경하기 쉬운 객체를 만드는 것</li>
</ul>
<h3 id="인터페이스">*인터페이스</h3>
<ul>
<li>클라이언트 프로그램에 어떤 매ㅔ서드를 제공하는지 알려주는 명세 또는 약속이다.</li>
<li>추상 메서드의 집합(추상메서드만 가지고 있음. 다른 그 외에는 아무것도 가지고 있지 않음)</li>
<li>상속, 구현</li>
<li><a href="https://unit-15.tistory.com/46">참고</a></li>
</ul>
<h3 id="구현">*구현</h3>
<ul>
<li>계획, 아이디어, 모델, 설꼐, 사양, 표준, 알고리즘 또는 정책의 적용 또는 실행을 실현하는 것</li>
<li><a href="https://academic-accelerator.com/encyclopedia/kr/implementation">참고</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DB] 인덱스(Index) & 복합인덱스]]></title>
            <link>https://velog.io/@just_coding/DB-%EC%9D%B8%EB%8D%B1%EC%8A%A4Index</link>
            <guid>https://velog.io/@just_coding/DB-%EC%9D%B8%EB%8D%B1%EC%8A%A4Index</guid>
            <pubDate>Fri, 14 Apr 2023 06:29:34 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>DB를 설계할 때 인덱스를 설정해야하는 상황이 있었습니다. 
그래서 저는 2개의 컬럼을 각자 인덱스(Index)를 시켰습니다. 하지만, 2개의 조건을 같이 검색을 할 때 각자 인덱스(Index)를 지정해주는 것보다 결합인덱스로 지정해주는것이 더 효과적이라는 것을 알게 되어 단일인덱스를 복합인덱스로 바꾸어 설계하였습니다.</p>
</blockquote>
<p>우선, 복합인덱스에 대해 들어가기전에 인덱스(Index)에 대해 개념을 알아보겠습니다.</p>
<h2 id="1-인덱스index란">1. 인덱스(Index)란?</h2>
<p><strong>인덱스(Index)</strong>는 <span style="color: red">테이블에 대한 검색 속도를 향상시켜주는 자료구조</span> 입니다.</p>
<p>예시로 책에 있는 <strong>목차</strong>나 <strong>색인</strong>이라고 생각하시면 됩니다. 만약 책에서 원하는 내용을 찾고자 한다면, 책의 모든 페이지를 찾는 것은 시간이 오래걸립니다. 이처럼 <strong>인덱스(Index)는</strong> 원하는 내용을 빨리 찾을 수 있게해주는 자료구조입니다.</p>
<p><img src="https://velog.velcdn.com/images/just_coding/post/08c918f1-eacb-4d45-bf83-57f0403e78a5/image.png" alt=""></p>
<p align="center"> 출처: https://mangkyu.tistory.com/96 </p>

<h2 id="2-인덱스index-장단점">2. 인덱스(Index) 장/단점</h2>
<ul>
<li><p>장점</p>
<ul>
<li>테이블을 조회하는 속도와 그에 따른 성능을 향상시킬 수 있다.</li>
<li>전반적인 시스템의 부하를 줄일 수 있다.</li>
</ul>
</li>
<li><p>단점</p>
<ul>
<li>인덱스(Index)를 관리하기 위해 DB의 약 <strong>10%</strong>에 해당하는 저장공간이 필요하다.</li>
<li>인덱스를 관리하기 위해 추가 작업이 필요하다.</li>
<li>인덱스를 잘못 사용할 경우 오히려 성능이 저하되는 역효과가 발생할 수 있다.</li>
</ul>
</li>
</ul>
<p>만약 <strong>CREATE, DELETE, UPDATE</strong>가 자주 일어나는 컬럼에 인덱스를 걸게되면 오히려 성능이 저하됩니다.
위와 같은 <strong>CREATE, DELETE, UPDATE</strong>는 기존의 인덱스를 삭제하지 않고 <strong>사용하지 않음</strong>으로 남겨두기 때문에 작업을 할 때 실제 데이터에 비해 인덱스(Index)가 과도하게 커지는 문제점이 발생할 수 있습니다.</p>
<h2 id="3-인덱스index를-사용하면-좋은-경우">3. 인덱스(Index)를 사용하면 좋은 경우</h2>
<ul>
<li>규모가 큰 테이블</li>
<li>INSERT, UPDATE, DELETE 작업이 자주 발생하지 않는 컬럼</li>
<li>WHERE, ORDER BY, JOIN 등 자주 사용되는 컬럼</li>
<li>데이터 중복도가 낮은 컬럼</li>
</ul>
<h2 id="4-인덱스index의-자료구조">4. 인덱스(Index)의 자료구조</h2>
<h3 id="1-hash-table">1. Hash Table</h3>
<p>해시 테이블은 (Key, Value)의 구조로 데이터를 저장하는 자료구조입니다. 시간 복잡도가 <em>O(1)</em>로 매우 빠른 데이터를 탐색 할 수 있습니다.</p>
<p>탐색은 빠르지만 실제로 인덱스로 잘 사용되지는 않습니다. 그 이유는 해시 테이블은 <strong>1이라도 달라지면 완전히 다른 해시 값</strong>을 생성합니다. 다른 말로는 <strong>등호(=) 연산에 최적화</strong> 되어있습니다. 하지만 <strong>DB 탐색할 때 범위 탐색(부등호(&lt;,&gt;)를 사용하는 탐색)</strong>을 자주 사용하기 때문에 정렬되어 있지 않은 해시테이블은 잘 맞지 않습니다. </p>
<h3 id="2-btree">2. B+Tree</h3>
<p>B+Tree는 DB의 인덱스(Index)를 위해 <strong>자식 노드가 2개 이상인 B-Tree를 개선시킨 자료구조</strong>입니다.</p>
<blockquote>
<p><strong>B+Tree 특징</strong>
    - 리프노드(데이터노드)만 인덱스(Index)와 함께 데이터를 가지고 있고, 나머지 노드(인덱스노드)들은 데이터를 위한 인덱스 key만을 가지고 있습니다.
    - 리프노드들은 <strong>LinkedList</strong>로 연결되어 있습니다.
    - 데이터노드 크기는 인덱스노드의 크기와 같지 않아도 됩니다.</p>
</blockquote>
<p>위에서 말했듯이 DB 탐색할 때 부등호를 이용한 순차 검색이 자주 발생합니다. 이에 맞게 BTree의 리프노드들을 LinkedList로 연결시키므로써 보완하여 B+Tree를 만들어 인덱스에 맞게 최적화되었습니다.</p>
<ul>
<li>B+Tree는 무조건 리프노드까지 탐색해야한다는 단점이 있고, O(log2n)의 시간복잡도를 갖습니다.</li>
</ul>
<hr>
<p>지금까지 인덱스(Index)에 대해서 알아봤습니다. 이제 본 문제였던 결합인덱스에 대해서 알아보겠습니다.</p>
<h2 id="1-복합-인덱스란">1. 복합 인덱스란?</h2>
<p><span style="color: red">2개 이상의 컬럼을 합쳐서 인덱스를 만드는 것입니다.</span> 하나의 컬럼으로보다 여러개의 컬럼을 합쳤을 때 효율이 좋은 경우 사용하며, <strong>WHERE절에서 OR조건이 아니라 AND 조건일 때</strong> 사용하는 것이 좋습니다. </p>
<h2 id="2-복합-인덱스-컬럼-선택">2. 복합 인덱스 컬럼 선택</h2>
<ol>
<li>WHERE절에서 AND 조건으로 결합되어 사용되면서 각각 사용할 때보다 여러개 사용했을 때 더 효율적인 컬럼들</li>
<li>JOIN의 연결고리로 자주 사용되는 컬럼</li>
<li>ORDER BY에 자주 사용되는 컬럼</li>
<li>단일 키 컬럼 조건이 아닌 한개 이상 키 컬럼조건으로 자주 조회되는 컬럼</li>
</ol>
<h2 id="3-복합-인덱스의-컬럼-순서-결정">3. 복합 인덱스의 컬럼 순서 결정</h2>
<p>결합 인덱스에서 순서가 중요합니다. 순서에 따라 성능이 좋아질수도 오히려 나빠질 수도 있습니다. 비슷하게 저도 결합 인덱스를 설정했는데 인덱스가 안되는 경우가 있었습니다.</p>
<p>예를 들어, 결합 인덱스로 (A,B,C)를 걸었을 때 순차적으로 A 필터링, B 필터링, C 필터링을 받아야 좋은 결합인덱스라 할 수 있는데 저는 A를 무시한체 B와 C에 대해서만 검색을 했었습니다. 이럴 때 인덱스가 적용되지 않았습니다. <strong>결합인덱스가 적용되려면 설정했던 선행 컬럼부터 사용해야합니다.</strong></p>
<p>그래서 결합 인덱스를 설정할 때 순서가 중요한다는 것을 알게되었습니다. 그래서 아래와 같은 고려하여 우선순위를 설정하셔야합니다.</p>
<blockquote>
</blockquote>
<ol>
<li>WHERE절 조건에 많이 사용되는 컬럼</li>
<li>&quot;=&quot;로 사용되는 컬럼</li>
<li>분포도가 좋은 컬럼</li>
<li>자주 이용되는 순서</li>
</ol>
<h2 id="인덱스index-생성-방법">*인덱스(Index) 생성 방법</h2>
<pre><code class="language-css">단일 인덱스 생성방법:
create index &quot;인덱스명&quot; on &quot;테이블명&quot;(컬럼)

복합 인덱스 생성방법:
create index &quot;인덱스명&quot; on &quot;테이블명&quot;(컬럼1, 컬럼2, 컬럼3,...)</code></pre>
<p>위와 같이 복합 인덱스를 생성하려면 단일 인덱스 생성방법에서 컬럼만 추가해주시면 됩니다.</p>
<h2 id="참고">참고</h2>
<blockquote>
</blockquote>
<p><a href="https://mangkyu.tistory.com/96">https://mangkyu.tistory.com/96</a>
<a href="https://rebro.kr/167">https://rebro.kr/167</a> 
<a href="https://coding-factory.tistory.com/755">https://coding-factory.tistory.com/755</a></p>
<hr>
<h3 id="맞지-않은-내용이-있으면-말씀해주세요-수정하겠습니다-">맞지 않은 내용이 있으면 말씀해주세요. 수정하겠습니다 ^&amp;^</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Kakao Map #1]-기본 설정]]></title>
            <link>https://velog.io/@just_coding/Kakao-Map-1-%EA%B8%B0%EB%B3%B8-%EC%84%A4%EC%A0%95</link>
            <guid>https://velog.io/@just_coding/Kakao-Map-1-%EA%B8%B0%EB%B3%B8-%EC%84%A4%EC%A0%95</guid>
            <pubDate>Mon, 10 Apr 2023 05:07:32 GMT</pubDate>
            <description><![CDATA[<p>kakao map을 사용하기 위해서는 여러가지 기본설정과 key를 발급 받아야합니다. 그러기 위해서 아래와 같이 따라해주세요.</p>
<h2 id="1-key-발급">1. Key 발급</h2>
<p><a href="https://developers.kakao.com/">kakao developers</a>
<img src="https://velog.velcdn.com/images/just_coding/post/3b1db047-a143-4350-a275-5fe51a18f67e/image.png" alt="">
내 애플리케이션을 누릅니다.
<img src="https://velog.velcdn.com/images/just_coding/post/e161e41e-a234-459f-9900-1edb98291073/image.png" alt="">
로그인이 필요한 작업이기 때문에 카카오계정을 로그인을 하게되면 위와같은 화면이 나옵니다. 화면에 보이는 <strong>애플리케이션 추가하기</strong>를 클릭합니다.
<img src="https://velog.velcdn.com/images/just_coding/post/57c48c06-5fb7-4782-8c26-b33678dc80ef/image.png" alt=""></p>
<p>앱 이름과, 사업자명을 입력하라고 나옵니다. 자신이 만들고자 하는 이름을 적고 서비스 이용의 동의 후 저장을 클릭합니다.</p>
<p><img src="https://velog.velcdn.com/images/just_coding/post/56f4f3cd-6d05-4541-b796-41b140c1725c/image.png" alt=""></p>
<p>해당 애플리케이션이 생성되고 그곳으로 들어가면 키가 발급된것을 볼 수 있습니다. 저는 javaScript 키를 이용하여 진행하였습니다.</p>
<h2 id="2-플랫폼-설정">2. 플랫폼 설정</h2>
<p><img src="https://velog.velcdn.com/images/just_coding/post/728b526e-ce18-4192-a4d1-c832ee9dc06b/image.png" alt="">
플랫폼 설정하기를 클릭합니다.</p>
<p><img src="https://velog.velcdn.com/images/just_coding/post/3bae09b5-089d-4096-a465-a96855045c23/image.png" alt="">
자신이 쓸 플랫폼의 종류를 선택하여 등록하면 됩니다. 저는 Web을 사용할 예정이므로 Web 플랫폼 등록을 하였습니다.
<img src="https://velog.velcdn.com/images/just_coding/post/e1723e8b-4e02-40b6-82e0-2fd44a7dd7e3/image.png" alt=""></p>
<p>자신의 사이트 도메인을 추가해주면됩니다. 저는 local에서 진행하므로 위와 같이 <a href="http://localhost:8080">http://localhost:8080</a> 을 도메인 주소를 추가하였습니다.</p>
<p><img src="https://velog.velcdn.com/images/just_coding/post/87ded748-dad2-4e64-a47f-c4576c7c9a1e/image.png" alt=""></p>
<p>저장을 하게되면 위와 같이 저가 등록한 Web 플랫폼이 정상적으로 등록된것을 볼 수 있습니다.</p>
<h2 id="3-map-설정">3. map 설정</h2>
<pre><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
    &lt;meta charset=&quot;utf-8&quot;/&gt;
    &lt;title&gt;Kakao 지도 시작하기&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;div id=&quot;map&quot; style=&quot;width:500px;height:400px;&quot;&gt;&lt;/div&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;//dapi.kakao.com/v2/maps/sdk.js?appkey=발급받은 APP KEY를 넣으시면 됩니다.&quot;&gt;&lt;/script&gt;
    &lt;script&gt;
        var container = document.getElementById(&#39;map&#39;);
        var options = {
            center: new kakao.maps.LatLng(33.450701, 126.570667),
            level: 3
        };

        var map = new kakao.maps.Map(container, options);
    &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><p>위와 같은 html파일을 만들어서 appkey=&#39;발급받은 APP KEY를 넣으시면 됩니다.&#39; 이부분에 위에서 발급받은 key를 넣으시면 됩니다.
<img src="https://velog.velcdn.com/images/just_coding/post/2073d427-0c61-48ce-8278-099f5972951e/image.png" alt="">
<strong>center: new kakao.maps.LatLng(33.450701, 126.570667)</strong> 위도,경도로 설정된 위치가 지도에 나오는 것을 볼 수 있습니다.</p>
<h2 id="참고">참고</h2>
<p><a href="https://apis.map.kakao.com/web/guide">https://apis.map.kakao.com/web/guide</a></p>
<hr>
<h3 id="잘못된-사실이-있으면-알려주시면-수정하겠습니다-">잘못된 사실이 있으면 알려주시면 수정하겠습니다. ^&amp;^</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL]Date.setDate()]]></title>
            <link>https://velog.io/@just_coding/TILDate.setDate</link>
            <guid>https://velog.io/@just_coding/TILDate.setDate</guid>
            <pubDate>Tue, 04 Apr 2023 07:40:07 GMT</pubDate>
            <description><![CDATA[<h2 id="🎈문제">🎈문제</h2>
<p>객체가 가지고 있는 날짜에서 3일전의 날짜를 구하고 싶었습니다.
그래서 저는 아래와 같이 설정하였습니다.</p>
<pre><code class="language-java">let date = $(&#39;#date).val(); // 2023-02-09
let endDate = new Date(date);
let startDate = new Date(); // 오늘 날짜 2023-04-04

startDate.setDate(endDate.getDate()-3);
</code></pre>
<p>원하는 값으로는 2023-02-06이 나와야하는데 2023-04-06이 나왔습니다.</p>
<h2 id="🎈해결방안">🎈해결방안</h2>
<pre><code class="language-java">let date = $(&#39;#date).val(); // 2023-02-09
let endDate = new Date(date);
let startDate = new Date(date); // 날짜 세팅 2023-02-09

startDate.setDate(endDate.getDate()-3);</code></pre>
<p>위와 같이 startDate도 객체시간으로 할당하여 계산하였더니 원하는 값이 2023-02-06이 나왔습니다.</p>
<h3 id="🎈이유">🎈이유!!</h3>
<p>결론부터 말씀드리면, <strong>1970 년 1 월 1 일 00:00:00 UTC와 주어진 날짜 사이의 밀리 초로 변경</strong>되서 계산 되기 때문입니다.</p>
<p>endDate.getDate()-3의 값은 6입니다.(9 - 3 = 6)
그래서 2023-04-04이 값인 객체에서 setDate(6)을 했을 때 2023-04-06으로만 바뀌게 됩니다.</p>
<p>그래서 2023-02-09인 같은 일수로 맞춰줬습니다.
다른 방법으로는 </p>
<pre><code class="language-java">let startDate = new Date(endDate.getTime() - 3 * 24 * 60 * 60 * 1000);</code></pre>
<p>이런식으로 설정해주면 됩니다.</p>
<h2 id="🎈참고">🎈참고</h2>
<p><a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Date/setDate">https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Date/setDate</a></p>
<hr>
<h3 id="⚠️틀린부분이-있으면-말씀해주세요-수정하겠습니다">⚠️틀린부분이 있으면 말씀해주세요!! 수정하겠습니다.</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Querydsl #2] JPQL -> Querydsl 변경]]></title>
            <link>https://velog.io/@just_coding/Querydsl-2-JPQL-Querydsl-%EB%B3%80%EA%B2%BD</link>
            <guid>https://velog.io/@just_coding/Querydsl-2-JPQL-Querydsl-%EB%B3%80%EA%B2%BD</guid>
            <pubDate>Fri, 17 Mar 2023 06:00:11 GMT</pubDate>
            <description><![CDATA[<h2 id="🎈1-jpql로-작성한-search">🎈1. JPQL로 작성한 search</h2>
<pre><code class="language-java">public interface CarRepository extends JpaRepository&lt;Car, Long&gt;{
    @Query(&quot;select c from Car c join fetch c.location where c.user.id = :userId and c.number like %:number&quot;)
    List&lt;Car&gt; findByLastFourNumbers(@Param(&quot;userId&quot;) Long userId, @Param(&quot;number&quot;) String number);

    @Query(&quot;select c from Car c join fetch c.location where c.user.id = :userId&quot;)
    List&lt;Car&gt; findByUserId(@Param(&quot;userId&quot;) Long userId);
}</code></pre>
<h2 id="🎈-2-carrepositorycustom-만들기">🎈 2. CarRepositoryCustom 만들기</h2>
<pre><code class="language-java">public interface CarRepositoryCustom{
    List&lt;CarDto&gt; search(CarSearchCondtion condition);
}</code></pre>
<blockquote>
<p>Query Dsl 를 작성과 유지보수를 쉽게하기 위해서 Custom을 만들어줍니다.</p>
</blockquote>
<h2 id="🎈-3-carrepositoryimpl-만들기">🎈 3. CarRepositoryImpl 만들기</h2>
<blockquote>
<p>⚠️주의. 이름 지을 때 해당하는 repository 이름+ Impl를 붙혀서 이름을 지어준다.</p>
</blockquote>
<pre><code class="language-java">public class CarRepositoryImpl implements CarRepositoryCustom{
    // 쿼리문을 작성을 위해 선언
    private final JPAQueryFactory queryFactory;

    // 생성자 주입
    public CarRepositoryImpl(EntityManager em){
        this.queryFactory = new JPAQueryFactory(em);
    }

    @Override
    public List&lt;CarDto&gt; search(CarSearchCondition condition){


          return queryFactory
                .select(Projections.fields(CarDto.class,
                    car.id, //QCar.car(Qcar를 static 시킴)
                    car.number,
                    car.user.username,
                    car.address,
                    car.location.lat,
                    car.location.lng
               ))
               .from(car)
               .leftJoin(car.user, user)
               .where(
                           usernameEq(condition.getUsername()),
                        targetEq(condtion.getTarget())
               .fetch();
    }
    private BooleanExpression usernameEq(String username){
        return StringUtils.hasText(username) ? car.user.username.eq(username) : null;
    }

    private BooleanExpression targetEq(String target){
        return StringUtils.hasText(target) &amp;&amp; target.length() &gt;= 4 ? car.number.endWith(target) : null;
    }
}</code></pre>
<blockquote>
<p>동적쿼리 작성하는 방법은 2가지 방법이 있습니다.</p>
</blockquote>
<ol>
<li>BooleanBuilder</li>
<li>where 다중 파라미터 사용</li>
</ol>
<h3 id="-booleanbuilder">* BooleanBuilder</h3>
<blockquote>
<pre><code class="language-java">public void BooleanBuilder() throws Exception{
     String usernameParam = &quot;member1&quot;;
     Integer ageParam = 10;
</code></pre>
</blockquote>
<pre><code>BooleanBuilder builder = new BooleanBuilder();
  if(usernameCond != null){
      builder.and(member.username.eq(usernameCond));
  }
  if(ageCond != null){
      builer.and(member.age.eq(ageCond));
}
  List&lt;Member&gt; result = queryFactory
                          .selectFrom(member)
                          .where(builder)
                          .fetch();</code></pre><p>}</p>
<pre><code>
&gt; **where 다중 파라미터**는
  1. where 조건에 null 값은 무시되는 장점
  2. 메서드를 다른 쿼리에서도 재활용 할 수 있는 장점
  3. 쿼리 자체의 가독성이 높아지는 장점
  위와 같은 3가지 장점이 있어 선택하였습니다.

## 🎈 4. CarRepository 수정

 ```java
  public interface CarRepository extends JpaRepository&lt;Car, Long&gt;, CarRepositoryCustom{

  }
</code></pre><blockquote>
<p>JPQL 작성한 코드는 삭제하고 인터페이스로 만든 CarRespositoryCustom을 상속받아줍니다.</p>
</blockquote>
<h2 id="🎈참고">🎈참고</h2>
<blockquote>
</blockquote>
<p><a href="https://www.inflearn.com/course/querydsl-%EC%8B%A4%EC%A0%84">링크</a>
Inflearn의 김영한님 실전! Querydsl 강의입니다.</p>
<hr>
<p>  ** 잘못된 내용이 있으면 알려주세요. 댓글 남겨주세요!! 수정하겠습니다!!**</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Querydsl #1] 환경 설정]]></title>
            <link>https://velog.io/@just_coding/Querydsl-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95</link>
            <guid>https://velog.io/@just_coding/Querydsl-%ED%99%98%EA%B2%BD-%EC%84%A4%EC%A0%95</guid>
            <pubDate>Thu, 16 Mar 2023 04:40:05 GMT</pubDate>
            <description><![CDATA[<p>스프링 부트 2.6 이상부터는 Querydsl 5.0을 사용해야합니다. 다음과 같이 build.gradle을 설정하면 됩니다.</p>
<h2 id="1-🎈version-설정">1. 🎈version 설정</h2>
<blockquote>
<pre><code class="language-java">buildscript{
    ext{
        queryDslVersion = &quot;5.0.0&quot;
    }
}</code></pre>
</blockquote>
<pre><code>dependencies 부분에 해당 version을 그대로 써도 되지만 버전 관리를 더 쉽게 하기위해서 위와 같은 방법으로 queryDslVersion을 선언하여 저장하였습니다.




## 2. 🎈plugin 설정
&gt;```java
plugins{
...
    id &quot;com.ewerk.gradle.plugins.querydsl&quot; version &quot;1.0.10&quot;
...
}</code></pre><p>아래 부분에 querydsl{..} 부분을 사용하기 위해서는 플러그인을 추가해주어야합니다.</p>
<h2 id="3-🎈dependency-추가">3. 🎈dependency 추가</h2>
<blockquote>
<pre><code class="language-java">dependencies{
    ...
    implementation &quot;com.querydsl:querydsl-jpa:${queryDslVersion}&quot;
    implementation &quot;com.querydsl:querydsl-apt:${queryDslVersion}&quot;
}</code></pre>
</blockquote>
<pre><code>위에서 설정한 Version을 담고 있는 변수 queryDslVersion을 ${queryDslVersion} 형식으로 넣어준다. 
&gt;
***⚠️주의‼️***
&quot; &quot;가 아니라 &#39; &#39;로 감싸면 ${queryDslVersion} 부분이 인식하지 못한다. ⚠️

## 4. 🎈추가 설정
```java
def querydslDir = &quot;$buildDir/generated/querydsl&quot;

querydsl{
    jpa = true
    querydslSourcesDir = querydslDir
}
sourceSets{
    main.java.srcDir querydslDir
}
compileQuerydsl{
    options.annotationProcessorPath = configurations.querydsl
}
configurations{
    conpileOnly{
        extendsFrom annotationProcessor
    }
    querydsl.extendsFrom compileClasspath
}</code></pre><blockquote>
<p>위에서 말한거처럼 플러그인을 설정한 이유는 추가 설정을 해주기 위해서입니다.
querydslDir = &quot;$buildDir/generated/querydsl&quot; QType Entity들이 생길 주소 경로입니다. 
(* <strong>$buildDir</strong>은 project의 build 드렉토리 경로입니다.)</p>
</blockquote>
<h2 id="5-🎈build-실행">5. 🎈build 실행</h2>
<p><img src="https://velog.velcdn.com/images/just_coding/post/afe3b943-0c30-4bf4-8130-4b812a5ba81b/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/just_coding/post/a7e0cf9e-8726-4aae-ba12-370ab654d13c/image.png" alt=""></p>
<blockquote>
<p><strong>compileQuerydsl</strong>를 통해서 빌드를 시켜서 Entity들에 대해서 QType의 클래스가 생깁니다. 생기지 않거나 이미 build를 했었더라면 <strong>clean</strong>을 먼저 실행시키고 <strong>compileQuerydsl</strong>를 실행시켜주세요</p>
</blockquote>
<h2 id="참고">참고</h2>
<blockquote>
</blockquote>
<p><a href="https://www.inflearn.com/course/querydsl-%EC%8B%A4%EC%A0%84">링크</a>
Inflearn의 김영한님 실전! Querydsl 강의입니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[HashMap vs TreeMap]]></title>
            <link>https://velog.io/@just_coding/HashMap-vs-TreeMap</link>
            <guid>https://velog.io/@just_coding/HashMap-vs-TreeMap</guid>
            <pubDate>Fri, 24 Feb 2023 09:16:09 GMT</pubDate>
            <description><![CDATA[<h2 id="🎉map이란">🎉Map이란?</h2>
<ul>
<li>key와 value이 하나의 쌍으로 연결되어 있어 키를 통해 값에 접근을 할 수 있도록 만들어진 자료 구조</li>
</ul>
<h2 id="🎉hashmap이란">🎉HashMap이란?</h2>
<ul>
<li>내부적으로 Entry&lt;K,V&gt;[] Entry 의 array로 되어 있으며, 해당 array에 index는 내부 해쉬 함수를 통해 계산된다.</li>
<li>HashMap은 Map 인터페이스의 한 종류로 Key와 Value 한 쌍을 데이터로 가지고 있으며 Key를 통해 Value에 접근한다.</li>
<li>HashMap은 그 안에 들어있는 데이터를 Set 구조 저장하기 때문에 Set의 원칙대로 중복된 데이터를 허락하지 않으면서 순서가 없다.</li>
<li>hashing을 사용하기 때문에 많은양의 데이터를 검색하는데 뛰어난 성능을 가지고 있다.</li>
<li>시간복잡도 O(1)</li>
</ul>
<p>*Set : 중복된 데이터 x, 순서 x</p>
<h2 id="🎉treemap이란">🎉TreeMap이란?</h2>
<ul>
<li>key 값에 따라서 자동으로 Sort가 되는 방식</li>
<li>동기화(synchronized) 처리가 되어 있어 Thread-safe 하다.</li>
<li>HashMap과는 다르게 Key 값으로 null을 허용하지 않는다.</li>
<li>내부적으로 RedBlack Tree로 저장되며, 키값에 대한 Comparator 구현으로 정렬 순서를 바꿀수 있음</li>
<li>시간복잡도 O(logN)</li>
<li>RedBlack Tree : 자가 균형 이진 탐색 트리</li>
</ul>
<h2 id="🎉hashmap과-treemap의-차이">🎉HashMap과 TreeMap의 차이</h2>
<ul>
<li>HashMap은 key로 null 허용, TreeMap은 key로 null 허용하지 않음</li>
<li>HashMap은 정렬되어 있지 않은 상태, TreeMap은 정렬된 상태</li>
<li>HashMap 시간복잡도 O(1), TreeMap 시간복잡도 O(logN)</li>
</ul>
<h2 id="참고">참고</h2>
<p><a href="https://code-lab1.tistory.com/62">Red Black Tree</a>
<a href="https://hun-developer.tistory.com/27">HashMap vs TreeMap</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JAVA]Garbage Collection(GC)]]></title>
            <link>https://velog.io/@just_coding/JAVAGarbage-CollectionGC</link>
            <guid>https://velog.io/@just_coding/JAVAGarbage-CollectionGC</guid>
            <pubDate>Fri, 24 Feb 2023 07:51:57 GMT</pubDate>
            <description><![CDATA[<h2 id="🎈gcgarbage-collections">🎈GC(Garbage Collections)</h2>
<ul>
<li>GC(Garbage Collection)는 자바 애플리케이션에서 사용하지 않는 메모리를 자동으로 수거하는 기능</li>
</ul>
<h2 id="🎈jvm-메모리-영역">🎈JVM 메모리 영역</h2>
<ul>
<li>자바에서는 Young 영역과 Old 영역으로 나뉜다.</li>
<li>Young 영역은 생성된지 얼마 되지 않은 객체들을 저장하는 장소.
(Young 영역에서 시간이 지남에 다라서 우선 순위가 낮아지면 Old 영역으로 옮겨짐)</li>
<li>Old 영역은 생성된지 오래된 객체를 저장하는 장소</li>
<li>Perm 영역은 Class, Method 등의 코드가 저장되는 영역으로, JVM에 의해서 사용된다.</li>
</ul>
<h2 id="🎈minor-gc">🎈Minor GC</h2>
<p><img src="https://velog.velcdn.com/images/just_coding/post/a56e270e-42a6-48af-bdac-783c4184db28/image.png" alt=""></p>
<ul>
<li>Young 영역을 Minor GC라고 부른다. Young 영역은 Eden/ survivor 이라는 두 영역으로 또 나뉜다.</li>
<li>Eden 영역은 자바 객체가 생성되자마자 저장되는 곳</li>
<li>이렇게 생성된 객체는 Minor GC가 발생할 때 Survior 영역으로 이동하게 된다.</li>
<li>Survivor 영역은 Survivor1과 Survivor2 두 영역으로 나뉘는데, Minor GC가 발생하면 Eden과 Survivor1에 활성 객체를 Survivor2로 복사한다.</li>
<li>Survivor1과 Eden 영역을 클리어하여 Survivor2에 활성객체만 있도록 한다.</li>
<li>다음번 Minor GC가 발생하면 같은 원리로 Eden과 Survivor2 영역에서 활성객체를 Survivor1에 이동시킨다. 반복하면서 Minor GC 수행</li>
<li>Survivor에 오래된 객체는 Old영역으로 옮긴다.</li>
<li>이러한 방식을 GC 알고리즘 Copy &amp; Scavenge 라고 한다. 이 방식은 속도가 매우 빠르며 작은 크기의 메모리를 콜렉팅하는데 매우 효과적이다.</li>
<li>Minor GC의 경우에는 자주 일어나기 때문에 GC에 걸리는 시간이 잛은 알고리즘을 사용하는것이 적합하다.</li>
</ul>
<h2 id="🎈full-gc">🎈FULL GC</h2>
<ul>
<li>Old 영역의 가비지 컬렉션을 Full GC라고 부르며 Full GC에 사용되는 알고리즘을 Mark &amp; compact 라고 한다.</li>
<li>Mark &amp; Compack 알고리즘은 객체들의 참조를 확인하면서 참조가 연결되지 않은 객체를 표시한다. 이 작업이 끝나면 사용되지 않는 객체를 모두 표시하고 이 표시된 객체를 삭제한다.</li>
<li>Full GC는 속도가 매우 느리며, Full GC가 일어나는 도중에는 순간적으로 자바 애플리케이션이 멈춰버리기 대문에, Full GC가 일어나는 정도와 시간은 애플리케이션의 성능과 안정성에 아주 큰 영향을 미친다.</li>
</ul>
<h2 id="🎈gc가-중요한-이유">🎈GC가 중요한 이유</h2>
<ul>
<li>가비지 컬렉션 중에서 Minor GC의 경우에는 보통 0.5 이내에 끝나기 때문에 큰 문제가 되지 않지만, Full GC의 경우네는 자바 애플리케이션이 멈춰 버리기 때문에, 문제가 될 수 있다.</li>
<li>멈추는 동안 사용자의 요청이 큐에 들어있다가, 순간적으로 요청이 한꺼번에 들어오기 대문에 과부하에 의한 여러 장애를 만들 수 있다.</li>
<li>따라서 원활한 서비를 위해서는 GC가 어떻게 일어나게 하느냐가 시스템의 안정성과 성능에 큰 변수로 작용할 수 있다.</li>
</ul>
<h2 id="🎈stop-the-world">🎈Stop-the-world</h2>
<ul>
<li>GC를 실행하기 위해 JVM이 애플리케이션 실행을 멈추는 것이다.</li>
<li>stop-the-world가 발생하면 GC를 실행하는 스레드를 제외한 나머지 스레드는 모두 작업을 멈춘다.</li>
<li>GC 작업을 완료한 이후에야 중단했던 작업을 다시 시작한다.</li>
<li>어떤 GC 알고리즘을 사용하더라도 stop-the-world가 발생한다.</li>
<li>GC 튜닝이란 stop-the-world 시간을 줄이는 것이다.</li>
</ul>
<h2 id="참고">참고</h2>
<ul>
<li><a href="https://dongwooklee96.github.io/post/2021/04/04/gcgarbage-collector-%EC%A2%85%EB%A5%98-%EB%B0%8F-%EB%82%B4%EB%B6%80-%EC%9B%90%EB%A6%AC.html">이동욱님 GC(Garbage Collection) 종류 및 내부 원리</a></li>
<li><a href="https://domean.tistory.com/199">발전 가능성이 있는 사람이 되자</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[10진수 <-> N진수 변환]]></title>
            <link>https://velog.io/@just_coding/10%EC%A7%84%EC%88%98-N%EC%A7%84%EC%88%98-%EB%B3%80%ED%99%98</link>
            <guid>https://velog.io/@just_coding/10%EC%A7%84%EC%88%98-N%EC%A7%84%EC%88%98-%EB%B3%80%ED%99%98</guid>
            <pubDate>Sat, 10 Dec 2022 13:31:42 GMT</pubDate>
            <description><![CDATA[<h2 id="10진수---n진수-변환">10진수 -&gt; N진수 변환</h2>
<blockquote>
</blockquote>
<pre><code class="language-java">Integer.toString(&quot;10진수&quot;, &quot;변환하고 싶은 진수&quot;)</code></pre>
<p>특정 진수를 변환할 때 쓰이는 함수들도 있다.</p>
<p><strong>2진수</strong>
Integer.toBinaryString(&quot;원하는 값&quot;)</p>
<p><strong>8진수</strong>
Integer.toOctalString(&quot;원하는 값&quot;)</p>
<p><strong>16진수</strong>
Integer.toHexString(&quot;원하는 값&quot;)</p>
<h2 id="n진수---10진수">N진수 -&gt; 10진수</h2>
<blockquote>
<pre><code class="language-java">Integer.parseInt(값(String형태), N진수)</code></pre>
</blockquote>
<p>```</p>
<h2 id="참고">참고</h2>
<blockquote>
<p><a href="https://cornarong.tistory.com/48https://cornarong.tistory.com/48">https://cornarong.tistory.com/48https://cornarong.tistory.com/48</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스][3차 압축]-Lv.2]]></title>
            <link>https://velog.io/@just_coding/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A43%EC%B0%A8-%EC%95%95%EC%B6%95-Lv.2</link>
            <guid>https://velog.io/@just_coding/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A43%EC%B0%A8-%EC%95%95%EC%B6%95-Lv.2</guid>
            <pubDate>Fri, 09 Dec 2022 07:39:06 GMT</pubDate>
            <description><![CDATA[<h2 id="🎉-문제">🎉 문제</h2>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/17684">문제링크</a>
<img src="https://velog.velcdn.com/images/just_coding/post/8bfb53f4-8ee5-404d-b044-21b35a053204/image.png" alt=""><img src="https://velog.velcdn.com/images/just_coding/post/b56b92c0-3c81-499a-80e4-ffd877ff4242/image.png" alt=""></p>
<h2 id="🎉-입출력-형식">🎉 입/출력 형식</h2>
<p><img src="https://velog.velcdn.com/images/just_coding/post/2b9651aa-b564-43f4-bf25-1d50c00a8739/image.png" alt=""></p>
<h2 id="🎉-접근방법">🎉 접근방법</h2>
<blockquote>
<ol>
<li>A~Z를 String 형태로 list에 저장한다.</li>
<li>주어진 msg를 index 0부터 빈 스트링(s)에 붙히면서 list에 있는지 확인한다.
2-1 list에 존재하면 history에 s를 저장한다.
2-2 list에 없으면 history의 index 번호는 ans에 저장하고 s는 list에 넣어 준뒤
s = &quot;&quot;로 초기화하고 index를 -1를 해준다.</li>
<li>index가 msg 길이 만큼 2를 반복한다.</li>
<li>마지막 history의 index 번호를 ans에 저장하고 반환한다.</li>
</ol>
</blockquote>
<h2 id="🎉-코드">🎉 코드</h2>
<pre><code class="language-java">import java.util.*;
class Solution {
    public int[] solution(String msg) {
        int[] answer = {};
        List&lt;Integer&gt; ans = new ArrayList&lt;&gt;();
        List&lt;String&gt; list = new ArrayList&lt;&gt;();
        char temp = &#39;A&#39;;
        // 1. A~Z 넣기
        for(int i=0; i&lt;26; i++){
            String str = String.valueOf((char)(temp+i));
            list.add(str);
        }
        String s = &quot;&quot;;
        String history = &quot;&quot;;
        for(int i=0; i&lt;msg.length(); i++){
            // 1. list에 포함되는지 확인
            s += msg.charAt(i);
            if(list.contains(s)){
                history = s;
                continue;
            }
            ans.add(list.indexOf(history)+1);
            list.add(s);
            s = &quot;&quot;;
            i--;
        }
        ans.add(list.indexOf(history)+1);
        return ans.stream().mapToInt(i-&gt;i).toArray();
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스][프렌즈4블록]-Lv.2]]></title>
            <link>https://velog.io/@just_coding/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%ED%94%84%EB%A0%8C%EC%A6%884%EB%B8%94%EB%A1%9D-Lv.2</link>
            <guid>https://velog.io/@just_coding/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%ED%94%84%EB%A0%8C%EC%A6%884%EB%B8%94%EB%A1%9D-Lv.2</guid>
            <pubDate>Thu, 08 Dec 2022 13:26:57 GMT</pubDate>
            <description><![CDATA[<h2 id="🎈문제">🎈문제</h2>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/17679">문제링크</a>
<img src="https://velog.velcdn.com/images/just_coding/post/75f50986-c33d-402a-9af3-f5af7881012e/image.png" alt="">
<img src="https://velog.velcdn.com/images/just_coding/post/45fee2bc-82b2-46c1-b51a-6771349d0a60/image.png" alt=""></p>
<h2 id="🎈제한사항입력형식">🎈제한사항(입력형식)</h2>
<p><img src="https://velog.velcdn.com/images/just_coding/post/ebcdeb49-9767-451c-8865-f61ec821d999/image.png" alt=""></p>
<h2 id="🎈접근방법">🎈접근방법</h2>
<blockquote>
<ol>
<li>4칸으로 지워지는 블록을 이차원 boolean 배열(check)에 체크해준다.(바로 적용안하는 이유는 : 겹치는 부분도 있기 때문에 모든 경우를 구해야한다.)</li>
<li>check배열에서 true이면 map에 &#39;.&#39;으로 바꿔준다. (지우는 단계)
2-1. &#39;.&#39;으로 바꿔주면서 바꿔준 갯수를 새고 반환해준다.
2-2 개수가 0이면 종료하고 아니면 answer에 더해준다.</li>
<li>지워진 블록을 채우기 위해서 블록들을 내려준다.</li>
<li>2-2에 0이 나올 때까지 반복한다.</li>
</ol>
</blockquote>
<h2 id="🎈코드">🎈코드</h2>
<pre><code class="language-java">class Solution {
    static int[] dx ={1,0,1};
    static int[] dy ={0,1,1};
    static char[][] map;
    static int M,N;
    public int solution(int m, int n, String[] board) {
        int answer = 0;
        M = m; N = n;
        map = new char[m][n];
        for(int i=0; i&lt;m; i++){
            map[i] = board[i].toCharArray();
        }
        while(true){
            boolean[][] check = new boolean[m][n]; 
            for(int i=0; i&lt;m-1; i++){
                for(int j=0; j&lt;n-1; j++){
                    if(map[i][j] == &#39;.&#39;) continue;
                    blockCheck(check,i,j);
                }
            }
            int cnt = blockDelete(check);
            if(cnt==0) break;
            answer+=cnt;
            blockDown();
        }
        return answer;
    }
    // 블럭 내리기
    static void blockDown(){
        for(int c = 0 ; c &lt; N ; c++) {
            for(int r = M - 1 ; r &gt;= 0 ; r--) {
                if(map[r][c] == &#39;.&#39;) {
                    for(int k = r - 1 ; k &gt;= 0 ; k--) {
                        if(map[k][c] != &#39;.&#39;) {
                            map[r][c] = map[k][c];
                            map[k][c] = &#39;.&#39;;
                            break;
                        }
                    }
                }
            }
        }

    }
    // 블럭 지우기
    static int blockDelete(boolean[][] check){
        int cnt = 0;
        for(int i=0; i&lt;M; i++){
            for(int j=0; j&lt;N; j++){
                if(check[i][j]){
                    map[i][j] = &#39;.&#39;;
                    cnt++;
                }
            }
        }   
        return cnt;
    }
    // 지워야할 블럭 찾기
    static void blockCheck(boolean[][] check,int x, int y){
        int cnt = 0;
        for(int i=0; i&lt;3; i++){
            int px = x + dx[i];
            int py = y + dy[i];
            if(0&lt;=px &amp;&amp; px &lt; M &amp;&amp; 0&lt;=py &amp;&amp; py&lt;N){
                if(map[x][y] == map[px][py]){
                    cnt++;
                }
            }
        }
        if(cnt==3){
            check[x][y] = true;
            check[x+1][y] = true;
            check[x][y+1] = true;
            check[x+1][y+1] = true;
        }
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[2진수 변환하는 방법]]></title>
            <link>https://velog.io/@just_coding/2%EC%A7%84%EC%88%98-%EB%B3%80%ED%99%98%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@just_coding/2%EC%A7%84%EC%88%98-%EB%B3%80%ED%99%98%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Mon, 05 Dec 2022 04:57:30 GMT</pubDate>
            <description><![CDATA[<h2 id="📖-2진수-변환">📖 2진수 변환</h2>
<blockquote>
</blockquote>
<p>2진수 변환을 아래와 같이 while문을 통해 지금까지 구해왔습니다.</p>
<pre><code class="language-java">public String binary(int num){
        String ans = &quot;&quot;;
        while(num&gt;0){
            ans = (num%2) + ans;
            num /= 2;
        }
        return ans;
    }</code></pre>
<h2 id="📖-새로-알게된-방법">📖 새로 알게된 방법</h2>
<blockquote>
<p><strong>Integer.toBinaryString(num);</strong>
num에 원하는 int 값을 넣으면 그에 맞게 2진수로 변환해서 반환합니다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스][타겟 넘버]-Lv.2]]></title>
            <link>https://velog.io/@just_coding/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%ED%83%80%EA%B2%9F-%EB%84%98%EB%B2%84-Lv.2</link>
            <guid>https://velog.io/@just_coding/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%ED%83%80%EA%B2%9F-%EB%84%98%EB%B2%84-Lv.2</guid>
            <pubDate>Tue, 22 Nov 2022 10:47:33 GMT</pubDate>
            <description><![CDATA[<h2 id="🎈-문제">🎈 문제</h2>
<p><a href="https://www.programmers.co.kr/learn/courses/30/lessons/43165">문제링크</a>
<img src="https://velog.velcdn.com/images/just_coding/post/e40ae772-c6dd-4690-bbab-218d5f44dc78/image.png" alt=""></p>
<h2 id="🎈-제한-사항">🎈 제한 사항</h2>
<p><img src="https://velog.velcdn.com/images/just_coding/post/0180a366-a41d-4fd7-955b-7a061648c987/image.png" alt=""></p>
<h2 id="🎈-접근방법">🎈 접근방법</h2>
<blockquote>
<ol>
<li><strong>DFS</strong>를 이용하였다.</li>
<li><strong>DFS</strong>를 돌면서 깊이가 주어진 numbers의 길이 일때 종료 조건을 넣는다.</li>
<li>종료조건이 만족할 때 sum이 target과 같으면 answer +1를 해준다.</li>
<li>sum에 해당 숫자를 더한 값 <strong>DFS</strong>, 뺀 값 <strong>DFS</strong>를 돌린다.</li>
</ol>
</blockquote>
<h2 id="🎈-코드">🎈 코드</h2>
<pre><code class="language-java">class Solution {
    static int answer=0;
    public int solution(int[] numbers, int target) {
        dfs(0,0,target,numbers);
        return answer;
    }
    static void dfs(int depth, int sum, int target, int[] numbers){
        if(depth == numbers.length){
            if(sum == target){
                answer++;
            }
            return;
        }
        dfs(depth+1, sum+numbers[depth], target, numbers);
        dfs(depth+1, sum-numbers[depth], target, numbers);
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스][도둑질]-Lv.4]]></title>
            <link>https://velog.io/@just_coding/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%EB%8F%84%EB%91%91%EC%A7%88-Lv.4</link>
            <guid>https://velog.io/@just_coding/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%EB%8F%84%EB%91%91%EC%A7%88-Lv.4</guid>
            <pubDate>Tue, 22 Nov 2022 10:41:51 GMT</pubDate>
            <description><![CDATA[<h2 id="🎈-문제">🎈 문제</h2>
<p><a href="https://www.programmers.co.kr/learn/courses/30/lessons/42897">문제링크</a>
<img src="https://velog.velcdn.com/images/just_coding/post/bf418e8e-b085-4f68-8878-97c488431e54/image.png" alt=""></p>
<h2 id="🎈-제한사항">🎈 제한사항</h2>
<p><img src="blob:https://velog.io/7a0570a7-2c35-4303-8ff2-4bff738feb4b" alt="업로드중.."></p>
<h2 id="🎈-접근방법">🎈 접근방법</h2>
<blockquote>
<p>두가지 경우를 나뉜다.</p>
</blockquote>
<ol>
<li>첫번 째 집을 도둑질 할 경우</li>
<li>첫번 째 집을 도둑질 안하고, 두번 째 집부터 도둑질 할 경우</li>
<li>시작점을 정하고, index 2부터 주어진 money의 길이만큼 반복하면서 index-1과 index-2 + money[index]를 비교해 가면서 최댓값을 저장한다.</li>
</ol>
<h2 id="🎈-코드">🎈 코드</h2>
<pre><code class="language-java">import java.util.*;
class Solution {
    public int solution(int[] money) {
        int len = money.length;
        int[] dp0 = new int[len];
        int[] dp1 = new int[len];
        dp0[0] = dp0[1] =money[0];
        dp1[1] = money[1];
        for(int i=2; i&lt;len; i++){
            dp0[i] = Math.max(dp0[i-1], dp0[i-2]+money[i]);
            dp1[i] = Math.max(dp1[i-1], dp1[i-2]+money[i]);
        }
        return Math.max(dp0[len-2],dp1[len-1]);
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스][등굣길]-Lv.3]]></title>
            <link>https://velog.io/@just_coding/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%EB%93%B1%EA%B5%A3%EA%B8%B8-Lv.3</link>
            <guid>https://velog.io/@just_coding/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%EB%93%B1%EA%B5%A3%EA%B8%B8-Lv.3</guid>
            <pubDate>Tue, 22 Nov 2022 10:21:27 GMT</pubDate>
            <description><![CDATA[<h2 id="🎉-문제">🎉 문제</h2>
<p><a href="https://www.programmers.co.kr/learn/courses/30/lessons/42898">문제링크</a>
<img src="https://velog.velcdn.com/images/just_coding/post/15edc8a9-d08f-4a9a-85e5-9aee4e2cefee/image.png" alt=""></p>
<h2 id="🎉-제한사항">🎉 제한사항</h2>
<p><img src="https://velog.velcdn.com/images/just_coding/post/4b32cd17-4255-4c73-9020-8311a1476930/image.png" alt=""></p>
<h2 id="🎉-접근방법">🎉 접근방법</h2>
<blockquote>
<ol>
<li>구덩이를 -1로 먼저 표시를 해준다.</li>
<li>(1,1)부터 (n,m) 까지 돌면서 웅덩이일 경우 표시했던 웅덩이를 0으로 바꿔주고 continue해준다.</li>
<li>첫행이 아닐 때와 첫열이 아닐 때 그전까지 왔던 수를 저장한다.</li>
<li>map[n][m]을 리턴한다.</li>
</ol>
</blockquote>
<h2 id="🎉-코드">🎉 코드</h2>
<pre><code class="language-java">class Solution {
    static int[][] map;
    public int solution(int m, int n, int[][] puddles) {
        int answer = 0;
        map = new int[n+1][m+1];
        for(int i=0; i&lt;puddles.length; i++){
            int x = puddles[i][0];
            int y = puddles[i][1];
            map[y][x] = -1;
        }
        map[1][1] = 1;
        for(int i=1; i&lt;=n; i++){
            for(int j=1; j&lt;=m; j++){
                if(map[i][j] == -1){
                    map[i][j] = 0;
                    continue;
                }
                if(i != 1){
                    map[i][j]  += map[i-1][j]%1000000007;
                }

                if(j != 1){
                    map[i][j] += map[i][j-1]%1000000007;
                }
            }
        }
        return map[n][m]%1000000007;
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스][정수삼각형]-Lv.3]]></title>
            <link>https://velog.io/@just_coding/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%EC%A0%95%EC%88%98%EC%82%BC%EA%B0%81%ED%98%95-Lv.3</link>
            <guid>https://velog.io/@just_coding/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%EC%A0%95%EC%88%98%EC%82%BC%EA%B0%81%ED%98%95-Lv.3</guid>
            <pubDate>Tue, 22 Nov 2022 09:56:47 GMT</pubDate>
            <description><![CDATA[<h2 id="🎊-문제">🎊 문제</h2>
<p><a href="https://www.programmers.co.kr/learn/courses/30/lessons/43105">문제링크</a>
<img src="https://velog.velcdn.com/images/just_coding/post/6de2278b-2bdf-4514-8586-516fbc236423/image.png" alt=""></p>
<h2 id="🎊-제한-사항">🎊 제한 사항</h2>
<p><img src="https://velog.velcdn.com/images/just_coding/post/528f8105-30ab-43ac-a086-c008010622a7/image.png" alt=""></p>
<h2 id="🎊-접근방법">🎊 접근방법</h2>
<blockquote>
<p><img src="https://velog.velcdn.com/images/just_coding/post/3bc99ad8-a98d-42ee-8bc2-9260aca22c40/image.png" alt="">
위 모양처럼 생각하면 쉽게 접근할 수 있다.</p>
</blockquote>
<ol>
<li>자신의 위에 있는 숫자와 왼쪽대각선의 숫자를 비교한 뒤 더 큰 숫자와 자신을 더하고 저장한다.</li>
<li>마지막 행까지 1번을 반복한다.</li>
<li>마지막 행을 반복할 때 Math.max를 이용하여 최댓값을 구한다.</li>
</ol>
<h2 id="🎊-코드">🎊 코드</h2>
<pre><code class="language-java">class Solution {
    public int solution(int[][] triangle) {
        int answer = 0;
        int[][] dp = new int[triangle.length][triangle.length];
        dp[0][0] = triangle[0][0];
        for(int i=1; i&lt;triangle.length; i++){
            dp[i][0] = triangle[i][0]  + dp[i-1][0];

            for(int j=1; j&lt;=i; j++){
                dp[i][j] = triangle[i][j] + Math.max(dp[i-1][j-1], dp[i-1][j]);
                if(i == triangle.length-1){
                    answer = Math.max(answer, dp[i][j]);
                }
            }
        }
        return answer;
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스][N으로 표현]-Lv.3]]></title>
            <link>https://velog.io/@just_coding/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4N%EC%9C%BC%EB%A1%9C-%ED%91%9C%ED%98%84-Lv.3</link>
            <guid>https://velog.io/@just_coding/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4N%EC%9C%BC%EB%A1%9C-%ED%91%9C%ED%98%84-Lv.3</guid>
            <pubDate>Tue, 22 Nov 2022 09:38:53 GMT</pubDate>
            <description><![CDATA[<h2 id="🎉-문제">🎉 문제</h2>
<p><a href="https://www.programmers.co.kr/learn/courses/30/lessons/42895">문제링크</a>
<img src="https://velog.velcdn.com/images/just_coding/post/afe89904-d7ed-45fe-9f9c-79857fe41847/image.png" alt=""></p>
<h2 id="🎉-제한사항">🎉 제한사항</h2>
<p><img src="https://velog.velcdn.com/images/just_coding/post/26891577-bf3b-4dcb-892f-f42b223b7db9/image.png" alt=""></p>
<h2 id="🎉-접근방법">🎉 접근방법</h2>
<blockquote>
<ol>
<li>DFS을 통해 +, -, /, * 를 통해 해당 값을 찾았을 때 cnt의 최솟값을 구한다.</li>
<li>만약 처음 최솟값으로 설정한 Integer.MAX_VALUE라면 -1 리턴</li>
</ol>
</blockquote>
<h2 id="🎉-코드">🎉 코드</h2>
<pre><code class="language-java">class Solution {
    static int answer = Integer.MAX_VALUE;
    static int n,num;
    public int solution(int N, int number) {
        n = N;
        num = number;
        dfs(0,0);
        return answer==Integer.MAX_VALUE?-1:answer;
    }
    static void dfs(int cnt, int cur){
        if(cnt &gt; 8){
            return;
        }        
        if(cur == num){
            answer = Math.min(answer,cnt);
            return;
        }
        int temp = n;
        for(int i=0; i&lt;8; i++){
            dfs(cnt+i+1, cur + temp);
            dfs(cnt+i+1, cur - temp);
            dfs(cnt+i+1, cur / temp);
            dfs(cnt+i+1, cur * temp);

            temp = temp * 10 + n;
        }
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스][단속카메라]-Lv.3]]></title>
            <link>https://velog.io/@just_coding/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%EB%8B%A8%EC%86%8D%EC%B9%B4%EB%A9%94%EB%9D%BC-Lv.3</link>
            <guid>https://velog.io/@just_coding/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%EB%8B%A8%EC%86%8D%EC%B9%B4%EB%A9%94%EB%9D%BC-Lv.3</guid>
            <pubDate>Wed, 16 Nov 2022 07:01:48 GMT</pubDate>
            <description><![CDATA[<h2 id="🧨-문제">🧨 문제</h2>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/42884">링크텍스트</a>
<img src="https://velog.velcdn.com/images/just_coding/post/5cda752d-8edd-4cd7-8478-7111be530185/image.png" alt=""></p>
<h2 id="🧨-제한사항">🧨 제한사항</h2>
<p><img src="https://velog.velcdn.com/images/just_coding/post/50f4597a-540d-4854-86d7-55e7ae457090/image.png" alt=""></p>
<h2 id="🧨-접근방법">🧨 접근방법</h2>
<blockquote>
<ol>
<li>끝나는 시간 기준으로 오름차순 정렬을 한다.</li>
<li>std를 Integer 최솟값을 지정해준다.</li>
<li>routes 조회하면서 시작지점이 std보다 클 경우 카메라 개수 +1 해주고 시작지점을 std로 지정한다. </li>
</ol>
</blockquote>
<h2 id="🧨-코드">🧨 코드</h2>
<pre><code class="language-java">import java.util.*;
class Solution {
    public int solution(int[][] routes) {
        int answer = 0;
        Arrays.sort(routes, (o1,o2) -&gt; o1[1]-o2[1]);

        int std = Integer.MIN_VALUE;
        for(int i=0; i&lt;routes.length; i++){
            if(std &lt; routes[i][0]){
                std = routes[i][1];
                answer++;
            }
        }
        return answer;
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스][섬 연결하기]-Lv.3]]></title>
            <link>https://velog.io/@just_coding/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%EC%84%AC-%EC%97%B0%EA%B2%B0%ED%95%98%EA%B8%B0-Lv.3</link>
            <guid>https://velog.io/@just_coding/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%EC%84%AC-%EC%97%B0%EA%B2%B0%ED%95%98%EA%B8%B0-Lv.3</guid>
            <pubDate>Wed, 16 Nov 2022 06:52:23 GMT</pubDate>
            <description><![CDATA[<h2 id="🧨-문제">🧨 문제</h2>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/42861">문제링크</a>
<img src="https://velog.velcdn.com/images/just_coding/post/f4877a32-130f-438f-9dc6-c63d5b2f7c23/image.png" alt=""></p>
<h2 id="🧨-제한사항">🧨 제한사항</h2>
<p><img src="https://velog.velcdn.com/images/just_coding/post/d943ff71-112e-481d-9ea3-2dc3338c0cac/image.png" alt=""></p>
<h2 id="🧨-접근방법">🧨 접근방법</h2>
<blockquote>
<ol>
<li>크루스칼 알고리즘으로 Union &amp; Find를 사용하였다.</li>
<li>같은 부모일 경우 continue를 통해서 Union을 하지않는다.</li>
</ol>
<p>-&gt; Union을 할 경우 사이클이 생기므로 안된다.</p>
</blockquote>
<h2 id="🧨-코드">🧨 코드</h2>
<pre><code class="language-java">import java.util.*;
class Solution {
    static int[] group;
    public int solution(int n, int[][] costs) {
        int answer = 0;
        group = new int[n];
        // 그룹 초기화
        for(int i=0; i&lt;n; i++){
            group[i] = i;
        }
        Arrays.sort(costs, (o1,o2)-&gt; Integer.compare(o1[2],o2[2]));
        for(int i=0; i&lt;costs.length; i++){
            int a = find(costs[i][0]);
            int b = find(costs[i][1]);
            int cost = costs[i][2];

            if(a == b) continue;
            union(a,b);
            answer += cost;
        }
        return answer;
    }
    public int find(int x){
        if(group[x] == x){
            return x;
        }
        return group[x]=find(group[x]);
    }
    public void union(int a, int b){
        int groupA = find(a);
        int groupB = find(b);

        if(groupA &gt; groupB){
            group[groupA] = groupB;
        }else{
            group[groupB] = groupA;
        }
    } 
}</code></pre>
<h2 id="참고">참고</h2>
<p><a href="https://velog.io/@qodlstjd12/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%84%AC-%EC%97%B0%EA%B2%B0%ED%95%98%EA%B8%B0-Java">https://velog.io/@qodlstjd12/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%84%AC-%EC%97%B0%EA%B2%B0%ED%95%98%EA%B8%B0-Java</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[프로그래머스][구명보트]-Lv.2]]></title>
            <link>https://velog.io/@just_coding/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%EA%B5%AC%EB%AA%85%EB%B3%B4%ED%8A%B8-Lv.2</link>
            <guid>https://velog.io/@just_coding/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%EA%B5%AC%EB%AA%85%EB%B3%B4%ED%8A%B8-Lv.2</guid>
            <pubDate>Wed, 16 Nov 2022 06:41:45 GMT</pubDate>
            <description><![CDATA[<h2 id="🎊-문제">🎊 문제</h2>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/42885">문제링크</a>
<img src="https://velog.velcdn.com/images/just_coding/post/d466a414-a6ce-44c4-b70a-d114d5417fed/image.png" alt=""></p>
<h2 id="🎊-제한사항">🎊 제한사항</h2>
<p><img src="https://velog.velcdn.com/images/just_coding/post/64be5902-a9ef-4ecf-bf30-f05d938e024d/image.png" alt=""></p>
<h2 id="🎊-접근방법">🎊 접근방법</h2>
<blockquote>
<ol>
<li>오름차순정렬을 한다.</li>
<li>투포인터를 사용하였다. </li>
<li>작은 값들을 변경하면서 구한다.</li>
</ol>
</blockquote>
<h2 id="🎊-코드">🎊 코드</h2>
<pre><code class="language-java">import java.util.*;
class Solution {
    public int solution(int[] people, int limit) {
        int answer = 0;
        Arrays.sort(people);
        int left = 0;
        int right = people.length-1;
        int sum = people[right--];
        while(left &lt;= right){
            if(sum + people[left] &lt;= limit){
                sum += people[left++];
            }else{
                answer++;
                sum = people[right--];
            }
        }
        if(sum &lt;= limit) answer++;
        return answer;
    }
}</code></pre>
]]></description>
        </item>
    </channel>
</rss>