<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>DevLogs</title>
    <link>https://the-dev.tistory.com/</link>
    <description>Dev-Dog's Dev-Logs</description>
    <language>ko</language>
    <pubDate>Mon, 18 May 2026 05:26:44 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>개발개</managingEditor>
    <image>
      <title>DevLogs</title>
      <url>https://tistory1.daumcdn.net/tistory/3187017/attach/d28b555a186c4f7e813b35ae39c4273d</url>
      <link>https://the-dev.tistory.com</link>
    </image>
    <item>
      <title>[LeetCode/EASY] 206. Reverse Linked List (JAVA) : 문제&amp;amp;풀이</title>
      <link>https://the-dev.tistory.com/93</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;454&quot; data-origin-height=&quot;453&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBY5VE/btsvlKzX1se/yAEMtkE2fsDIH8BrcJLR20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBY5VE/btsvlKzX1se/yAEMtkE2fsDIH8BrcJLR20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBY5VE/btsvlKzX1se/yAEMtkE2fsDIH8BrcJLR20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBY5VE%2FbtsvlKzX1se%2FyAEMtkE2fsDIH8BrcJLR20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;399&quot; data-origin-width=&quot;454&quot; data-origin-height=&quot;453&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;연결리스트의 역&lt;/span&gt;을 구하는 문제이다.&lt;br /&gt;ListNode를 매개변수로 받는 reverseList메서드의 틀이 주어진다.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Problem :&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;java&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;class Solution {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public ListNode reverseList(ListNode head) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때, ListNode의 정의가 다음과 같이 주어진다.&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public class ListNode {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int val;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ListNode next;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ListNode() {}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ListNode(int val) { this.val = val; }
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;풀이는&amp;nbsp;reverseList메서드에 작성하면 된다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Solution :&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;재귀함수를 이용해 연결리스트의 역을 구하는 방법이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;class Solution {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public ListNode reverseList(ListNode head) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 현재 노드 -&amp;gt; 가장 마지막 노드가 됨
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 지금까지 역처리한 이전노드 없음(null)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return reverse(head, null);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private ListNode reverse(ListNode curr, ListNode prev) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 현재 노드가 null인 경우, 끝에 도달했으므로 이전 노드가 첫 노드가 됨
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (curr == null) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return prev;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 실제 다음 노드는 새로운 변수에 할당
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 역 연결리스트의 이전 노드가 될 예정
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ListNode next = curr.next;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 실제 이전 노드는 역 연결리스트의 다음 노드로 설정
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;curr.next = prev;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 다음 역전 대상은 실제 다음 노드와 현재 노드
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return reverse(next, curr);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Example:&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1396&quot; data-origin-height=&quot;1703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dj9D5/btsvoW0H02Y/OMpYrGLf8YxYzTlN3o4Vx0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dj9D5/btsvoW0H02Y/OMpYrGLf8YxYzTlN3o4Vx0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dj9D5/btsvoW0H02Y/OMpYrGLf8YxYzTlN3o4Vx0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDj9D5%2FbtsvoW0H02Y%2FOMpYrGLf8YxYzTlN3o4Vx0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1396&quot; height=&quot;1703&quot; data-origin-width=&quot;1396&quot; data-origin-height=&quot;1703&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>KR/코딩테스트</category>
      <category>Easy</category>
      <category>LeetCode</category>
      <category>Linked</category>
      <category>LinkedList</category>
      <category>리트코드</category>
      <category>릿코드</category>
      <category>코딩테스트</category>
      <category>코테</category>
      <author>개발개</author>
      <guid isPermaLink="true">https://the-dev.tistory.com/93</guid>
      <comments>https://the-dev.tistory.com/93#entry93comment</comments>
      <pubDate>Sun, 24 Sep 2023 23:24:44 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode/MEDIUM] 2. Add Two Numbers (JAVA) : 문제&amp;amp;풀이</title>
      <link>https://the-dev.tistory.com/92</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;add_two_numbers.png&quot; data-origin-width=&quot;359&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Pnpad/btsqoefkl7A/HKIMrauo1ed2SOgoFGMS1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Pnpad/btsqoefkl7A/HKIMrauo1ed2SOgoFGMS1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Pnpad/btsqoefkl7A/HKIMrauo1ed2SOgoFGMS1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPnpad%2Fbtsqoefkl7A%2FHKIMrauo1ed2SOgoFGMS1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;381&quot; data-filename=&quot;add_two_numbers.png&quot; data-origin-width=&quot;359&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 자릿수가 하나의 노드로 이루어진 &lt;span style=&quot;background-color: #99cefa;&quot;&gt;두 리스트노드의 합을 리스트노드로 반환&lt;/span&gt;하는 문제이다.&lt;span style=&quot;background-color: #ee2323;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&lt;br /&gt;두 ListNode를 매개변수로 받는 addTwoNumbers메서드의 틀이 주어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Problem :&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1691415308276&quot; class=&quot;java&quot; style=&quot;background-color: #f6f7f8; color: #666666; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;class Solution {
    public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
        

    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 때, ListNode의 정의가 다음과 같이 주어진다.&lt;/p&gt;
&lt;pre id=&quot;code_1691415525922&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class ListNode {
    int val;
    ListNode next;
    ListNode() {}
    ListNode(int val) { this.val = val; }
    ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;풀이는&lt;span&gt; addTwoNumbers&lt;/span&gt;메서드에 작성하면 된다.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Solution :&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;두 숫자 노드의 합을 구해 ListNode로 반환하는 &lt;span style=&quot;background-color: #99cefa;&quot;&gt;addTwoNumbers 메서드를 콜백 형태로 구현&lt;/span&gt;한다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;1. 두 숫자 노드의 합을 구한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 이 때, 10으로 나눈 몫이 자리올림수가 된다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;2. 만약 두 노드 다 null이면 null을 반환하고 콜백함수를 빠져나간다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;3. 두 노드 중 하나라도 null이 아니면 &lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;ListNode(int val, ListNode next) 생성자를 이용하여 ListNode&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;를 반환한다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; 1) 현재 노드의 값(val) 은 두 숫자 노드 합의 몫이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;&amp;nbsp; &amp;nbsp; 2) 다음 노드(next)는 &lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;addTwoNumbers 메서드를&lt;/span&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;콜백으로 이용한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 이 때, 콜백함수 addTwoNumbers에서 다음 노드의 합을 구할 수 있도록&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 매개 변수로 주어진 두 ListNode의 다음 노드를 전달한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 다음 노드가 없으면 null값이 전달된다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - 전달 될 두 노드 중 하나에만 앞선 자리올림수를 넘겨 합해주면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1691415308279&quot; class=&quot;java&quot; style=&quot;background-color: #f6f7f8; color: #666666; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public ListNode addTwoNumbers(ListNode l1, ListNode l2) {

    // 두 노드의 합과 자리올림수를 구한다.
    int sum = ((l1 != null) ? l1.val : 0) + ((l2 != null) ? l2.val : 0);
    int carry = sum / 10;

    // 만약 이번 두 노드 모두 null이면 null을 반환하고 콜백 메서드를 빠져나간다.
    if (l1 == null &amp;amp;&amp;amp; l2 == null) return null;

    // 두 노드 중 하나라도 null이 아니면
    // 이번 값(val)은 두 노드의 합의 몫으로 하고
    // 다음 연결된 노드는 콜백 형태로 구한다.
    // (이 때 자리 올림 수는 두 다음 노드 중 하나에만 더하면 된다.)
    return new ListNode(
        sum % 10, // val
        addTwoNumbers(getNextNode(l1, carry), getNextNode(l2, 0)) // next
    );
}

// 다음 노드 구하기
private ListNode getNextNode(ListNode l, int carry) {

    // 지금 노드 및 다음 노드가 null이 아니면 자리올림수를 더한 다음 노드를 반환한다.
    if (l != null &amp;amp;&amp;amp; l.next != null) {
        l.next.val += carry;
        return l.next;
    }

    // 둘 다 null이고 자리올림수도 없으면 null을 반환한다.
    if (carry == 0) return null;

    // 둘 다 null이지만 자리올림수가 있으면 이 값으로 다음 노드를 만들어 반환한다.
    return new ListNode(carry);

}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;TestCase:&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1691415308290&quot; class=&quot;java&quot; style=&quot;background-color: #f6f7f8; color: #666666; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;Input: l1 = [2,4,3], l2 = [5,6,4]
Output: [7,0,8]

Input: l1 = [0], l2 = [0]
Output: [0]

Input: l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
Output: [8,9,9,9,0,0,0,1]&lt;/code&gt;&lt;/pre&gt;</description>
      <category>KR/코딩테스트</category>
      <category>LeetCode</category>
      <category>Linked</category>
      <category>LinkedList</category>
      <category>Medium</category>
      <category>리트코드</category>
      <category>릿코드</category>
      <category>미디엄</category>
      <category>코딩테스트</category>
      <category>코테</category>
      <author>개발개</author>
      <guid isPermaLink="true">https://the-dev.tistory.com/92</guid>
      <comments>https://the-dev.tistory.com/92#entry92comment</comments>
      <pubDate>Mon, 7 Aug 2023 22:58:10 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode/EASY] 242. Valid Anagram : 문제&amp;amp;풀이</title>
      <link>https://the-dev.tistory.com/91</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;454&quot; data-origin-height=&quot;412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhE8Ox/btsp2i3YSZz/C4xs4KGOoNvsNYSgtADEQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhE8Ox/btsp2i3YSZz/C4xs4KGOoNvsNYSgtADEQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhE8Ox/btsp2i3YSZz/C4xs4KGOoNvsNYSgtADEQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhE8Ox%2Fbtsp2i3YSZz%2FC4xs4KGOoNvsNYSgtADEQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;363&quot; data-origin-width=&quot;454&quot; data-origin-height=&quot;412&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;주어진&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;두 문자열 s와 t가 애너그램 관계인지 여부&lt;/span&gt;를 반환하는 문제이다.&lt;span style=&quot;background-color: #ee2323;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;String s와 t를 매개변수로 받는 isAnagram메서드의 틀이 주어진다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Problem :&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1691315762860&quot; style=&quot;background-color: #f6f7f8; color: #666666; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;class Solution {
    public boolean isAnagram(String s, String t) {

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;풀이는&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;isAnagram&amp;nbsp;&lt;/span&gt;메서드에 작성하면 된다.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Solution :&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;두 문자열의 길이가 다르면 애너그램 관계일 수 없&lt;/span&gt;으므로, false를 사전 반환한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;알파벳 길이(26)의 숫자 배열을 선언&lt;/span&gt;하고,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; 첫번째 문자열 s의 각 알파벳을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;Ascii 코드표를 활용&lt;/span&gt;하여 배열에 카운팅한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; ('a'는 Ascii코드 상 97에 해당하지만,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;메모리 사용 감소를 위해 - 'a'를 하게 되면 0번 인덱스에 위치&lt;/span&gt;시킬 수 있다.)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. 두번째 문자열 t를 2번과 동일한 방법으로 카운팅 다운을 해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; 1)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;카운팅 다운할 대상이 없으면 애너그램 관계가 아니&lt;/span&gt;므로 false를 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; 2) 대상이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;있으면 카운팅 다운&lt;/span&gt;을 진행한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4. 문자열 끝까지 정상적으로 반복했다면 애너그램 관계이다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1691315762884&quot; style=&quot;background-color: #f6f7f8; color: #666666; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public boolean isAnagram(String s, String t) {

    // 두 문자열의 길이가 다르면 애너그램일 수 없다.
    if (s.length() != t.length()) return false;

    // 알파벳 배열을 이용한 문자열 s 카운팅
    int[] alphabet = new int[26];
    for(char c : s.toCharArray()) {
        alphabet[c - 'a'] += 1;
    }

    // 문자열 s와 t 비교
    for(char c : t.toCharArray()) {
        if(alphabet[c - 'a'] &amp;lt;= 0) {
            return false;
        }
        alphabet[c - 'a'] -= 1;
    }

    return true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;TestCase :&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1691315762898&quot; style=&quot;background-color: #f6f7f8; color: #666666; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;Input: s = &quot;anagram&quot;, t = &quot;nagaram&quot;
Output: true

Input: s = &quot;rat&quot;, t = &quot;car&quot;
Output: false&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>KR/코딩테스트</category>
      <category>Easy</category>
      <category>LeetCode</category>
      <category>리트코드</category>
      <category>릿코드</category>
      <category>아나그램</category>
      <category>이지</category>
      <category>코딩테스트</category>
      <category>코테</category>
      <author>개발개</author>
      <guid isPermaLink="true">https://the-dev.tistory.com/91</guid>
      <comments>https://the-dev.tistory.com/91#entry91comment</comments>
      <pubDate>Sun, 6 Aug 2023 18:56:52 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode/MEDIUM] 3. Longest Substring Without Repeating Characters (JAVA) : 문제&amp;amp;풀이</title>
      <link>https://the-dev.tistory.com/89</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3_logo.png&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tH36H/btsoRDmp8wW/uP56ipR81xGMsGRyP8jNH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tH36H/btsoRDmp8wW/uP56ipR81xGMsGRyP8jNH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tH36H/btsoRDmp8wW/uP56ipR81xGMsGRyP8jNH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtH36H%2FbtsoRDmp8wW%2FuP56ipR81xGMsGRyP8jNH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;462&quot; height=&quot;416&quot; data-filename=&quot;3_logo.png&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;416&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #c1bef9;&quot;&gt;반복없이 가장 긴 문자열의 길이&lt;/span&gt;를리스트로 반환하는 문제이다.&lt;span style=&quot;background-color: #ee2323;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;String을 매개변수로 받는 lengthOfLongestSubstring메서드의 틀이 주어진다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Problem :&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1690211899816&quot; class=&quot;java&quot; style=&quot;background-color: #f6f7f8; color: #666666; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public class LongestSubstring {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public int lengthOfLongestSubstring(String s) {

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;풀이는&lt;span&gt; lengthOfLongestSubstring&lt;/span&gt;&amp;nbsp;메서드에 작성하면 된다.&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Solution 1: HashSet을 사용하는 방법&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;1. 왼쪽/오른쪽 포인터, 최대 길이 값을 담을 int 변수를 초기화 한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 고유문자를 담을 Set 변수을 초기화한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;2. 오른쪽 포인터가 문자열 끝에 닿을 때까지 반복할 때,&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 1) 오른쪽 포인터의 문자가 &lt;span style=&quot;background-color: #c1bef9;&quot;&gt;고유문자Set에 없으면, 추가&lt;/span&gt;하고 포인터를 하나 늘린다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 이 때, 현재까지의 최대 길이와 고유문자 길이 Set의 길이 중 더 긴 것을 &lt;span style=&quot;background-color: #c1bef9;&quot;&gt;최대 길이로 갱신&lt;/span&gt;한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 2) 만약 오른쪽 포인터의 문자가 고유문자Set에 &lt;span style=&quot;background-color: #c1bef9;&quot;&gt;있었다면 왼쪽 포인터의 문자를 Set에서 제거&lt;/span&gt;한다.&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (오른쪽 포인터는 바뀌지 않기 때문에 &lt;u&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;중복이 발생한 오른쪽 포인터의 글자를 지울 때까지 왼쪽 포인터가 이동&lt;/span&gt;&lt;/u&gt;함)&lt;/p&gt;
&lt;pre id=&quot;code_1690211899825&quot; class=&quot;java&quot; style=&quot;background-color: #f6f7f8; color: #666666; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public int lengthOfLongestSubstring(String s) {

    // init
    int left = 0, right = 0, max = 0;
    Set&amp;lt;Character&amp;gt; uniqueSet = new HashSet&amp;lt;&amp;gt;();

    // loop
    while (right &amp;lt; s.length()) {
        if (!uniqueSet.contains(s.charAt(right))) {
            uniqueSet.add(s.charAt(right++));
            max = Math.max(max, uniqueSet.size());
        } else {
            uniqueSet.remove(s.charAt(left++));
        }
    }

    return max;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들면, &lt;b&gt;abbcba&lt;/b&gt;는 다음과 같은 순서를 거쳐 &lt;b&gt;max = 3&lt;/b&gt;을 반환하게 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;621&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dbsgMm/btspxqGNscu/X6WtAF9wrKIUz5GseZlDU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dbsgMm/btspxqGNscu/X6WtAF9wrKIUz5GseZlDU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dbsgMm/btspxqGNscu/X6WtAF9wrKIUz5GseZlDU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdbsgMm%2FbtspxqGNscu%2FX6WtAF9wrKIUz5GseZlDU1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;621&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;621&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Solution 2: Map을 사용하는 방법&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;1. 주어진 문자열이 없으면 최대 길이 0을 반환한다.&lt;br /&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 주어진 문자열이 한 글자이면 1을 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;2. 그 이상인 경우, 최대 길이가 1이상이므로&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 고유문자별 인덱스Map에 첫번째 글자를 넣고, 왼쪽/오른쪽 포인터를 각각 0과 1에 둔다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;3. &lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot;&gt;오른쪽 포인터가 문자열 끝에 닿을 때까지 반복할 때,&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 1) Map에 오른쪽 포인터의 &lt;span style=&quot;background-color: #c1bef9;&quot;&gt;문자(key)가 있고, 그 인덱스(value)가 왼쪽 포인터 이상&lt;/span&gt;인 경우,&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (Map에 저장된 문자의 인덱스와 왼쪽 포인터를 비교하는 이유는 &lt;u&gt;&lt;span style=&quot;color: #8a3db6;&quot;&gt;이미 중복으로 열외했던 자릿수는 제외하기 위함&lt;/span&gt;&lt;/u&gt;)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 왼쪽 포인터를 Map에 &lt;span style=&quot;background-color: #c1bef9;&quot;&gt;해당 문자의 인덱스 다음 자리까지 이동&lt;/span&gt;한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 2) 그 외는 새로운 문자가 추가된 것이므로,&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 지금까지의 최대 길이와 현재 문자열(왼쪽포인터~오른쪽포인터) 길이 중 &lt;span style=&quot;background-color: #c1bef9;&quot;&gt;더 긴 것을 최대 길이로 갱신&lt;/span&gt;한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; 3) 현재의 대상 문자를 현재 인덱스와 함께 Map에 추가 혹은 갱신하고, 오른쪽 포인터를 한 칸 더 이동한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1690212266153&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public int lengthOfLongestSubstring(String s) {

    // in case no string given
    if (s == null || s.length() == 0) return 0;
    if (s.length() == 1) return 1;

    // init variables
    int max = 1;
    int left = 0, right = 1;
    Map&amp;lt;Character, Integer&amp;gt; uniqueCharMap = new HashMap&amp;lt;&amp;gt;();
    uniqueCharMap.put(s.charAt(left), left);
    
    while(right &amp;lt; s.length()) {
        char c = s.charAt(right);
        if (uniqueCharMap.containsKey(c) &amp;amp;&amp;amp; uniqueCharMap.get(c) &amp;gt;= left) {
            left = uniqueCharMap.get(c) + 1;
        } else {
            max = Math.max(max, (right - left + 1));
        }
        uniqueCharMap.put(c, right);
        right++;
    }

    return max;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot;&gt;예를 들면,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;abbcba&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot;&gt;는 다음과 같은 순서를 거쳐&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;max = 3&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot;&gt;을 반환하게 된다.&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;627&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGloQt/btspE4J3m8b/lPFAKuAODJMp1Nky841NB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGloQt/btspE4J3m8b/lPFAKuAODJMp1Nky841NB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGloQt/btspE4J3m8b/lPFAKuAODJMp1Nky841NB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGloQt%2FbtspE4J3m8b%2FlPFAKuAODJMp1Nky841NB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;627&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;627&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;TestCase :&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1690211899835&quot; class=&quot;java&quot; style=&quot;background-color: #f6f7f8; color: #666666; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;abcabcbb
bbbbb
pwwkew
abcadertb
a
abbcba
abcba&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;위 테스트 케이스의 Output은 다음과 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1690211899850&quot; class=&quot;java&quot; style=&quot;background-color: #f6f7f8; color: #666666; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;3
1
3
7
1
3
3&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>KR/코딩테스트</category>
      <category>LeetCode</category>
      <category>Medium</category>
      <category>릿코드</category>
      <category>미디엄</category>
      <category>코딩테스트</category>
      <category>코테</category>
      <author>개발개</author>
      <guid isPermaLink="true">https://the-dev.tistory.com/89</guid>
      <comments>https://the-dev.tistory.com/89#entry89comment</comments>
      <pubDate>Tue, 1 Aug 2023 00:35:56 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode/MEDIUM] 49. Group Anagrams (JAVA) : 문제&amp;amp;풀이</title>
      <link>https://the-dev.tistory.com/61</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;303&quot; data-origin-height=&quot;303&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kPsvB/btq2pkxeINV/Koj2w4piwjHz4lgmTt3MRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kPsvB/btq2pkxeINV/Koj2w4piwjHz4lgmTt3MRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kPsvB/btq2pkxeINV/Koj2w4piwjHz4lgmTt3MRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkPsvB%2Fbtq2pkxeINV%2FKoj2w4piwjHz4lgmTt3MRK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;303&quot; height=&quot;303&quot; data-origin-width=&quot;303&quot; data-origin-height=&quot;303&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&lt;span style=&quot;background-color: #c1bef9;&quot;&gt;애너그램(철자 순서를 바꾼 말) 관계의 문자열끼리 묶어&lt;/span&gt; 리스트로 반환하는 문제이다.&lt;span style=&quot;background-color: #ee2323;&quot;&gt;&lt;br&gt;&lt;/span&gt;&amp;nbsp;&lt;br&gt;String 배열을 매개변수로 받는&amp;nbsp;groupAnagrams&amp;nbsp;메서드의 틀이 주어진다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Problem :&lt;/b&gt;&lt;/h3&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;Java&quot; data-ke-language=&quot;Java&quot;&gt;&lt;code&gt;public class GroupAnagrams {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public List&amp;lt;List&amp;lt;String&amp;gt;&amp;gt; groupAnagrams(String[] strs) {

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;풀이는 &lt;span style=&quot;color: #333333;&quot;&gt;groupAnagrams&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;메서드에 작성하면 된다.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Solution :&lt;/b&gt;&lt;/h3&gt;&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;1. 주어진 문자열 배열로 반복문을 돌며 &lt;span style=&quot;background-color: #c1bef9;&quot;&gt;애너그램 맵&lt;/span&gt;에 추가한다.&lt;br&gt;2. 이 때, 애너그램 &lt;span style=&quot;background-color: #c1bef9;&quot;&gt;맵의 키&lt;/span&gt;는 해당 문자열을&lt;span style=&quot;background-color: #c1bef9;&quot;&gt; 정렬한 문자&lt;/span&gt;(문자열이 'cat'이라면 키는 ‘act')로 한다.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1) 애너그램 맵에 동일한 키가 없는 경우, 해당 키로 문자열이 담긴 리스트를 삽입한다.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2) 애너그램 맵에 이미 동일한 키가 있는 경우, 해당 키의 리스트에 문자열을 추가한다.&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;909&quot; data-origin-height=&quot;412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beTOGB/btsnbJbYBZ6/fExvp2nlx2O7hM8gf1KYsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beTOGB/btsnbJbYBZ6/fExvp2nlx2O7hM8gf1KYsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beTOGB/btsnbJbYBZ6/fExvp2nlx2O7hM8gf1KYsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeTOGB%2FbtsnbJbYBZ6%2FfExvp2nlx2O7hM8gf1KYsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;909&quot; height=&quot;412&quot; data-origin-width=&quot;909&quot; data-origin-height=&quot;412&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;br&gt;&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;Java&quot; data-ke-language=&quot;Java&quot;&gt;&lt;code&gt;public class GroupAnagrams {

	public List&amp;lt;List&amp;lt;String&amp;gt;&amp;gt; groupAnagrams(String[] strs) {

		// 주어진 문자열 배열이 없거나 비어있는 경우
		if(strs == null || strs.length == 0) return new ArrayList&amp;lt;&amp;gt;(new ArrayList&amp;lt;&amp;gt;());

		// 애너그램 관계끼리 담을 맵을 선언
		Map&amp;lt;String, List&amp;lt;String&amp;gt;&amp;gt; anagramMap = new HashMap&amp;lt;&amp;gt;();

		// 문자열 배열로 반복문
		for(String str : strs){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
			// 문자열을 정렬하여 애너그램 맵의 키 생성
			char[] charArray = str.toCharArray(); // ['c','a',t']
			Arrays.sort(charArray); // ['a','c','t']
			String key = String.valueOf(charArray); // &quot;act&quot;

			// 애너그램 맵에 키가 있으면 해당 값에 추가하고, 없으면 새로 삽입
			if(anagramMap.containsKey(key)){
				anagramMap.get(key).add(str);
			}else{
				anagramMap.put(key, new ArrayList&amp;lt;&amp;gt;(Arrays.asList(str)));
			}
		}

		// 애너그램 맵에서 키위를 제외한 문자열 그룹을 리스트로 반환
		return new ArrayList&amp;lt;&amp;gt;(anagramMap.values());
	}
}&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&lt;br&gt;&lt;/p&gt;&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Sample(Test) :&lt;/b&gt;&lt;/h3&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;Java&quot; data-ke-language=&quot;Java&quot;&gt;&lt;code&gt;public class GroupAnagrams {

	public List&amp;lt;List&amp;lt;String&amp;gt;&amp;gt; groupAnagrams(String[] strs) {

		// 주어진 문자열 배열이 없거나 비어있는 경우
		if(strs == null || strs.length == 0) return new ArrayList&amp;lt;&amp;gt;(new ArrayList&amp;lt;&amp;gt;());

		// 애너그램 관계끼리 담을 맵을 선언
		Map&amp;lt;String, List&amp;lt;String&amp;gt;&amp;gt; anagramMap = new HashMap&amp;lt;&amp;gt;();

		// 문자열 배열로 반복문
		for(String str : strs){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
			// 문자열을 정렬하여 애너그램 맵의 키 생성
			char[] charArray = str.toCharArray(); // ['c','a',t']
			Arrays.sort(charArray); // ['a','c','t']
			String key = String.valueOf(charArray); // &quot;act&quot;

			// 애너그램 맵에 키가 있으면 해당 값에 추가하고, 없으면 새로 삽입
			if(anagramMap.containsKey(key)){
				anagramMap.get(key).add(str);
			}else{
				anagramMap.put(key, new ArrayList&amp;lt;&amp;gt;(Arrays.asList(str)));
			}
		}

		// 애너그램 맵에서 키위를 제외한 문자열 그룹을 리스트로 반환
		return new ArrayList&amp;lt;&amp;gt;(anagramMap.values());
	}

	public static void main(String[] args) {
		String[] strs = {&quot;eat&quot;,&quot;tea&quot;,&quot;tan&quot;,&quot;ate&quot;,&quot;nat&quot;,&quot;bat&quot;};

		GroupAnagrams g = new GroupAnagram();
		g.groupAnagrams(strs);
	}
}&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;위 테스트 코드의 Input과 Output은 다음과 같다.&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;HTML&quot; data-ke-language=&quot;HTML&quot;&gt;&lt;code&gt;Input: strs = [&quot;eat&quot;,&quot;tea&quot;,&quot;tan&quot;,&quot;ate&quot;,&quot;nat&quot;,&quot;bat&quot;]
Output: [[&quot;bat&quot;],[&quot;nat&quot;,&quot;tan&quot;],[&quot;ate&quot;,&quot;eat&quot;,&quot;tea&quot;]]&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>KR/코딩테스트</category>
      <category>LeetCode</category>
      <category>Medium</category>
      <category>릿코드</category>
      <category>미디엄</category>
      <category>알고리즘</category>
      <category>자료구조</category>
      <category>코딩테스트</category>
      <author>개발개</author>
      <guid isPermaLink="true">https://the-dev.tistory.com/61</guid>
      <comments>https://the-dev.tistory.com/61#entry61comment</comments>
      <pubDate>Tue, 11 Jul 2023 22:28:13 +0900</pubDate>
    </item>
    <item>
      <title>[성능] Debounce(디바운스) vs Throttle(쓰로틀)</title>
      <link>https://the-dev.tistory.com/88</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;logo.png&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ce18GY/btrvvcc4thf/odcgQG7ES4lJGheFMzm9r1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ce18GY/btrvvcc4thf/odcgQG7ES4lJGheFMzm9r1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ce18GY/btrvvcc4thf/odcgQG7ES4lJGheFMzm9r1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fce18GY%2Fbtrvvcc4thf%2FodcgQG7ES4lJGheFMzm9r1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;398&quot; data-filename=&quot;logo.png&quot; data-origin-width=&quot;444&quot; data-origin-height=&quot;442&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트 제어의 두 방식,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffd9b3;&quot;&gt;&lt;b&gt;디바운스(Debounce)&lt;/b&gt;&lt;/span&gt;와&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #b3e6ff;&quot;&gt;&lt;b&gt;쓰로틀(Throttle)&lt;/b&gt;&lt;/span&gt;에 대해 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;언제 이벤트 제어가 필요할까?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;짧은 시간 내에 수많은 이벤트가 발생하지만, &lt;span style=&quot;background-color: #e6ffcc;&quot;&gt;발생하는 모든 이벤트에 대한 처리가 필요하진 않은 경우&lt;/span&gt;에 이벤트 제어 방식을 적용함으로써 &lt;span style=&quot;background-color: #e6ffcc;&quot;&gt;처리량을 조절&lt;/span&gt;할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 마우스 움직임이나 타이핑, 또는 스크롤링 등에 의해 발생하는 이벤트가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 상황에서 발생하는 모든 이벤트를 처리하려고 하면, 실제 사용자가 체감도 하지 못할 양의 이벤트 처리를 위해 다음과 같은 &lt;b&gt;&lt;span style=&quot;background-color: #e6ffcc;&quot;&gt;문제점&lt;/span&gt;&lt;/b&gt;이 나타날 수 있습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;서버/클라이언트의 리소스 낭비&lt;/li&gt;
&lt;li&gt;서비스 성능 저하&lt;/li&gt;
&lt;li&gt;사용자 경험 저하&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로, 이벤트 제어를 통해 처리량을 조절하게 되면 다음과 같은 &lt;b&gt;&lt;span style=&quot;background-color: #e6ffcc;&quot;&gt;효과&lt;/span&gt;&lt;/b&gt;를 기대할 수 있습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;서버/클라이언트의 리소스 절약&lt;/li&gt;
&lt;li&gt;비용 절감&lt;/li&gt;
&lt;li&gt;사용자 경험 개선&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;이벤트 제어 방식&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffd9b3;&quot;&gt;&lt;b&gt;1. 디바운스(Debounce)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연속적으로 발생하는 이벤트들을 그룹화하여, 해당 &lt;span style=&quot;background-color: #ffd9b3;&quot;&gt;이벤트 그룹이 일시정지가 되었다고 판단되는 시점이 지나면 최초 또는 최후의 이벤트에 대해서만 처리하는 방식&lt;/span&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디바운스 방식은 &lt;span style=&quot;background-color: #ffd9b3;&quot;&gt;컴포넌트 리사이징(component resizing)&lt;/span&gt; 이벤트와 같이 마지막 액션에 대한 처리가 중요한 경우에 활용할 수 있습니다. 즉, 자동완성이나 무한스크롤링 같이 계속해서 타이핑하거나 스크롤링하는 경우 이벤트 콜백이 발생하지 않아 사용자가 동작하지 않는다고 느낄 수 있기 때문에 부적합합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #b3e6ff;&quot;&gt;&lt;b&gt;2. 쓰로틀(Throttle)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #b3e6ff;&quot;&gt;이벤트를 일정 주기마다 처리함으로써 이벤트를 제어하는 방식&lt;/span&gt;입니다. 단순히 사용자의 움직임이 멈추었을 때만 동작하는 것이 아니라, 마지막 함수가 호출된 후 일정 시간 이내에 재호출되지 않음으로써, 처리량은 조절되면서 사용자가 서비스의 연속성도 느낄 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쓰로틀 방식은 &lt;span style=&quot;background-color: #b3e6ff;&quot;&gt;자동완성(Auto Complete)&lt;/span&gt;이나 &lt;span style=&quot;background-color: #b3e6ff;&quot;&gt;무한스크롤링(Infinite Scroll)&lt;/span&gt; 기능에 적용할 수 있습니다. 계속해서 타이핑하거나 스크롤링하더라도 일정 주기마다 이벤트 콜백이 발생하기 때문에 사용자는 해당 기능이 계속해서 동작하고 있다고 느끼게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;정리하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffd9b3;&quot;&gt;디바운싱(Debouncing)&lt;/span&gt;과 &lt;span style=&quot;background-color: #b3e6ff;&quot;&gt;쓰로틀링(Throttling)&lt;/span&gt;을 이용한 발생 이미지 처리 빈도를 이미지로 표현하면 아래와 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image1.png&quot; data-origin-width=&quot;957&quot; data-origin-height=&quot;399&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dS1pl9/btrvrA5Ji7U/plTi4dNKm7AcFWEjITfW1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dS1pl9/btrvrA5Ji7U/plTi4dNKm7AcFWEjITfW1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dS1pl9/btrvrA5Ji7U/plTi4dNKm7AcFWEjITfW1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdS1pl9%2FbtrvrA5Ji7U%2FplTi4dNKm7AcFWEjITfW1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;957&quot; height=&quot;399&quot; data-filename=&quot;image1.png&quot; data-origin-width=&quot;957&quot; data-origin-height=&quot;399&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;reference:&amp;nbsp;&lt;/b&gt;&lt;a href=&quot;https://webclub.tistory.com/607&quot;&gt;https://webclub.tistory.com/607&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1646843306657&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;디바운스(Debounce)와 스로틀(Throttle ) 그리고 차이점&quot; data-og-description=&quot;Throttle,&amp;nbsp;Debounce &amp;amp; Difference 스로틀(Throttle) 과 디바운스(Debounce) 란 무엇일까? 이 두 가지 방법 모두 DOM 이벤트를 기반으로 실행하는 자바스크립트를 성능상의 이유로 JS의 양적인 측면, 즉 이벤트(ev.&quot; data-og-host=&quot;webclub.tistory.com&quot; data-og-source-url=&quot;https://webclub.tistory.com/607&quot; data-og-url=&quot;https://webclub.tistory.com/607&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/caMKGh/hyNFICGrhs/QgiCht6FVbpDAlmk2bXRV1/img.png?width=661&amp;amp;height=133&amp;amp;face=0_0_661_133,https://scrap.kakaocdn.net/dn/cgLC05/hyNFyUnYhd/3VN1kgu5KzfKqlTKZSzAy1/img.png?width=661&amp;amp;height=133&amp;amp;face=0_0_661_133,https://scrap.kakaocdn.net/dn/SJE2r/hyNFI3LU5r/GC8dcQ4eMlVosVMEg8eXC0/img.jpg?width=589&amp;amp;height=545&amp;amp;face=236_184_363_322&quot;&gt;&lt;a href=&quot;https://webclub.tistory.com/607&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://webclub.tistory.com/607&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/caMKGh/hyNFICGrhs/QgiCht6FVbpDAlmk2bXRV1/img.png?width=661&amp;amp;height=133&amp;amp;face=0_0_661_133,https://scrap.kakaocdn.net/dn/cgLC05/hyNFyUnYhd/3VN1kgu5KzfKqlTKZSzAy1/img.png?width=661&amp;amp;height=133&amp;amp;face=0_0_661_133,https://scrap.kakaocdn.net/dn/SJE2r/hyNFI3LU5r/GC8dcQ4eMlVosVMEg8eXC0/img.jpg?width=589&amp;amp;height=545&amp;amp;face=236_184_363_322');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;디바운스(Debounce)와 스로틀(Throttle ) 그리고 차이점&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Throttle,&amp;nbsp;Debounce &amp;amp; Difference 스로틀(Throttle) 과 디바운스(Debounce) 란 무엇일까? 이 두 가지 방법 모두 DOM 이벤트를 기반으로 실행하는 자바스크립트를 성능상의 이유로 JS의 양적인 측면, 즉 이벤트(ev.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;webclub.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>KR/Tool,ETC</category>
      <category>API</category>
      <category>디바운스</category>
      <category>디바운싱</category>
      <category>성능</category>
      <category>쓰로틀</category>
      <category>쓰로틀링</category>
      <category>이벤트</category>
      <category>제어</category>
      <category>제한</category>
      <category>처리</category>
      <author>개발개</author>
      <guid isPermaLink="true">https://the-dev.tistory.com/88</guid>
      <comments>https://the-dev.tistory.com/88#entry88comment</comments>
      <pubDate>Thu, 10 Mar 2022 01:39:47 +0900</pubDate>
    </item>
    <item>
      <title>[JAVA] Nested Static Class (스태틱 중첩 클래스)</title>
      <link>https://the-dev.tistory.com/87</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;logo.png&quot; data-origin-width=&quot;447&quot; data-origin-height=&quot;448&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6gaHj/btrsMAHF20f/zUPS02JKriZyF6siMGapPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6gaHj/btrsMAHF20f/zUPS02JKriZyF6siMGapPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6gaHj/btrsMAHF20f/zUPS02JKriZyF6siMGapPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6gaHj%2FbtrsMAHF20f%2FzUPS02JKriZyF6siMGapPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;401&quot; data-filename=&quot;logo.png&quot; data-origin-width=&quot;447&quot; data-origin-height=&quot;448&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정적 멤버 클래스(정적 중첩 클래스)와 내부 클래스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &lt;u&gt;&lt;b&gt;내부 클래스가 static인지 여부&lt;/b&gt;&lt;/u&gt;에 따른 차이점을 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;Inner Class&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;VS &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;Nested Static Class&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;특징 비교&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;Inner Class&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;non-static nested class (스태틱이 아닌 중첩 클래스), non-static member class(비정적 멤버 클래스)라고도 한다.&lt;/li&gt;
&lt;li&gt;외부 클래스의 s&lt;b&gt;tatic 멤버/메서드&lt;/b&gt;와 &lt;b&gt;non-static 멤버/메서드&lt;/b&gt;에 모두 &lt;b&gt;직접 접근 가능&lt;/b&gt;하다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;외부 클래스의 인스턴스를 생성해야만 인스턴스 생성이 가능&lt;/b&gt;하다. (외부참조: 메모리 누수 가능성)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;Nested Static Class&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;static member class (정적 멤버 클래스)라고도 한다.&lt;/li&gt;
&lt;li&gt;외부 클래스의 &lt;b&gt;static 멤버/메서드만 직접 접근이 가능&lt;/b&gt;하다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;외부 클래스의 인스턴스를 생성할 필요가 없다&lt;/b&gt;. (독립적)&lt;/li&gt;
&lt;li&gt;static이 붙어 있지만, 각각 생성한 두 객체는 &lt;b&gt;다른 참조&lt;/b&gt;를 갖는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adfit&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;728x90&lt;/div&gt;
    &lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display: none;&quot; data-ad-unit=&quot;DAN-eR9EfHNfRwHZ1bUZ&quot; data-ad-width=&quot;728px&quot; data-ad-height=&quot;90px&quot;&gt;&lt;/ins&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;예제 코드&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1644333301274&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class OuterClass {

    // static
    private static String author = &quot;DEVDOG&quot;;
    private static String sayHello() {
        return &quot;Hello! This is &quot;;
    }

    // non-static
    private String blogUrl = &quot;https://the-dev.tistory.com&quot;;
    private String welcome() {
        return &quot;Welcome to the blog: &quot;;
    }

    /**
     * Non-static nested class (a.k.a. inner class)
     * Both static and non-static members of Outer class are accessible
     */
    class InnerClass {
        void print() {
            System.out.println(&quot;---InnerClass.print---&quot;);
            System.out.println(sayHello() + author);
            System.out.println(welcome() + blogUrl);
        }
    }
    /**
    * static nested class
    * Only static members of Outer class are directly accessible
    */ 
    static class NestedStaticClass {
        void print(){
            System.out.println(&quot;---NestedStaticClass.print---&quot;);
            System.out.println(sayHello() + author);
        }
    }
}

class Main {
    public static void main(String[] args) {

        // have to create Outer class instance then Inner class instance (external reference)
        OuterClass.InnerClass innerClass = new OuterClass().new InnerClass();
        innerClass.print();

        // Outer class instance not needed
        OuterClass.NestedStaticClass nestedStaticClass = new OuterClass.NestedStaticClass();
        nestedStaticClass.print();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;예제 코드 출력 화면&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1644333341857&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;---InnerClass.print---
Hello! This is DEVDOG
Welcome to the blog: https://the-dev.tistory.com
---NestedStaticClass.print---
Hello! This is DEVDOG&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;reference:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://geeksforgeeks.org/static-class-in-java/&quot;&gt;https://geeksforgeeks.org/static-class-in-java/&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1644333720672&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Static class in Java - GeeksforGeeks&quot; data-og-description=&quot;A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.&quot; data-og-host=&quot;www.geeksforgeeks.org&quot; data-og-source-url=&quot;https://geeksforgeeks.org/static-class-in-java/&quot; data-og-url=&quot;https://www.geeksforgeeks.org/static-class-in-java/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/qgovp/hyNmx2u8oz/n9U27M1XtoF9GoWukvu7g0/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200&quot;&gt;&lt;a href=&quot;https://geeksforgeeks.org/static-class-in-java/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://geeksforgeeks.org/static-class-in-java/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/qgovp/hyNmx2u8oz/n9U27M1XtoF9GoWukvu7g0/img.png?width=200&amp;amp;height=200&amp;amp;face=0_0_200_200');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Static class in Java - GeeksforGeeks&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.geeksforgeeks.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>KR/Java</category>
      <category>Class</category>
      <category>Inner</category>
      <category>member</category>
      <category>nested</category>
      <category>outer</category>
      <category>static</category>
      <category>내부</category>
      <category>스태틱</category>
      <category>중첩</category>
      <category>클래스</category>
      <author>개발개</author>
      <guid isPermaLink="true">https://the-dev.tistory.com/87</guid>
      <comments>https://the-dev.tistory.com/87#entry87comment</comments>
      <pubDate>Wed, 9 Feb 2022 00:22:40 +0900</pubDate>
    </item>
    <item>
      <title>[git 명령어 2] : branch, merge, reset, rebase, tag (깃)</title>
      <link>https://the-dev.tistory.com/86</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;git2.png&quot; data-origin-width=&quot;447&quot; data-origin-height=&quot;447&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bP4ggq/btrsfWi3pf4/7YSEEnKrFVBIYJp4l8bDEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bP4ggq/btrsfWi3pf4/7YSEEnKrFVBIYJp4l8bDEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bP4ggq/btrsfWi3pf4/7YSEEnKrFVBIYJp4l8bDEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbP4ggq%2FbtrsfWi3pf4%2F7YSEEnKrFVBIYJp4l8bDEk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;400&quot; data-filename=&quot;git2.png&quot; data-origin-width=&quot;447&quot; data-origin-height=&quot;447&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;#branch&amp;nbsp; &amp;nbsp;#merge&amp;nbsp; &amp;nbsp;#reset&amp;nbsp; &amp;nbsp;#rebase&amp;nbsp; &amp;nbsp;#tag&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;새로운 브랜치 생성하기&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;- branch 명령어&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;- 새로운 브랜치를 생성하고, &lt;b&gt;HEAD는 이동하지 않&lt;/b&gt;는다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1643730228325&quot; class=&quot;git properties&quot; data-ke-language=&quot;git&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git branch [브랜치명]

#e.g.
git branch develop
git branch feature/login&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;11.png&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oBGJk/btrsi9oFOmz/dF7MlR3c7CXpfSmzkCiiXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oBGJk/btrsi9oFOmz/dF7MlR3c7CXpfSmzkCiiXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oBGJk/btrsi9oFOmz/dF7MlR3c7CXpfSmzkCiiXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoBGJk%2Fbtrsi9oFOmz%2FdF7MlR3c7CXpfSmzkCiiXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;580&quot; height=&quot;131&quot; data-filename=&quot;11.png&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;새로운 브랜치 생성하고 이동하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- checkout 명령어 + '&lt;b&gt;-b&lt;/b&gt;' 옵션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 새로운 브랜치를 생성하고, &lt;b&gt;HEAD도 이동&lt;/b&gt;한다.&lt;/p&gt;
&lt;pre id=&quot;code_1643730467974&quot; class=&quot;git properties&quot; data-ke-language=&quot;git&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git checkout -b [브랜치명]

#e.g.
git checkout -b develop
git checkout -b feature/login&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;12.png&quot; data-origin-width=&quot;993&quot; data-origin-height=&quot;292&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbNT5Q/btrsfWJ77Gu/Ln4uBeD6MPYKGjKZz2kssk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbNT5Q/btrsfWJ77Gu/Ln4uBeD6MPYKGjKZz2kssk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbNT5Q/btrsfWJ77Gu/Ln4uBeD6MPYKGjKZz2kssk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbNT5Q%2FbtrsfWJ77Gu%2FLn4uBeD6MPYKGjKZz2kssk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;660&quot; height=&quot;194&quot; data-filename=&quot;12.png&quot; data-origin-width=&quot;993&quot; data-origin-height=&quot;292&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;브랜치 삭제하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- checkout명령어 + '&lt;b&gt;-d&lt;/b&gt;' 옵션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 브랜치를 삭제하기 위해서는 HEAD가 다른 브랜치에 있어야 한다.&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1643731902389&quot; class=&quot;git properties&quot; data-ke-language=&quot;git&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git checkout -d [브랜치명]

#e.g.
git checkout -d feature/member&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;13.png&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;354&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Zv4Pi/btrscPEcdvB/EuVlHrJWBC3gScdKZKIt2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Zv4Pi/btrscPEcdvB/EuVlHrJWBC3gScdKZKIt2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Zv4Pi/btrscPEcdvB/EuVlHrJWBC3gScdKZKIt2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZv4Pi%2FbtrscPEcdvB%2FEuVlHrJWBC3gScdKZKIt2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;660&quot; height=&quot;236&quot; data-filename=&quot;13.png&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;354&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;브랜치 강제로 삭제하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- checkout명령어 + '&lt;b&gt;-D&lt;/b&gt;' 옵션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 전부 merge되지 않아 '-d' 옵션으로는 브랜치가 삭제 되지 않으면 강제 삭제 옵션을 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1643731979641&quot; class=&quot;git properties&quot; data-ke-language=&quot;git&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git checkout -D [브랜치명]

#e.g.
git checkout -D feature/login&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;14.png&quot; data-origin-width=&quot;973&quot; data-origin-height=&quot;394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/COit7/btrskvdVUR0/hG4wDXsqviRZSFEJMPwczK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/COit7/btrskvdVUR0/hG4wDXsqviRZSFEJMPwczK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/COit7/btrskvdVUR0/hG4wDXsqviRZSFEJMPwczK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCOit7%2FbtrskvdVUR0%2FhG4wDXsqviRZSFEJMPwczK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;660&quot; height=&quot;267&quot; data-filename=&quot;14.png&quot; data-origin-width=&quot;973&quot; data-origin-height=&quot;394&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;브랜치 병합하기 (머징)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- '&lt;b&gt;--ff'&lt;/b&gt;(fast-forward; 빨리감기)가 기본(default)이며, 병합된 두 브랜치의 커밋 내역이 하나로 통합된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- '&lt;b&gt;--no-ff&lt;/b&gt;'을 옵션으로 하면, 병합된 두 브랜치의 커밋 내역이 개별인 상태로 브랜치가 병합된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;(아래 이미지 참고)&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1643733017708&quot; class=&quot;git properties&quot; data-ke-language=&quot;git&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git merge [브랜치명]

#e.g.
git merge develop
git merge --no-ff develop&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1723&quot; data-origin-height=&quot;334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d4y2zG/btrsNxCvEKQ/4VhhWjo6edG28wHyyQF0X1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d4y2zG/btrsNxCvEKQ/4VhhWjo6edG28wHyyQF0X1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d4y2zG/btrsNxCvEKQ/4VhhWjo6edG28wHyyQF0X1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd4y2zG%2FbtrsNxCvEKQ%2F4VhhWjo6edG28wHyyQF0X1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1723&quot; height=&quot;334&quot; data-origin-width=&quot;1723&quot; data-origin-height=&quot;334&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;현재 브랜치를 특정 커밋으로 되돌리기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;reset 명령어 + '--hard' 옵션&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(HEAD이동 + Index업데이트 + WorkingDirectory업데이트)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 브랜치를 지정 커밋으로 옮긴다. &lt;br /&gt;checkout 명령어와 달리 해당 커밋 내용을 작업 폴더에도 반영한다.&lt;/p&gt;
&lt;pre id=&quot;code_1643733758294&quot; class=&quot;git properties&quot; data-ke-language=&quot;git&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git reset --hard [커밋ID]

#e.g.
git reset --hard HEAD~&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- rebase 명령어&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빨리 감기 병합&lt;/p&gt;
&lt;pre id=&quot;code_1643733956513&quot; class=&quot;git properties&quot; data-ke-language=&quot;git&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git rebase [브랜치명]

#e.g.
git rebase master #/HEAD 브랜치의 커밋들을 master로 재배치&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;태그 달기 (태깅)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- annotated 태그를 생성한다. (브랜치명 생략 시 HEAD에 태그 생성한다.)&lt;/p&gt;
&lt;pre id=&quot;code_1643734547330&quot; class=&quot;git properties&quot; data-ke-language=&quot;git&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git tag [태그명]
git push [원격저장소 별칭][태그명]

#e.g.
#태그명 1.0.0으로 태그를 단다.
git tag 1.0.0
#메시지 &quot;1st release&quot;와 함께 태그명 1.0.0으로 태그를 단다.
git tag -am &quot;1st release&quot; 1.0.0
#원격저장소(origin)에 1.0.0태그를 푸시한다.
git push origin 1.0.0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;# reference&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://git-scm.com/docs&quot;&gt;https://git-scm.com/docs&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1643734600424&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Git - Reference&quot; data-og-description=&quot;Reference&quot; data-og-host=&quot;git-scm.com&quot; data-og-source-url=&quot;https://git-scm.com/docs&quot; data-og-url=&quot;https://git-scm.com/docs&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://git-scm.com/docs&quot; data-source-url=&quot;https://git-scm.com/docs&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('&amp;quot;&amp;quot;');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Git - Reference&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Reference&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;git-scm.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-ad-creative-wrap=&quot;outer&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>KR/Tool,ETC</category>
      <category>Command</category>
      <category>CUI</category>
      <category>깃</category>
      <category>깃헙</category>
      <category>명령어</category>
      <category>커맨드</category>
      <author>개발개</author>
      <guid isPermaLink="true">https://the-dev.tistory.com/86</guid>
      <comments>https://the-dev.tistory.com/86#entry86comment</comments>
      <pubDate>Wed, 2 Feb 2022 01:57:14 +0900</pubDate>
    </item>
    <item>
      <title>[git 명령어 1] : init, commit, checkout, push, clone, pull (깃)</title>
      <link>https://the-dev.tistory.com/84</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;git1.png&quot; data-origin-width=&quot;447&quot; data-origin-height=&quot;444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNBeJH/btrsiHMnd56/DPEXIol5QskPrkwkctNR9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNBeJH/btrsiHMnd56/DPEXIol5QskPrkwkctNR9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNBeJH/btrsiHMnd56/DPEXIol5QskPrkwkctNR9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNBeJH%2FbtrsiHMnd56%2FDPEXIol5QskPrkwkctNR9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;397&quot; data-filename=&quot;git1.png&quot; data-origin-width=&quot;447&quot; data-origin-height=&quot;444&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;#init&amp;nbsp; &amp;nbsp;#commit&amp;nbsp; &amp;nbsp;#checkout&amp;nbsp; &amp;nbsp;#push&amp;nbsp; &amp;nbsp;#clone&amp;nbsp; &amp;nbsp;#pull&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&lt;b&gt;기본 명령어&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- 단독으로 사용하면 명령어의 옵션들을 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1629856622666&quot; class=&quot;git properties&quot; data-ke-language=&quot;git&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.JPG&quot; data-origin-width=&quot;617&quot; data-origin-height=&quot;466&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wZMzs/btrcYaxIQdt/TyGrVZszT6vPxsaDOvblwk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wZMzs/btrcYaxIQdt/TyGrVZszT6vPxsaDOvblwk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wZMzs/btrcYaxIQdt/TyGrVZszT6vPxsaDOvblwk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwZMzs%2FbtrcYaxIQdt%2FTyGrVZszT6vPxsaDOvblwk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;617&quot; height=&quot;466&quot; data-filename=&quot;1.JPG&quot; data-origin-width=&quot;617&quot; data-origin-height=&quot;466&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;로컬저장소 생성하기 (초기화)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- 로컬 프로젝트 최상위 디렉터리 안에서 실행 시, 로컬 저장소를 생성한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- 명령어가 실행되고 나면 해당 디렉터리에 .git 폴더가 생성된 것을 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1629857026137&quot; class=&quot;git properties&quot; data-ke-language=&quot;git&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git init&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2.jpg&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;35&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpTXLp/btrc1vIjbF1/k2hCv5KkCDkxsUYXvf5Lfk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpTXLp/btrc1vIjbF1/k2hCv5KkCDkxsUYXvf5Lfk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpTXLp/btrc1vIjbF1/k2hCv5KkCDkxsUYXvf5Lfk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpTXLp%2Fbtrc1vIjbF1%2Fk2hCv5KkCDkxsUYXvf5Lfk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;656&quot; height=&quot;35&quot; data-filename=&quot;2.jpg&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;35&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;계정 정보 설정하기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- 해당 git 프로젝트의 계정 정보를 설정한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- 로컬 테스트로만 사용할 경우, 임의 정보를 입력해도 무방하지만,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; 원격저장소와 연동할 경우, github 계정 정보를 기입해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1629857107152&quot; class=&quot;git properties&quot; data-ke-language=&quot;git&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git config --global user.email &quot;[이메일계정]&quot;
git config --global user.name &quot;[계정명]&quot;

#e.g.
git config --global user.email &quot;mail_account@mail.com&quot;
git config --global user.name &quot;account_name&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;커밋 만들기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- &lt;b&gt;add&lt;/b&gt; : 스테이지(stage) 영역으로 대상 파일(들)을 등록한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- &lt;b&gt;commit&lt;/b&gt; : 스테이지에 등록된 파일(들)을 커밋한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- &lt;b&gt;commit -m&lt;/b&gt; : 커밋 메시지와 함께 커밋한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;&amp;nbsp; (커밋 메시지는 추후 변동사항 분석을 용이하게 하기 위해 구체적으로 적는 것이 좋다.)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1629857361962&quot; class=&quot;git properties&quot; data-ke-language=&quot;git&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git add [대상 파일]
git commit -m &quot;[코멘트]&quot;

#e.g.
git add src/main/resources/schema.sql
git commit -m &quot;update member table schema&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3.jpg&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;119&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vjMlg/btrc2KyetEo/ki7f5SZRcRxZtLm3rKif30/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vjMlg/btrc2KyetEo/ki7f5SZRcRxZtLm3rKif30/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vjMlg/btrc2KyetEo/ki7f5SZRcRxZtLm3rKif30/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvjMlg%2Fbtrc2KyetEo%2Fki7f5SZRcRxZtLm3rKif30%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;495&quot; height=&quot;119&quot; data-filename=&quot;3.jpg&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;119&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;커밋 기록 보기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- 해당 git 프로젝트의 히스토리를 조회한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1629858200242&quot; class=&quot;git properties&quot; data-ke-language=&quot;git&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git log&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;다른 커밋으로 되돌리기 (체크아웃)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- 지정한 커밋ID 버전으로 되돌리거나 브랜치로 이동한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;- 커밋ID 대신 - 를 입력하면, 바로 이전 커밋으로 되돌린다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1629858367124&quot; class=&quot;git properties&quot; data-ke-language=&quot;git&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git checkout [커밋ID/브랜치명]

#e.g.
git checkout - #바로 이전 커밋으로 이동
git checkout develop # develop 브랜치로 이동&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;원격저장소에 커밋 올리기 (푸시)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;remote add&lt;/b&gt; : 지정한 원격저장소의 repository를 별칭으로 등록한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 보통 repository 별칭으로 origin을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;push&lt;/b&gt; : 지정한 원격저장소의 브랜치로 커밋을 올린다.&lt;/p&gt;
&lt;pre id=&quot;code_1629858610981&quot; class=&quot;git properties&quot; data-ke-language=&quot;git&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git remote add [원격저장소 별칭] [git repository 주소]
git push [원격저장소 별칭] [브랜치명]

#e.g.
git remote add origin https://github.com/acoount_name/repository_name.git
git push origin develop&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;원격저장소 커밋를 로컬저장소에 내려받기 (클론)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 지정한 원격저장소의 커밋을 로컬저장소에 내려받는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- b옵션을 사용하면 특정 브랜치의 커밋을 내려받을 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1629858847633&quot; class=&quot;git properties&quot; data-ke-language=&quot;git&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git clone [git repository 주소] [.(repository 이하를 받아옴)/(repository명부터 받아옴)]

#e.g.
git clone https://github.com/acoount/repository_name.git
git clone -b develop https://github.com/acoount_name/repository_name.git .&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic'; background-color: #ffc1c8;&quot;&gt;&lt;b&gt;원경저장소의 새 커밋 버전으로 로컬저장소 갱신하기 (풀링)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- 지정한 원격저장소의 브랜치 버전에 새로운 커밋이 있다면 로컬저장소로 받아온다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- pull = fetch + merge&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1629859051472&quot; class=&quot;git properties&quot; data-ke-language=&quot;git&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git pull [원격저장소 별칭] [브랜치명]

#e.g.
git pull origin master&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style8&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;# reference&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://git-scm.com/docs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://git-scm.com/docs&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1629858993809&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Git - Reference&quot; data-og-description=&quot;Reference&quot; data-og-host=&quot;git-scm.com&quot; data-og-source-url=&quot;https://git-scm.com/docs&quot; data-og-url=&quot;https://git-scm.com/docs&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://git-scm.com/docs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://git-scm.com/docs&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Git - Reference&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Reference&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;git-scm.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>KR/Tool,ETC</category>
      <category>Command</category>
      <category>CUI</category>
      <category>깃</category>
      <category>깃헙</category>
      <category>명령어</category>
      <category>커맨드</category>
      <author>개발개</author>
      <guid isPermaLink="true">https://the-dev.tistory.com/84</guid>
      <comments>https://the-dev.tistory.com/84#entry84comment</comments>
      <pubDate>Wed, 25 Aug 2021 19:40:02 +0900</pubDate>
    </item>
    <item>
      <title>[머신러닝/기초개념] 2. 의사결정트리</title>
      <link>https://the-dev.tistory.com/73</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;364&quot; data-origin-height=&quot;355&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/waUHY/btq4ddb97jI/Uqb3F1s5VCRg0JAxDgWwQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/waUHY/btq4ddb97jI/Uqb3F1s5VCRg0JAxDgWwQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/waUHY/btq4ddb97jI/Uqb3F1s5VCRg0JAxDgWwQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwaUHY%2Fbtq4ddb97jI%2FUqb3F1s5VCRg0JAxDgWwQ0%2Fimg.png&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;364&quot; data-origin-height=&quot;355&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;의사결정트리 (Decision Tree)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;분류 문제&lt;/span&gt;(범주형 데이터 예측)에 사용&lt;/li&gt;
&lt;li&gt;불확실성(uncertainty) 또는 불순도(impurity)가 크게 줄어들도록 학습&lt;/li&gt;
&lt;li&gt;장점
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;상대적으로 이해가 쉽고 빠름&lt;/li&gt;
&lt;li&gt;자료 가공이 대체로 불필요함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;단점
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;연속형 데이터 예측이 어려움&lt;/li&gt;
&lt;li&gt;모형이 복잡하면 예측률이 떨어짐&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;불순도 평가 방법 3가지&amp;nbsp;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;엔트로피&lt;/li&gt;
&lt;li&gt;지니계수&lt;/li&gt;
&lt;li&gt;카이제곱스퀘어&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;불순도 평가 방법 3가지&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;엔트로피(Entropy)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;엔트로피.png&quot; data-origin-width=&quot;127&quot; data-origin-height=&quot;16&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LVhDR/btq4mac7BTD/LKdBxdqvcGHChjdSVMjAH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LVhDR/btq4mac7BTD/LKdBxdqvcGHChjdSVMjAH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LVhDR/btq4mac7BTD/LKdBxdqvcGHChjdSVMjAH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLVhDR%2Fbtq4mac7BTD%2FLKdBxdqvcGHChjdSVMjAH1%2Fimg.png&quot; data-filename=&quot;엔트로피.png&quot; data-origin-width=&quot;127&quot; data-origin-height=&quot;16&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333;&quot;&gt;무질서도&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;필요한 모든&amp;nbsp;bit&amp;nbsp;수를 평균한 값&lt;/li&gt;
&lt;li&gt;엔트로피가 작을수록 좋음(불순도 낮음)&lt;/li&gt;
&lt;li&gt;불순도 희석 방향으로 데이터 나눔&lt;/li&gt;
&lt;li&gt;log 사용으로 속도가 느림&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;지니계수(Gini Index)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;지니계수.png&quot; data-origin-width=&quot;64&quot; data-origin-height=&quot;17&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M0W1Q/btq4iOh4I16/GD0tNn481z28n0nwQFEaBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M0W1Q/btq4iOh4I16/GD0tNn481z28n0nwQFEaBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M0W1Q/btq4iOh4I16/GD0tNn481z28n0nwQFEaBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM0W1Q%2Fbtq4iOh4I16%2FGD0tNn481z28n0nwQFEaBK%2Fimg.png&quot; data-filename=&quot;지니계수.png&quot; data-origin-width=&quot;64&quot; data-origin-height=&quot;17&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1 - (랜덤한 특정 레코드가 같은 범주에 포함될 확률)&lt;/li&gt;
&lt;li&gt;지니계수가 작을수록 좋음(불순도 낮음)&lt;/li&gt;
&lt;li&gt;엔트로피 보다 속도 빠름&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&quot;color: #009a87;&quot;&gt;&lt;b&gt;카이제곱스퀘어(Chi-square)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;카이제곱스퀘어.png&quot; data-origin-width=&quot;128&quot; data-origin-height=&quot;28&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EF6R4/btq4jEfcpwu/4BxJCWGwj4i4Cyeta774h1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EF6R4/btq4jEfcpwu/4BxJCWGwj4i4Cyeta774h1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EF6R4/btq4jEfcpwu/4BxJCWGwj4i4Cyeta774h1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEF6R4%2Fbtq4jEfcpwu%2F4BxJCWGwj4i4Cyeta774h1%2Fimg.png&quot; data-filename=&quot;카이제곱스퀘어.png&quot; data-origin-width=&quot;128&quot; data-origin-height=&quot;28&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;독립성 검증을 위해 사용&lt;/li&gt;
&lt;li&gt;상관관계가 가장 적도록 나눔&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>KR/ML,DL</category>
      <category>개요</category>
      <category>기초</category>
      <category>데이터</category>
      <category>머신러닝</category>
      <category>의사결정</category>
      <category>이해</category>
      <category>지니지수</category>
      <category>카이제곱검정</category>
      <category>트리</category>
      <author>개발개</author>
      <guid isPermaLink="true">https://the-dev.tistory.com/73</guid>
      <comments>https://the-dev.tistory.com/73#entry73comment</comments>
      <pubDate>Fri, 11 Jun 2021 23:58:27 +0900</pubDate>
    </item>
    <item>
      <title>놓치기 쉬운 자바(JAVA) : (3) java.lang 패키지</title>
      <link>https://the-dev.tistory.com/64</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;401&quot; data-origin-height=&quot;355&quot; data-filename=&quot;3.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blENfy/btq61ngILtH/2xEW502qQtIGjRewQ7Ttc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blENfy/btq61ngILtH/2xEW502qQtIGjRewQ7Ttc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blENfy/btq61ngILtH/2xEW502qQtIGjRewQ7Ttc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblENfy%2Fbtq61ngILtH%2F2xEW502qQtIGjRewQ7Ttc1%2Fimg.png&quot; data-origin-width=&quot;401&quot; data-origin-height=&quot;355&quot; data-filename=&quot;3.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Object클래스의 메서드&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;equals(Object obj)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;두 객체의 같고 다름을 &lt;span style=&quot;background-color: #99cefa;&quot;&gt;참조변수의 값으로 비교&lt;/span&gt;하는 메서드&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;서로 다른 두 객체를 비교하면 return false&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;String클래스에서는 equals메서드를 오버라이딩 &amp;rarr; 문자열 값 비교 결과 반환&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;hashCode()&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;객체의 주소값을 이용해서 해시코드&lt;/span&gt;를 만들어 반환&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;다른 객체는 같은 해시코드를 가질 수 없음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;String클래스에서는 hashCode메서드를 오버라이딩 &amp;rarr; 문자열이 같으면 동일 해쉬코드 반환&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;clone()&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;객체에 저장된 값을 복제 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr; 기본형이 아닌 경우 주소값을 복제하므로 원본가 복제본이 동일&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr; &lt;b&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;얕은복사&lt;/span&gt;&lt;/b&gt;(shallow copy)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;c.f. 원본이 참조하는 객체까지 복제&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr; &lt;b&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;깊은복사&lt;/span&gt;&lt;/b&gt;(deep copy)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;String클래스&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;immutable&lt;/span&gt; &amp;rarr; 문자열 결합 시, 새로운 String 인스턴스 생성&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1623332871366&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// final &amp;rarr; 다른 클래스에서 상속받을 수 없음
public final class String implements Serializable, Comparable {
	private char[] value;
    ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- int compareTo(String str) : str과 사전순으로 비교하여 같으면 0, 이전이면 1, 이후면 -1 반환&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- int indexOf(int ch, int pos) : ch가 pos (포함)이후 문자열에 존재하면 해당 index, 존재하지 않으면 -1 반환&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- String intern() : 문자열을 constant pool에 등록. 이미 있을 경우 그 문자열 주소값 반환&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- String.join() : 여러 문자열을 구분자를 이용해 결합&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- String.format() : printf()와 같이 형식화된 문자열 생성&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;StringBuffer클래스&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;mutable&lt;/span&gt; &amp;rarr; 내부적으로 문자열 편집을 위한 버퍼(buffer)가 있음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;멀티쓰레드 환경&lt;/b&gt;에서 사용 (동기화)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- int capacity() : 인스턴스의 버퍼크기를 알려줌&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;StringBuilder클래스&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;mutable&lt;/span&gt; &amp;rarr; 내부적으로 문자열 편집을 위한 버퍼(buffer)가 있음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;싱글쓰레드 환경에서 사용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;String Constant Pool&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1619335947416&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String s1 = &quot;abc&quot;; // literal
String s2 = &quot;abc&quot;; // literal
String s3 = new String(&quot;abc&quot;);

System.out.println(s1.equals(s2)); // true
System.out.println(s2.equals(s3)); // true

System.out.println(s1 == s2); // true
System.out.println(s2 == s3); // false

System.out.println(System.identityHashCode(s1));
System.out.println(System.identityHashCode(s2));
System.out.println(System.identityHashCode(s3));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;s1과 s2의 경우,&amp;nbsp;리터럴(literal)로 생성했고, s3는&amp;nbsp;new 연산자로 생성했다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;String을 리터럴로 생성하면 JVM내 &lt;span style=&quot;background-color: #99cefa;&quot;&gt;&lt;b&gt;Constant Pool&lt;/b&gt;&lt;/span&gt;에 저장되며, 같은 문자열을 또 생성하려는 경우&amp;nbsp;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;&lt;b&gt;재사용&lt;/b&gt;&lt;/span&gt;한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;s1, s2, s3 모두 String의 equals 메서드로 비교하면,&amp;nbsp;동일한 문자열이기 때문에 true를 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;객체를 비교하는 '==' 연산자에서도 s1과 s2는 같은 객체를 재사용 했으므로 true를 반환하며,&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;s3는 신규 생성 객체이기 때문에 s1과 s3, 그리고 s2와 s3를 비교한 결과는 모두 false를 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;재사용을 통해 String은 StringBuffer나 StringBuilder와 달리&amp;nbsp;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;&lt;b&gt;immutable&lt;/b&gt;&lt;/span&gt;하다는 특성을 살릴 수 있기 때문에&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;String 사용은 가급적 new 연산자보다 리터럴로 생성하는 것이 좋다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Wrapper클래스&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;8개 기본형을 대표한 8개 래퍼클래스 존재 (기본형 값을 객체로 다룰 때 사용)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;JDK1.5에 추가된 오토박싱(autoboxing) : 기본형 값을 래퍼 클래스의 객체로 자동 변환&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr; 반환값이 기본형일 때와 래퍼 클래스일 때 차이가 없어짐&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;Math클래스&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;난수 범위&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;0.0 &amp;lt;= Math.random() &amp;lt; 1.0&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1619337906114&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 1~10까지의 난수 만들기
int randomNumber = (int)(Math.random() * 10) + 1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 정수형 간의 연산에서는 반올림이 이루어지지 않음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- rint() : 소수점 첫째자리에서 반올림. return double타입&lt;/span&gt;&lt;/p&gt;</description>
      <category>KR/Java</category>
      <category>개발자</category>
      <category>대비</category>
      <category>면접</category>
      <category>질문</category>
      <author>개발개</author>
      <guid isPermaLink="true">https://the-dev.tistory.com/64</guid>
      <comments>https://the-dev.tistory.com/64#entry64comment</comments>
      <pubDate>Fri, 11 Jun 2021 00:50:21 +0900</pubDate>
    </item>
    <item>
      <title>[머신러닝/기초개념] 1. 머신러닝 개요 &amp;amp; 데이터 전처리</title>
      <link>https://the-dev.tistory.com/71</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;362&quot; data-origin-height=&quot;355&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m6cne/btq4eicYd2E/KUzgZvbkdhnQ9z4pCNcWa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m6cne/btq4eicYd2E/KUzgZvbkdhnQ9z4pCNcWa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m6cne/btq4eicYd2E/KUzgZvbkdhnQ9z4pCNcWa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm6cne%2Fbtq4eicYd2E%2FKUzgZvbkdhnQ9z4pCNcWa0%2Fimg.png&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;362&quot; data-origin-height=&quot;355&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;머신러닝&lt;span&gt;(Machine Learning)&lt;/span&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기계가 스스로 &lt;span style=&quot;background-color: #ccddff;&quot;&gt;데이터의 유의미한 패턴&lt;/span&gt;과 &lt;span style=&quot;background-color: #ccddff;&quot;&gt;통계적인 함수&lt;/span&gt;를 발견하여 지식을 얻는 것을 말한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;머신러닝의 분류&lt;/b&gt;&lt;span&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #3366ff;&quot;&gt;&lt;b&gt;회귀&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입력데이터를 바탕으로 원하는 타겟변수의 &lt;span style=&quot;background-color: #ccddff;&quot;&gt;미래결과 예측&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;주식시장 예측, 백화점 수요예측 등&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #3366ff;&quot;&gt;&lt;b&gt;분류&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입력데이터를 바탕으로 개별 데이터의 &lt;span style=&quot;background-color: #ccddff;&quot;&gt;클래스 구분&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;스팸 필터링,&amp;nbsp;신용카드 사기 탐지,&amp;nbsp;제조 결함 탐지 등&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #3366ff;&quot;&gt;&lt;b&gt;추천&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;고객이 &lt;span style=&quot;background-color: #ccddff;&quot;&gt;선호하는 상품 또는 대안&lt;/span&gt; 예측&lt;span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;유튜브 선호 영상 추천,&amp;nbsp;홈쇼핑 상품 추천 등&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #3366ff;&quot;&gt;&lt;b&gt;대체&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입력데이터의 &lt;span style=&quot;background-color: #ccddff;&quot;&gt;누락값 보완&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;불완전한 환자 의료 데이터 기록 보완,&amp;nbsp;인구조사 자료 보충 등&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;머신러닝의 방법론&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #3366ff;&quot;&gt;&lt;b&gt;지도학습&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;(Supervised Learning)&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;훈련 데이터 안에 예측해야 할&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ccddff;&quot;&gt;target&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ccddff;&quot;&gt;이 있는 경우&lt;/span&gt;에 사용되는 방법론&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #3366ff;&quot;&gt;&lt;b&gt;비지도학습&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;(Unsupervised Learning)&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;훈련 데이터 안에 예측해야 할&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ccddff;&quot;&gt;target&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ccddff;&quot;&gt;이 없는 경우&lt;/span&gt;에 사용되는 방법론&lt;/li&gt;
&lt;li&gt;함수모형을 만들지 않고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ccddff;&quot;&gt;데이터의 패턴을 추출하여 숨겨진 구조를 찾음&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #3366ff;&quot;&gt;&lt;b&gt;강화학습&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;(Reinforcement Learning)&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ccddff;&quot;&gt;스스로 정답을 찾도록&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;target&amp;nbsp;&lt;span&gt;값을 만들면서 훈련&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;머신러닝 프로세스&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;ml_workflow.png&quot; data-origin-width=&quot;672&quot; data-origin-height=&quot;797&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tiBQk/btq4dLzO1XY/KNmllxXhOlkyae6EeGVlqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tiBQk/btq4dLzO1XY/KNmllxXhOlkyae6EeGVlqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tiBQk/btq4dLzO1XY/KNmllxXhOlkyae6EeGVlqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtiBQk%2Fbtq4dLzO1XY%2FKNmllxXhOlkyae6EeGVlqk%2Fimg.png&quot; data-filename=&quot;ml_workflow.png&quot; data-origin-width=&quot;672&quot; data-origin-height=&quot;797&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;탐색적 데이터 분석 (&lt;/span&gt;EDA; Exploratory Data Analysis&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;머신러닝 모델을 만들기 위한 전단계&lt;/li&gt;
&lt;li&gt;특성을 추출하거나 패턴을 알기 위해 통계적 분석을 시도하는 단계&lt;/li&gt;
&lt;li&gt;알고리즘이 주로 결정되는 단계&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;데이터 전처리 작업&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ccddff;&quot;&gt;Munging&lt;/span&gt; (데이터 가공), &lt;/span&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ccddff;&quot;&gt;Wrangling&lt;/span&gt; (데이터 보강)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ccddff;&quot;&gt;Missing Data (결측데이터)&amp;nbsp;처리&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;/span&gt;같은 속성의 데이터의 평균&lt;span&gt;/&lt;/span&gt;중간값으로 채우기&lt;/li&gt;
&lt;li&gt;데이터건수가 충분하고 결측데이터가 많지 않다면 모두 삭제&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ccddff;&quot;&gt;Outlier&amp;nbsp;처리&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;Outlier Detection&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;알고리즘을 통해 평균 패턴에서 떨어진 노이즈 데이터를 발견&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;e.g. 고장 센서 판별&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>KR/ML,DL</category>
      <category>개요</category>
      <category>기초</category>
      <category>데이터</category>
      <category>머신러닝</category>
      <category>이해</category>
      <category>전처리</category>
      <author>개발개</author>
      <guid isPermaLink="true">https://the-dev.tistory.com/71</guid>
      <comments>https://the-dev.tistory.com/71#entry71comment</comments>
      <pubDate>Fri, 7 May 2021 00:07:51 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 2차원 배열 생성/초기화 주의사항</title>
      <link>https://the-dev.tistory.com/72</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;배열.png&quot; data-origin-width=&quot;354&quot; data-origin-height=&quot;354&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chjLKK/btq32AdIx9W/zLE8zTEuKOdK5US4bnOGE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chjLKK/btq32AdIx9W/zLE8zTEuKOdK5US4bnOGE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chjLKK/btq32AdIx9W/zLE8zTEuKOdK5US4bnOGE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchjLKK%2Fbtq32AdIx9W%2FzLE8zTEuKOdK5US4bnOGE0%2Fimg.png&quot; data-filename=&quot;배열.png&quot; data-origin-width=&quot;354&quot; data-origin-height=&quot;354&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;구현 기준&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;가로(20) X 세로(20)인 2차원 배열을 생성하고 동그라미(O)로 초기화한다.&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;첫 번째 입력받은 수만큼 좌표를 입력받는다.&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;그 후 입력받은 각 좌표에 해당하는 동그라미를 엑스(X)로 바꾼다.&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;해당 2차원 배열을 출력한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;소스 코드&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1620060733020&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;n = int(input())

arr = [['O']*20 for _ in range(20)]
for i in range(n) :
    x,y = input().split()
    arr[int(x)][int(y)] = 'X'

print('\n'.join([' '.join([str(i) for i in row]) for row in arr]))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;입력 예시&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1620060755288&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;5
1 2
3 3
5 7
9 10
15 8&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;출력 결과&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1620060768139&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;O O O O O O O O O O O O O O O O O O O O 
O O X O O O O O O O O O O O O O O O O O 
O O O O O O O O O O O O O O O O O O O O 
O O O X O O O O O O O O O O O O O O O O 
O O O O O O O O O O O O O O O O O O O O 
O O O O O O O X O O O O O O O O O O O O 
O O O O O O O O O O O O O O O O O O O O 
O O O O O O O O O O O O O O O O O O O O 
O O O O O O O O O O O O O O O O O O O O 
O O O O O O O O O O X O O O O O O O O O 
O O O O O O O O O O O O O O O O O O O O 
O O O O O O O O O O O O O O O O O O O O 
O O O O O O O O O O O O O O O O O O O O 
O O O O O O O O O O O O O O O O O O O O 
O O O O O O O O O O O O O O O O O O O O 
O O O O O O O O X O O O O O O O O O O O 
O O O O O O O O O O O O O O O O O O O O 
O O O O O O O O O O O O O O O O O O O O 
O O O O O O O O O O O O O O O O O O O O 
O O O O O O O O O O O O O O O O O O O O&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style4&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;주의사항&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;python에서 2차원 이상의 배열(list)를 초기화 할 때&lt;/p&gt;
&lt;pre id=&quot;code_1620061578442&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;arr = [['O'] * n] * n&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방식으로 초기화할 경우, 각 row가 같은 객체로 인식된다. (얕은복사)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;입력 예시&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1620061586585&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;arr = [['O'] * 5] * 5

arr[0][0] = 'X'
arr[1][1] = 'X'
arr[3][3] = 'X'

print('\n'.join([' '.join([str(i) for i in row]) for row in arr]))&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;출력 결과&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1620061594609&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;X X O X O
X X O X O
X X O X O
X X O X O
X X O X O&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>KR/Python</category>
      <category>다차원</category>
      <category>배열</category>
      <category>얕은복사</category>
      <category>주의사항</category>
      <category>파이썬</category>
      <author>개발개</author>
      <guid isPermaLink="true">https://the-dev.tistory.com/72</guid>
      <comments>https://the-dev.tistory.com/72#entry72comment</comments>
      <pubDate>Tue, 4 May 2021 02:12:12 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 수열 구현하기</title>
      <link>https://the-dev.tistory.com/70</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;수열.png&quot; data-origin-width=&quot;378&quot; data-origin-height=&quot;378&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w2OJa/btq3TLAge14/OhjoTg0qvIH1hgWF0XFDck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w2OJa/btq3TLAge14/OhjoTg0qvIH1hgWF0XFDck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w2OJa/btq3TLAge14/OhjoTg0qvIH1hgWF0XFDck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw2OJa%2Fbtq3TLAge14%2FOhjoTg0qvIH1hgWF0XFDck%2Fimg.png&quot; data-filename=&quot;수열.png&quot; data-origin-width=&quot;378&quot; data-origin-height=&quot;378&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;등차수열, 등비수열을 구현하고자 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 수열의 개념과 구현 방법은 아래와 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #c1bef9;&quot;&gt;등차수열&lt;/span&gt; (Arithmetical Series)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;: 연속한 두 항의 &lt;span style=&quot;background-color: #c1bef9;&quot;&gt;차&lt;/span&gt;가 일정한 수열&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;방법 1)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1620056316197&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a,d,n = input().split()

a = int(a)	# 시작값
d = int(d)	# 등차값
n = int(n)	# 구하고자 하는 숫자의 순서

print(a + d * (n-1))&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;방법 2)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1620056270873&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a,d,n = input().split()

a = int(a)	# 시작값
d = int(d)	# 등차값
n = int(n)	# 구하고자 하는 숫자의 순서

s = a
for i in range(2, n+1):
   s += d

print(s)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력 예시&lt;/p&gt;
&lt;pre id=&quot;code_1620056386418&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1 3 5&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력 결과&lt;/p&gt;
&lt;pre id=&quot;code_1620056394914&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;13&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #c1bef9;&quot;&gt;등비수열&lt;/span&gt; (Geometric Series)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;: 연속한 두 항의 &lt;span style=&quot;background-color: #c1bef9;&quot;&gt;비&lt;/span&gt;가 일정한 수열&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;방법 1)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1620056672904&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a,r,n = input().split()

a = int(a)	# 시작값
r = int(r)	# 등비값
n = int(n)	# 구하고자 하는 숫자의 순서

print(a * r**(n-1))&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;방법 2)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1620056707155&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a,r,n = input().split()

a = int(a)	# 시작값
r = int(r)	# 등비값
n = int(n)	# 구하고자 하는 숫자의 순서


for i in range(1, n) :
  a = a * r

print(a)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력 예시&lt;/p&gt;
&lt;pre id=&quot;code_1620056762759&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;2 3 7&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력 결과&lt;/p&gt;
&lt;pre id=&quot;code_1620056769877&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1458&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;기타 수열 구현하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;: 연속한 두 항이 &lt;u&gt;곱셈 한 번&lt;/u&gt;과 &lt;u&gt;덧셈 한 번&lt;/u&gt;으로 이루어진 수열&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1620057039127&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a,m,d,n = input().split()

a = int(a)	# 시작값
m = int(m)	# 곱할값
d = int(d)	# 더할값
n = int(n)	# 구하고자 하는 숫자의 순서

for i in range(1, n) :
  a = a * m + d

print(a)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구현된 수열&lt;/p&gt;
&lt;pre id=&quot;code_1620057446935&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1 -1 3 -5 11 -21 43 ...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력 예시&lt;/p&gt;
&lt;pre id=&quot;code_1620057420489&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1 -2 1 8&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력 결과&lt;/p&gt;
&lt;pre id=&quot;code_1620057428851&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-85&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>KR/Python</category>
      <category>구현</category>
      <category>기초</category>
      <category>수열</category>
      <category>예제</category>
      <category>파이썬</category>
      <author>개발개</author>
      <guid isPermaLink="true">https://the-dev.tistory.com/70</guid>
      <comments>https://the-dev.tistory.com/70#entry70comment</comments>
      <pubDate>Mon, 3 May 2021 00:31:18 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 3 6 9 게임 구현하기</title>
      <link>https://the-dev.tistory.com/69</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-filename=&quot;369.png&quot; data-origin-width=&quot;378&quot; data-origin-height=&quot;378&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGNGLq/btq3Xs64Gux/U5PP2Ng3WlMZNBcrjFgw40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGNGLq/btq3Xs64Gux/U5PP2Ng3WlMZNBcrjFgw40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGNGLq/btq3Xs64Gux/U5PP2Ng3WlMZNBcrjFgw40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGNGLq%2Fbtq3Xs64Gux%2FU5PP2Ng3WlMZNBcrjFgw40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;378&quot; height=&quot;378&quot; data-filename=&quot;369.png&quot; data-origin-width=&quot;378&quot; data-origin-height=&quot;378&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;369게임&lt;/span&gt;을 구현하고자 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구현 기준과 출력 예시는 아래와 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;구현 기준&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;정수 n을 입력받는다.&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;1부터 입력받은 정수 n까지 한칸씩 띄어 순서대로 출력하되,&lt;br /&gt;3, 6, 9가 포함된 경우 박수(X)를 친다.&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;3, 6, 9가 여러 개 포함된 숫자의 경우, 포함된 숫자만큼 박수를 친다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;출력 예시&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;13 차례일 때, 출력 : X&lt;/li&gt;
&lt;li&gt;39 차례일 때, 출력 : XX&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adfit&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;728x90&lt;/div&gt;
    &lt;ins class=&quot;kakao_ad_area&quot; style=&quot;display: none;&quot; data-ad-unit=&quot;DAN-eR9EfHNfRwHZ1bUZ&quot; data-ad-width=&quot;728px&quot; data-ad-height=&quot;90px&quot;&gt;&lt;/ins&gt;
    &lt;script type=&quot;text/javascript&quot; src=&quot;//t1.daumcdn.net/kas/static/ba.min.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;소스 코드 및 해설&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1619967389198&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# https://the-dev.tistory.com/69
# 입력받은 값을 매개변수 n에 정수로 할당한다.
n = int(input(&quot;Input number: &quot;))

# 1부터 n까지 반복한다.
for i in range(1, n+1) :
	
	# i번재 숫자를 문자로 변환한다.
	s = str(i)
	
	# i번째 숫자가 3,6,9를 몇 개 포함하고 있는지 셀 변수를 할당한다.
	count = 0
	
	# 문자로 변환한 i번째 숫자를 한 자리씩 반복한다.
	# e.g. 369 =&amp;gt; [3,6,9]
	for x in s :
    	
		# 3, 6, 9 문자가 있으면
		if (x=='3') or (x=='6') or (x=='9') :
			
			# count를 1 늘려준다.
			count += 1
			
	# 만약 count가 0이면 (3,6,9가 포함되지 않은 것이므로)
	if count == 0 :

		# i를 그대로 출력하고, 출력 글자간 한 칸 띄기로 구분한다.
		print(i, end=' ')
    			
	# count가 0이 아니면
	else :
		
		# count 수만큼 X를 출력하고, 출력 글자간 한 칸 띄기로 구분한다.
		# e.g. 36 =&amp;gt; count가 2이므로 =&amp;gt; XX 출력
		print(count*'X', end=' ')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력화면&lt;/p&gt;
&lt;pre id=&quot;code_1619969223471&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Input number: 35&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력&lt;/p&gt;
&lt;pre id=&quot;code_1619969302370&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1 2 X 4 5 X 7 8 X 10 11 12 X 14 15 X 17 18 X 20 21 22 X 24 25 X 27 28 X X X X XX X X&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;* 코드블럭 인덴트 틀어짐 이슈로 이미지도 첨부합니다 *&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1263&quot; data-origin-height=&quot;1102&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBpP5v/btrDuwfxEIX/QRc8d0FXIzm7gikAmXW3W0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBpP5v/btrDuwfxEIX/QRc8d0FXIzm7gikAmXW3W0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBpP5v/btrDuwfxEIX/QRc8d0FXIzm7gikAmXW3W0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBpP5v%2FbtrDuwfxEIX%2FQRc8d0FXIzm7gikAmXW3W0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1263&quot; height=&quot;1102&quot; data-origin-width=&quot;1263&quot; data-origin-height=&quot;1102&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>KR/Python</category>
      <category>369</category>
      <category>구현</category>
      <category>기초</category>
      <category>예제</category>
      <category>파이썬</category>
      <author>개발개</author>
      <guid isPermaLink="true">https://the-dev.tistory.com/69</guid>
      <comments>https://the-dev.tistory.com/69#entry69comment</comments>
      <pubDate>Mon, 3 May 2021 00:28:46 +0900</pubDate>
    </item>
    <item>
      <title>놓치기 쉬운 자바(JAVA) : (2) 객체지향</title>
      <link>https://the-dev.tistory.com/63</link>
      <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;378&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjnKbX/btq3datqwcq/z1ybRVF13gsMUUEhGT8Dc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjnKbX/btq3datqwcq/z1ybRVF13gsMUUEhGT8Dc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjnKbX/btq3datqwcq/z1ybRVF13gsMUUEhGT8Dc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjnKbX%2Fbtq3datqwcq%2Fz1ybRVF13gsMUUEhGT8Dc1%2Fimg.png&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;378&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;상속관계 vs 포함관계&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;상속관계&lt;/b&gt; : is-a (A truck is a car.)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1619595952159&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Truck extends Car {
    // ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;포함관계&lt;/b&gt; : has-a (A truck has a wheel.) &amp;rarr; 멤버로 갖는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1619596963271&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Car {
    int wheel = 4;
    // ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;오버라이딩 vs 오버로딩&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;오버라이딩&lt;/b&gt; (overriding)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;조상으로부터 상속받은 메서드의 내용을 변경하는 것이다.&lt;/li&gt;
&lt;li&gt;조상보다 좁은 범위의 접근제어나 예외선언 불가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;오버로딩&lt;/b&gt; (overloading)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;매개변수의 수나 타입을 다르게하여, 기존에 없는 새로운 메서드를 정의하는 것이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;상속 (inheritance)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;자바는 단일상속만 가능하다.&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;복잡한 기능의 클래스 작성은 쉽지 않다.&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;클래스 간 관계가 명확하고, 코드의 신뢰성이 높다.&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;Object 클래스&lt;/span&gt;
&lt;ul&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;최상위 조상클래스&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;다른 클래스를 상속받지 않는 모든 클래스에 자동 상속한다.&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;생략 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;class와 생성자의 접근 제어자는 보통 같다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;예시)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;inheritance.png&quot; data-origin-width=&quot;533&quot; data-origin-height=&quot;777&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d0ma7X/btq3ISE0gJP/WlIztPlmvmYudQAvcrfUp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d0ma7X/btq3ISE0gJP/WlIztPlmvmYudQAvcrfUp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d0ma7X/btq3ISE0gJP/WlIztPlmvmYudQAvcrfUp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd0ma7X%2Fbtq3ISE0gJP%2FWlIztPlmvmYudQAvcrfUp0%2Fimg.png&quot; data-filename=&quot;inheritance.png&quot; data-origin-width=&quot;533&quot; data-origin-height=&quot;777&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;Truck 인스턴스를 new 연산자로 생성하면,&lt;br /&gt;Truck() &amp;rarr; Truck(int wheel, int cargo) &amp;rarr; Car(int wheel) &amp;rarr; Object() 순서로 호출한다.&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;Truck 클래스의 Truck 생성자 안에 super(wheel); 이 없을 경우,&lt;br /&gt;자동으로 &lt;span style=&quot;background-color: #9feec3;&quot;&gt;super();&lt;/span&gt;를 삽입하기 때문에 오류 발생한다. (∵ Car()가 정의되지 않음)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;다형성 (polymorphism)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;예시)&lt;/p&gt;
&lt;pre id=&quot;code_1619624468858&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Phone {
	int serialNumber;
    void phoneCall(){ }
}

class SmartPhone extends Phone {
	boolean internetAccess;
    void faceCall() { }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일 때,&lt;/p&gt;
&lt;pre id=&quot;code_1619624580462&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SmartPhone s = new SmartPhone();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조변수 s는 SmartPhone 인스턴스 멤버 모두 사용 가능하다.&lt;/p&gt;
&lt;pre id=&quot;code_1619624670441&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;s.serialNumber		O
s.internetAccess	O
s.phoneCall()		O
s.faceCall()		O&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면,&lt;/p&gt;
&lt;pre id=&quot;code_1619624715021&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Phone p = new SmartPhone();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조변수 p는 SmartPhone 중 상속받은 멤버만 사용 가능하다.&lt;/p&gt;
&lt;pre id=&quot;code_1619624776092&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;p.serialNumber		O
p.internetAccess 	X
p.phoneCall()		O
p.faceCall()		X&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자손타입 참조변수로 조상타입 인스턴스 참조 불가
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;e.g. SmartPhone s = new Phone();&amp;nbsp; &amp;nbsp; X&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;instanceof 연산자를 이용해 참조변수가 참조하고 있는 인스턴스의 실제 타입을 확인할 수 있다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;연산 결과가 true이면 검사한 타입으로 형변환이 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;추상클래스 (abstract class)&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1619668130913&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 추상클래스
abstract class Animal {
	// 추상메서드
	abstract void crawl();
}

// 추상클래스 상속받은 자식클래스 (구체화)
class Cat extends Animal {
	// 추상메서드 구현
	void crawl() {
    	...
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인스턴스 생성 불가&amp;nbsp;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;rarr; &lt;/span&gt;상속받은 자식클래스를 통해야 한다.&lt;/li&gt;
&lt;li&gt;자식 클래스에서 추상메서드를 구현하도록 강요하기 위해 abstract를 붙여 추상메서드로 선언한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;인터페이스 (interface)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;추상메서드와 상수만 멤버로 가질 수 있다.&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;모든 멤버변수는 public static final (생략 가능)&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;static/default를 제외한 모든 메서드는 public abstract (생략 가능)&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;인트페이스로부터만 상속 가능하다.&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;다중 상속 가능하다.&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;인스턴스 생성 불가하다.&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;리턴타입이 인터페이스 = 인터페이스를 구현한 클래스의 인스턴스를 반환한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1619708869205&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;interface Connectible {
	void connect(Phone p); // public abstract 생략되었으므로
}

class SmartPhone extends Phone implements Connectible {
	public void connect(Phone p){ // 접근제어자는 반드시 public
    	...
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>KR/Java</category>
      <category>개발자</category>
      <category>대비</category>
      <category>면접</category>
      <category>질문</category>
      <author>개발개</author>
      <guid isPermaLink="true">https://the-dev.tistory.com/63</guid>
      <comments>https://the-dev.tistory.com/63#entry63comment</comments>
      <pubDate>Thu, 22 Apr 2021 22:59:39 +0900</pubDate>
    </item>
    <item>
      <title>놓치기 쉬운 자바(JAVA) : (1) 기초개념</title>
      <link>https://the-dev.tistory.com/62</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;395&quot; data-origin-height=&quot;378&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kM5MK/btq3cSzv4W0/7WQRfktynRQVQmko0vwf7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kM5MK/btq3cSzv4W0/7WQRfktynRQVQmko0vwf7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kM5MK/btq3cSzv4W0/7WQRfktynRQVQmko0vwf7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkM5MK%2Fbtq3cSzv4W0%2F7WQRfktynRQVQmko0vwf7k%2Fimg.png&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;395&quot; data-origin-height=&quot;378&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt; 메모리 구조&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;jvm.png&quot; data-origin-width=&quot;1551&quot; data-origin-height=&quot;946&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhkajV/btq3dyOk5kR/oVmkJ36EPJVZbarU1HvH10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhkajV/btq3dyOk5kR/oVmkJ36EPJVZbarU1HvH10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhkajV/btq3dyOk5kR/oVmkJ36EPJVZbarU1HvH10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhkajV%2Fbtq3dyOk5kR%2FoVmkJ36EPJVZbarU1HvH10%2Fimg.png&quot; data-filename=&quot;jvm.png&quot; data-origin-width=&quot;1551&quot; data-origin-height=&quot;946&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;변수&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;매개변수&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;기본형&lt;/span&gt;&lt;/b&gt;이면, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;값이 복사&lt;/span&gt;된다. (read only)&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;참조형&lt;/b&gt;&lt;/span&gt;이면, &lt;span style=&quot;background-color: #f6e199;&quot;&gt;인스턴스 주소가 복사&lt;/span&gt;된다.&amp;nbsp; (read &amp;amp; write)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;스태틱(클래식) 변수와 인스턴스 변수&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1619101025109&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Card {
	
	// 스태틱(클래스) 변수 : 모든 인스턴스에 공통으로 들어가는 성질
	static int height = 88;
	static int width = 62;
	
	// 인스턴스 변수 : 인스턴스별로 다른 성질
	// 클래스 메서드가 사용할 수 없다.
	int number;
	String shape;
	
	Card(){
		this.number = 1;
		this.shape = &quot;Spade&quot;;
	}
	
	Card(int number, String shape){
		this.number = number;
		this.shape = shape;
	}
	
	@Override
	public String toString() {
		return &quot;Card [number=&quot; + this.number + &quot;, shape=&quot; + this.shape + &quot;]&quot;;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Class&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Class객체&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스의 모든 정보를 담고 있으며 클래스당 1개만 존재&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;클래스로더&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 시에 필요한 클래스를 동적으로 메모리에 로드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;초기화 블록&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;클래스 초기화 블록&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 클래스가 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;메모리에 처음 로딩될 때 한 번만&lt;/span&gt; 수행된다. &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&amp;nbsp;static { ... }&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인스턴스 초기화 블록&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;인스턴스가 생성될 때마다&lt;/span&gt; 수행된다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&amp;nbsp;{ ... }&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1619101035521&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class InitTest{
    // cv : class variable 클래스 변수
    // iv : instance variable 인스턴스 변수
    
    // [순서]
    // 1. 기본값
    
    // 2. 명시적 초기화
    static int cv = 1;
    int iv = 1;
           
    // 3. 클래스 초기화 블럭
    static {
    	cv = 2;
    }
    
    // 3. 인스턴스 초기화 블럭
    {
    	iv = 2;
    }
    
    // 4. 생성자(인스턴스)
    InitTest() {
    	iv = 3;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;반복문&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;무한 반복문&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1619095092828&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for(;;) {
	// code here
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1619095114112&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;while(true) {
	// code here
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;do-while문&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;최소 한 번은 무조건 수행&lt;/span&gt;된다는 특징이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건식 뒤에 ';'에 주의해야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1619095169997&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;do {
	// code here
} while (조건식);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이름 붙은 반복문&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나 이상의 반복문도 벗어날 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1619095997049&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// i가 5가되면 이중반복문 Loop1를 벗어나게 된다.
int i = 0;
Loop1 : for(;;) {
	for(;;) {
    	if (i == 5){
        	break Loop1;
        }
        i++;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;그 외&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;조건식의 연산속도&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;OR 연산의 경우, &lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;'참'일 확률이 높은 피연산자를 먼저 기술&lt;/span&gt;&lt;/b&gt;하는 것이 더 빠른 연산 결과를 얻을 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;char 배열 &amp;rarr; String&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1619096776867&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;char[] charArr = new char[]{'H','e','l','l','o'};
String str = new String(charArr);
System.out.println(str); // Hello&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;배열의 선언과 생성&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1619096990326&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int[] nums1 = new int[] {1, 2, 3};
int[] nums2 = {1, 2, 3}; // new int[] 생략 가능
System.out.println(Arrays.toString(nums1)); // [1, 2, 3]
System.out.println(Arrays.toString(nums2)); // [1, 2, 3]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 번 생성한 배열은 길이를 변경할 수 없으므로, 배열의 length는 상수이다.&lt;/li&gt;
&lt;li&gt;배열을 복사하는데에는 for문보다 System.arraycopy()가 빠르다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>KR/Java</category>
      <category>개발자</category>
      <category>대비</category>
      <category>면접</category>
      <category>질문</category>
      <author>개발개</author>
      <guid isPermaLink="true">https://the-dev.tistory.com/62</guid>
      <comments>https://the-dev.tistory.com/62#entry62comment</comments>
      <pubDate>Thu, 22 Apr 2021 22:15:07 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode/MEDIUM] 438. Find All Anagrams in a String (JAVA) : 문제&amp;amp;풀이</title>
      <link>https://the-dev.tistory.com/59</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;FindAllAnagramsInAString.png&quot; data-origin-width=&quot;303&quot; data-origin-height=&quot;303&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dH7VcX/btq2ryPq5Jl/TRpMLxFaw8ldigYbHFcepk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dH7VcX/btq2ryPq5Jl/TRpMLxFaw8ldigYbHFcepk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dH7VcX/btq2ryPq5Jl/TRpMLxFaw8ldigYbHFcepk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdH7VcX%2Fbtq2ryPq5Jl%2FTRpMLxFaw8ldigYbHFcepk%2Fimg.png&quot; data-filename=&quot;FindAllAnagramsInAString.png&quot; data-origin-width=&quot;303&quot; data-origin-height=&quot;303&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;패턴String의 애너그램&lt;/span&gt;에 해당하는 &lt;span style=&quot;background-color: #99cefa;&quot;&gt;시작 index 리스트&lt;/span&gt;를 반환하는 문제이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;findAllAnagramsInAString0.JPG&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;281&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4KJc6/btq2uW3h8LA/1iRkh39nUcffBh5Tpg7y8K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4KJc6/btq2uW3h8LA/1iRkh39nUcffBh5Tpg7y8K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4KJc6/btq2uW3h8LA/1iRkh39nUcffBh5Tpg7y8K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4KJc6%2Fbtq2uW3h8LA%2F1iRkh39nUcffBh5Tpg7y8K%2Fimg.jpg&quot; data-filename=&quot;findAllAnagramsInAString0.JPG&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;281&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;두 개의 String을 매개변수로 받는&lt;span&gt; findAnagrams &lt;/span&gt;메서드의 틀이 주어진다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Problem :&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1618298771710&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class FindAllAnagramsInAString {
    public List&amp;lt;Integer&amp;gt; findAnagrams(String s, String p) {

    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;풀이는 findAnagrams 메서드에 작성하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Solution :&lt;/b&gt;&lt;/h3&gt;
&lt;ol data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;패턴(p)에 해당하는 Ascii값이 1인 int배열&lt;/span&gt;을 통해서 푼다.&lt;/li&gt;
&lt;li&gt;오른쪽 포인터가 배열 길이 이내인 동안 반복문을 돌며 &lt;span style=&quot;background-color: #99cefa;&quot;&gt;Sliding Window 방식&lt;/span&gt;으로 푼다.
&lt;ol&gt;
&lt;li&gt;오른쪽 포인터에 해당하는 Ascii가 0보다 크면 패턴이 있는 것이므로, 해당 배열값을 줄이고 포인터와 count를 늘린다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;아닌 경우, 패턴이 없는 것이므로 왼쪽 포인터와 해당 배열값을 늘리고 count를 줄인다.&lt;br /&gt;&lt;span style=&quot;color: #0593d3;&quot;&gt;(없는 패턴의 배열값을 증가시키더라도 count가 줄기 때문에 매치되지 않는 것으로 치부된다.)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;count가 패턴길이와 같아지면 그 때의 왼쪽 포인터를 결과 리스트에 추가한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;반복문이 끝나면 결과 리스트를 반환한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1618298813077&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.ArrayList;
import java.util.List;

public class FindAllAnagramsInAString {

    // time complexity : while loop (sliding window) -&amp;gt; O(n)
    // space complexity : constant char array -&amp;gt; O(1)
    public List&amp;lt;Integer&amp;gt; findAnagrams(String s, String p) {
        if(s == null || s.length() == 0 || p == null || p.length() == 0) return new ArrayList&amp;lt;&amp;gt;();

        int[] patternAscii = new int[256];
        for(char c : p.toCharArray()){
            patternAscii[c] = 1;
        }

        List&amp;lt;Integer&amp;gt; result = new ArrayList&amp;lt;&amp;gt;();
        int left = 0, right = 0, count = 0;
        while(right &amp;lt; s.length()){
            if (patternAscii[s.charAt(right)] &amp;gt; 0) {
                patternAscii[s.charAt(right)]--;
                count++;
                right++;
            } else {
                patternAscii[s.charAt(left)]++;
                count--;
                left++;
            }

            if(count == p.length()) {
                result.add(left);
            }
        }

        return result;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 과정을 그림으로 도식화하면 다음과 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;findAllAnagramsInAString1.JPG&quot; data-origin-width=&quot;914&quot; data-origin-height=&quot;1016&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wHVlj/btq2tr3Thop/f257p7yYli281kO3WwiedK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wHVlj/btq2tr3Thop/f257p7yYli281kO3WwiedK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wHVlj/btq2tr3Thop/f257p7yYli281kO3WwiedK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwHVlj%2Fbtq2tr3Thop%2Ff257p7yYli281kO3WwiedK%2Fimg.jpg&quot; data-filename=&quot;findAllAnagramsInAString1.JPG&quot; data-origin-width=&quot;914&quot; data-origin-height=&quot;1016&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Complexity :&lt;/b&gt;&lt;/h3&gt;
&lt;ul data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;시간복잡도&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(Time Complexity)
&lt;ul&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;Sliding Window 방식으로 반복문이 오른쪽으로만 진행하므로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;O(n)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;공간복잡도&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(Space Complexity)
&lt;ul&gt;
&lt;li&gt;ASCII코드가 표현된 char 배열이 주어진 문자열과 상관없이 고정적으로 사용되므로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;O(1)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Sample(Test) :&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1618298823134&quot; class=&quot;scala&quot; data-ke-language=&quot;scala&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.ArrayList;
import java.util.List;

public class FindAllAnagramsInAString {

    // time complexity : while loop (sliding window) -&amp;gt; O(n)
    // space complexity : constant char array -&amp;gt; O(1)
    public List&amp;lt;Integer&amp;gt; findAnagrams(String s, String p) {
        if(s == null || s.length() == 0 || p == null || p.length() == 0) return new ArrayList&amp;lt;&amp;gt;();

        int[] patternAscii = new int[256];
        for(char c : p.toCharArray()){
            patternAscii[c] = 1;
        }

        List&amp;lt;Integer&amp;gt; result = new ArrayList&amp;lt;&amp;gt;();
        int left = 0, right = 0, count = 0;
        while(right &amp;lt; s.length()){
            if (patternAscii[s.charAt(right)] &amp;gt; 0) {
                patternAscii[s.charAt(right)]--;
                count++;
                right++;
            } else {
                patternAscii[s.charAt(left)]++;
                count--;
                left++;
            }

            if(count == p.length()) {
                result.add(left);
            }
        }

        return result;
    }

    public static void main(String[] args){
        String s1 = &quot;cbaebabacd&quot;;
        String p1 = &quot;abc&quot;;
        String s2 = &quot;abab&quot;;
        String p2 = &quot;ab&quot;;

        FindAllAnagramsInAString f = new FindAllAnagramsInAString();
        System.out.println(f.findAnagrams(s1, p1));
        System.out.println(f.findAnagrams(s2, p2));
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 테스트 코드를 실행한 결과는 다음과 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1618298854387&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[0, 6]
[0, 1, 2]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>KR/코딩테스트</category>
      <category>LeetCode</category>
      <category>Medium</category>
      <category>릿코드</category>
      <category>미디엄</category>
      <category>알고리즘</category>
      <category>자료구조</category>
      <category>코딩테스트</category>
      <author>개발개</author>
      <guid isPermaLink="true">https://the-dev.tistory.com/59</guid>
      <comments>https://the-dev.tistory.com/59#entry59comment</comments>
      <pubDate>Tue, 13 Apr 2021 21:05:27 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode/EASY] 760. Find Anagram Mapping (JAVA) : 문제&amp;amp;풀이</title>
      <link>https://the-dev.tistory.com/58</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;FindAnagramsMapping.png&quot; data-origin-width=&quot;303&quot; data-origin-height=&quot;303&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NTM7c/btq2iDvUidD/GOTJvsvg4dxDUYDp2hlle0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NTM7c/btq2iDvUidD/GOTJvsvg4dxDUYDp2hlle0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NTM7c/btq2iDvUidD/GOTJvsvg4dxDUYDp2hlle0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNTM7c%2Fbtq2iDvUidD%2FGOTJvsvg4dxDUYDp2hlle0%2Fimg.png&quot; data-filename=&quot;FindAnagramsMapping.png&quot; data-origin-width=&quot;303&quot; data-origin-height=&quot;303&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애너그램 맵에 해당하는 인덱스를 반환하는 문제이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;FindAnagramMapping1.PNG&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;314&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYICTv/btq2r9tFiKc/zkP79ttJFmP1eDb9wJ8At0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYICTv/btq2r9tFiKc/zkP79ttJFmP1eDb9wJ8At0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYICTv/btq2r9tFiKc/zkP79ttJFmP1eDb9wJ8At0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYICTv%2Fbtq2r9tFiKc%2FzkP79ttJFmP1eDb9wJ8At0%2Fimg.png&quot; data-filename=&quot;FindAnagramMapping1.PNG&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;314&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;int 배열 두 개를 매개변수로 받는&lt;span&gt;&lt;span&gt;&lt;span&gt; anagramMappings&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;메서드의 틀이 주어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Problem :&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1618157111936&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class FindAnagramMapping {
    public int[] anagramMappings(int[] A, int[] B) {

    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;풀이는 주어진 &lt;span style=&quot;color: #333333;&quot;&gt;anagramMappings&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;메서드에 작성하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Solution :&lt;/b&gt;&lt;/h3&gt;
&lt;ol data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;주어진 배열 B로 &lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;anagram(key) - index(value)로하는 애너그램 맵&lt;/span&gt;을 만든다.&lt;/li&gt;
&lt;li&gt;주어진 배열 A를 돌며 &lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;애너그램 맵에서 해당하는 index를 구해서 배열로 반환&lt;/span&gt;한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1618157347110&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.HashMap;
import java.util.Map;

public class FindAnagramMapping {

    // time complexity : for loop for given array -&amp;gt; O(n)
    // space complexity : HashSet (length of given array) -&amp;gt; O(n)
    public int[] anagramMappings(int[] A, int[] B) {
    
        Map&amp;lt;Integer, Integer&amp;gt; anagramMap = new HashMap&amp;lt;&amp;gt;();
        for(int i = 0; i &amp;lt; B.length; i++){
            anagramMap.put(B[i], i);
        }

        int[] result = new int[A.length];
        for(int i = 0; i &amp;lt; A.length; i++){
            result[i] = anagramMap.get(A[i]);
        }

        return result;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Complexity :&lt;/b&gt;&lt;/h3&gt;
&lt;ul data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;시간복잡도&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(Time Complexity)
&lt;ul&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;주어진 숫자 배열 길이에 따라 for문 반복하므로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;O(n)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;공간복잡도&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(Space Complexity)
&lt;ul&gt;
&lt;li&gt;주어진 숫자 배열 길이에 해당하는 HashSet을 사용하므로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #c0d1e7;&quot;&gt;O(n)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Sample(Test) :&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1618157443287&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

public class FindAnagramMapping {

    // time complexity : for loop for given array -&amp;gt; O(n)
    // space complexity : HashSet (length of given array) -&amp;gt; O(n)
    public int[] anagramMappings(int[] A, int[] B) {
        
        Map&amp;lt;Integer, Integer&amp;gt; anagramMap = new HashMap&amp;lt;&amp;gt;();
        for(int i = 0; i &amp;lt; B.length; i++){
            anagramMap.put(B[i], i);
        }

        int[] result = new int[A.length];
        for(int i = 0; i &amp;lt; A.length; i++){
            result[i] = anagramMap.get(A[i]);
        }

        return result;
    }

    public static void main(String[] args){
        int[] A1 = {12, 28, 46, 32, 50};
        int[] B1 = {50, 12, 32, 46, 28};
        int[] A2 = {1, 2, 3, 4, 5};
        int[] B2 = {5, 4, 3, 2, 1};

        FindAnagramMapping f = new FindAnagramMapping();
        System.out.println(Arrays.toString(f.anagramMappings(A1, B1)));
        System.out.println(Arrays.toString(f.anagramMappings(A2, B2)));
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 테스트 코드를 실행한 결과는 다음과 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1618157454980&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[1, 4, 3, 2, 0]
[4, 3, 2, 1, 0]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>KR/코딩테스트</category>
      <category>Easy</category>
      <category>LeetCode</category>
      <category>릿코드</category>
      <category>알고리즘</category>
      <category>이지</category>
      <category>자료구조</category>
      <category>코딩테스트</category>
      <author>개발개</author>
      <guid isPermaLink="true">https://the-dev.tistory.com/58</guid>
      <comments>https://the-dev.tistory.com/58#entry58comment</comments>
      <pubDate>Mon, 12 Apr 2021 12:37:00 +0900</pubDate>
    </item>
    <item>
      <title>[LeetCode/EASY] 53. Maximum Subarray (JAVA) : 문제&amp;amp;풀이</title>
      <link>https://the-dev.tistory.com/57</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;MaxSubArray.png&quot; data-origin-width=&quot;303&quot; data-origin-height=&quot;303&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k0GLr/btq2isgSuWA/koahR6C4OOdj3EZ349uwQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k0GLr/btq2isgSuWA/koahR6C4OOdj3EZ349uwQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k0GLr/btq2isgSuWA/koahR6C4OOdj3EZ349uwQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk0GLr%2Fbtq2isgSuWA%2FkoahR6C4OOdj3EZ349uwQk%2Fimg.png&quot; data-filename=&quot;MaxSubArray.png&quot; data-origin-width=&quot;303&quot; data-origin-height=&quot;303&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;주어진 숫자 배열에 대한 서브 배열 중 &lt;span style=&quot;background-color: #9feec3;&quot;&gt;합의 값이 가장 큰 서브 배열을 반&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;환&lt;/span&gt;하는&lt;/span&gt;&amp;nbsp;문제&lt;/span&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;예를 들어, {-2, &lt;span style=&quot;background-color: #9feec3;&quot;&gt;3, -1, 4&lt;/span&gt;}에서 합이 가장 큰 서브 배열은 {3, -1, 4}이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 중요한 점은 서브 배열은 반드시 연속된다는 점이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;({3, 4}와 같이 선택적 합은 불가능)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;int 배열을 매개변수로 받는&lt;span&gt;&lt;span&gt; &lt;span style=&quot;color: #333333;&quot;&gt;maxSubArray&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;메서드의 틀이 주어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Problem :&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1618117602140&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class MaximumSubarray {
    public int maxSubArray(int[] nums) {

    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;풀이는 주어진 maxSubArray 메서드에 작성하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Solution :&lt;/b&gt;&lt;/h3&gt;
&lt;ol data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;주어진 배열을 순서대로 돌며&lt;/span&gt;
&lt;ol&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;&quot;현재 인덱스의 값&quot;과 &quot;지난 서브 배열 + 현재 인덱스의 값&quot;&lt;/span&gt; 중 무엇이 더 큰지 비교한다.&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;&quot;1-1. 결과&quot;와 &quot;지금까지의 서브 배열 중 가장 큰 값&quot;&lt;/span&gt; 중 무엇이 더 큰지 비교한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;배열을 다 돌고 난 후, 최종적으로 &lt;span style=&quot;background-color: #9feec3;&quot;&gt;가장 큰 서브 배열의 합을 반환&lt;/span&gt;한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1618117612143&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class MaximumSubarray {

    // time complexity : for loop for given array -&amp;gt; O(n)
    // space complexity : just 2 variables regardless of the given array -&amp;gt; O(1)
    public int maxSubArray(int[] nums) {
        int currentSubarray = nums[0];
        int maxSubarray = nums[0];

        for(int i = 1; i &amp;lt; nums.length; i++){
            currentSubarray = Math.max(nums[i], currentSubarray + nums[i]);
            maxSubarray = Math.max(currentSubarray, maxSubarray);
        }

        return max;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이해하기 쉽게 그림으로 표현하면 다음과 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;MaxSubArray1.png&quot; data-origin-width=&quot;1137&quot; data-origin-height=&quot;1236&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ywMr6/btq2hISo7oI/fnGRYmEFDCysj19AzApoNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ywMr6/btq2hISo7oI/fnGRYmEFDCysj19AzApoNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ywMr6/btq2hISo7oI/fnGRYmEFDCysj19AzApoNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FywMr6%2Fbtq2hISo7oI%2FfnGRYmEFDCysj19AzApoNk%2Fimg.png&quot; data-filename=&quot;MaxSubArray1.png&quot; data-origin-width=&quot;1137&quot; data-origin-height=&quot;1236&quot; data-ke-mobilestyle=&quot;widthContent&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Complexity :&lt;/b&gt;&lt;/h3&gt;
&lt;ul data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;시간복잡도&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(Time Complexity)
&lt;ul&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;주어진 숫자 배열 길이에 따라 while문 반복하므로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;O(n)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;공간복잡도&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(Space Complexity)
&lt;ul&gt;
&lt;li&gt;주어지는 nums 배열의 크기와 상관없이 무조건 int 변수 2개만 사용하므로 &lt;span style=&quot;background-color: #9feec3;&quot;&gt;O(1)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Sample(Test) :&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1618117620883&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class MaximumSubarray {

    // time complexity : for loop for given array -&amp;gt; O(n)
    // space complexity : just 2 variables regardless of the given array -&amp;gt; O(1)
    public int maxSubArray(int[] nums) {
        int currentSubarray = nums[0];
        int maxSubarray = nums[0];

        for(int i = 1; i &amp;lt; nums.length; i++){
            currentSubarray = Math.max(nums[i], currentSubarray + nums[i]);
            maxSubarray = Math.max(currentSubarray, maxSubarray);
        }

        return max;
    }

    public static void main(String[] agrs){
        int[] nums = {-2,3,-1,4};
        int[] nums1 = {2,1,-3,4,-1,2,1,-5,4};
        int[] nums2 = {1};
        int[] nums3 = {5,4,-1,7,8};

        MaximumSubarray m = new MaximumSubarray();
        System.out.println(m.maxSubArray(nums));
        System.out.println(m.maxSubArray(nums1));
        System.out.println(m.maxSubArray(nums2));
        System.out.println(m.maxSubArray(nums3));
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 테스트 코드를 실행한 결과는 다음과 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1618117641471&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;6
6
1
23&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>KR/코딩테스트</category>
      <category>Easy</category>
      <category>LeetCode</category>
      <category>릿코드</category>
      <category>알고리즘</category>
      <category>이지</category>
      <category>자료구조</category>
      <category>코딩테스트</category>
      <author>개발개</author>
      <guid isPermaLink="true">https://the-dev.tistory.com/57</guid>
      <comments>https://the-dev.tistory.com/57#entry57comment</comments>
      <pubDate>Mon, 12 Apr 2021 00:47:39 +0900</pubDate>
    </item>
  </channel>
</rss>