<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>코딩하는 해달이</title>
    <link>https://coreeny.tistory.com/</link>
    <description>00년생 해달이의 인생 열심히 살기 프로젝트</description>
    <language>ko</language>
    <pubDate>Fri, 3 Jul 2026 12:22:38 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>코딩하는 해달</managingEditor>
    <image>
      <title>코딩하는 해달이</title>
      <url>https://tistory1.daumcdn.net/tistory/5475491/attach/32c407496636400fa339c129cdd88c46</url>
      <link>https://coreeny.tistory.com</link>
    </image>
    <item>
      <title>[정렬] 삽입 정렬</title>
      <link>https://coreeny.tistory.com/207</link>
      <description>&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1. 삽입 정렬이란?&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;삽입 정렬(Insertion Sort)은 간단하고 직관적인 정렬 알고리즘입니다. 이 알고리즘은 데이터가 거의 정렬된 상태일 때 매우 효율적이며, 작은 데이터셋을 정렬할 때 유용합니다. 삽입 정렬은 리스트를 순차적으로 탐색하면서 정렬된 부분과 정렬되지 않은 부분으로 나누고, 정렬되지 않은 부분의 요소를 하나씩 꺼내어 적절한 위치에 삽입하여 정렬된 부분을 확장해 나갑니다. 이러한 방식 덕분에 데이터의 안정성을 유지할 수 있는 안정 정렬(stable sort)입니다.&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2. 삽입 정렬 과정&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;프레젠테이션2.gif&quot; data-origin-width=&quot;853&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Nv30W/btsKoZiY8f6/ML0MlaMhhUwqpgIL1qgVo0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Nv30W/btsKoZiY8f6/ML0MlaMhhUwqpgIL1qgVo0/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Nv30W/btsKoZiY8f6/ML0MlaMhhUwqpgIL1qgVo0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/Nv30W/btsKoZiY8f6/ML0MlaMhhUwqpgIL1qgVo0/img.gif&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;684&quot; height=&quot;385&quot; data-filename=&quot;프레젠테이션2.gif&quot; data-origin-width=&quot;853&quot; data-origin-height=&quot;480&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3. 작업 순서&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #000000; text-align: start;&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;li&gt;요소를 해당 위치에 삽입하고, 나머지 요소들을 오른쪽으로 이동시킵니다.&lt;/li&gt;
&lt;li&gt;리스트의 모든 요소가 정렬될 때까지 이 과정을 반복합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;4. 시간 복잡도&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최선의 경우: (O(n)) - 이미 정렬된 리스트인 경우.&lt;/li&gt;
&lt;li&gt;평균 및 최악의 경우: (O(n^2)) - 요소들이 역순으로 정렬된 경우.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;삽입 정렬은 간단하지만, 큰 데이터셋에 대해서는 비효율적일 수 있습니다. 그러나 데이터가 거의 정렬된 상태라면 효율적으로 작동하며, 공간 복잡도가 (O(1))로 메모리를 적게 사용한다는 장점이 있습니다.&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;5. 공간 복잡도&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;삽입 정렬의 공간 복잡도는 (O(1))입니다. 이는 별도의 추가 메모리 공간을 거의 사용하지 않기 때문입니다. 삽입 정렬은 제자리 정렬(in-place sort) 알고리즘으로, 입력 리스트 외에 약간의 추가 저장 공간만 필요합니다. 이 점은 메모리 사용량이 중요한 환경에서 큰 장점으로 작용할 수 있습니다.&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;6. 코드&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;아래는 자바(java)로 구현한 삽입 정렬의 예제 코드입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1730294301113&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class InsertionSort {

    // 삽입 정렬 함수
    public static void insertionSort(int[] arr) {
        // 리스트의 두 번째 요소부터 시작
        for (int i = 1; i &amp;lt; arr.length; i++) {
            int key = arr[i];
            int j = i - 1;
            // 정렬된 부분의 요소와 비교하여 적절한 위치를 찾음
            while (j &amp;gt;= 0 &amp;amp;&amp;amp; arr[j] &amp;gt; key) {
                arr[j + 1] = arr[j];
                j = j - 1;
            }
            arr[j + 1] = key;
        }
    }

    // 메인 함수
    public static void main(String[] args) {
        int[] data = {9, 5, 1, 4, 3};
        insertionSort(data);
        for (int i = 0; i &amp;lt; data.length; i++) {
            System.out.print(data[i] + &quot; &quot;);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개인 공부/알고리즘&amp;amp;자료구조</category>
      <author>코딩하는 해달</author>
      <guid isPermaLink="true">https://coreeny.tistory.com/207</guid>
      <comments>https://coreeny.tistory.com/207#entry207comment</comments>
      <pubDate>Wed, 30 Oct 2024 22:53:11 +0900</pubDate>
    </item>
    <item>
      <title>[정렬] 선택 정렬</title>
      <link>https://coreeny.tistory.com/206</link>
      <description>&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;선택 정렬이란?&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;선택 정렬은 제자리 정렬(In- place sorting) 알고리즘의 하나로 원소를 넣을 위치는 이미 정해져있으며, 어떤 원소를 넣을지 선택하는 알고리즘입니다.&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;선택 정렬 과정&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;프레젠테이션1.gif&quot; data-origin-width=&quot;853&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTGXdg/btsKnsZHTdU/pgTJv7fIlkmLilT0Oo5tv0/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTGXdg/btsKnsZHTdU/pgTJv7fIlkmLilT0Oo5tv0/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTGXdg/btsKnsZHTdU/pgTJv7fIlkmLilT0Oo5tv0/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/cTGXdg/btsKnsZHTdU/pgTJv7fIlkmLilT0Oo5tv0/img.gif&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;615&quot; height=&quot;346&quot; data-filename=&quot;프레젠테이션1.gif&quot; data-origin-width=&quot;853&quot; data-origin-height=&quot;480&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;작업 순서&lt;/h2&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;li&gt;반복&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시간 복잡도&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최악, 평균, 최선 모든 경우에 O(n^2)의 시간 복잡도를 가집니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;공간 복잡도&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;O(1): 제자리 정렬 알고리즘으로 추가적인 메모리 사용이 거의 없습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;장점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구현이 간단하고 이해하기 쉽습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;단점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간 복잡도가 O(n^2)이기 때문에, 데이터의 크기가 큰 경우 비효율적입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;코드&lt;/h3&gt;
&lt;pre id=&quot;code_1730276668199&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    public void selectionSort(int[] array) {
        int n = array.length;

        // 배열을 순회하면서 정렬
        for (int i = 0; i &amp;lt; n - 1; i++) {
            // 현재 범위에서 가장 작은 원소의 인덱스를 찾습니다.
            int minIndex = i;
            for (int j = i + 1; j &amp;lt; n; j++) {
                if (array[j] &amp;lt; array[minIndex]) {
                    minIndex = j;
                }
            }
            swap(array, i, minIndex);
        }
    }

    private void swap(int[] array, int i, int j) {
        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개인 공부/알고리즘&amp;amp;자료구조</category>
      <category>선택정렬</category>
      <category>알고리즘</category>
      <category>정렬</category>
      <author>코딩하는 해달</author>
      <guid isPermaLink="true">https://coreeny.tistory.com/206</guid>
      <comments>https://coreeny.tistory.com/206#entry206comment</comments>
      <pubDate>Wed, 30 Oct 2024 11:38:30 +0900</pubDate>
    </item>
    <item>
      <title>[정렬] 버블 정렬</title>
      <link>https://coreeny.tistory.com/205</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;버블 정렬이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버블 정렬은 무작위로 배치되어있는 요소들을 일정한 기준에 맞추어 정렬하는데 그 방법이 &lt;b&gt;인접한 두 요소를 비교&lt;/b&gt;하여 의도한 순서가 될 때까지 교체하는 알고리즘입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;버블 정렬 과정&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;C1.gif&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B4UuE/btsKkrmepnG/3cymS7BjOMjmXqSZCkp280/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B4UuE/btsKkrmepnG/3cymS7BjOMjmXqSZCkp280/img.gif&quot; data-alt=&quot;Cycle 1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B4UuE/btsKkrmepnG/3cymS7BjOMjmXqSZCkp280/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/B4UuE/btsKkrmepnG/3cymS7BjOMjmXqSZCkp280/img.gif&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;555&quot; height=&quot;312&quot; data-filename=&quot;C1.gif&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;608&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Cycle 1&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;c2.gif&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lIQwI/btsKmRXGLMi/3aftwyD1Gj5UzdwbxnBEs1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lIQwI/btsKmRXGLMi/3aftwyD1Gj5UzdwbxnBEs1/img.gif&quot; data-alt=&quot;Cycle 2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lIQwI/btsKmRXGLMi/3aftwyD1Gj5UzdwbxnBEs1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/lIQwI/btsKmRXGLMi/3aftwyD1Gj5UzdwbxnBEs1/img.gif&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;555&quot; height=&quot;312&quot; data-filename=&quot;c2.gif&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;608&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Cycle 2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;c3.gif&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzHExW/btsKlWSVkP4/0i26STNkoyvu4yVdTC4K50/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzHExW/btsKlWSVkP4/0i26STNkoyvu4yVdTC4K50/img.gif&quot; data-alt=&quot;Cycle 3&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzHExW/btsKlWSVkP4/0i26STNkoyvu4yVdTC4K50/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bzHExW/btsKlWSVkP4/0i26STNkoyvu4yVdTC4K50/img.gif&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;555&quot; height=&quot;608&quot; data-filename=&quot;c3.gif&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;608&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Cycle 3&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;c4.gif&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LvqvZ/btsKlZa4qo1/OLN4EPmkrOix2qk2NkY4yk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LvqvZ/btsKlZa4qo1/OLN4EPmkrOix2qk2NkY4yk/img.gif&quot; data-alt=&quot;Cycle 4&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LvqvZ/btsKlZa4qo1/OLN4EPmkrOix2qk2NkY4yk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/LvqvZ/btsKlZa4qo1/OLN4EPmkrOix2qk2NkY4yk/img.gif&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;555&quot; height=&quot;312&quot; data-filename=&quot;c4.gif&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;608&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Cycle 4&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;c5.gif&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMBkGk/btsKmTuqeJC/JXEClvdzPW8J4KmmwsQIg1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMBkGk/btsKmTuqeJC/JXEClvdzPW8J4KmmwsQIg1/img.gif&quot; data-alt=&quot;Cycle 5&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMBkGk/btsKmTuqeJC/JXEClvdzPW8J4KmmwsQIg1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bMBkGk/btsKmTuqeJC/JXEClvdzPW8J4KmmwsQIg1/img.gif&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;555&quot; height=&quot;312&quot; data-filename=&quot;c5.gif&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;608&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Cycle 5&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;c6.gif&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhLw5m/btsKkYYncDq/Qpb44JoxbMBuO43OLdwP0K/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhLw5m/btsKkYYncDq/Qpb44JoxbMBuO43OLdwP0K/img.gif&quot; data-alt=&quot;Cycle 6&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhLw5m/btsKkYYncDq/Qpb44JoxbMBuO43OLdwP0K/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bhLw5m/btsKkYYncDq/Qpb44JoxbMBuO43OLdwP0K/img.gif&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;555&quot; height=&quot;312&quot; data-filename=&quot;c6.gif&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;608&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Cycle 6&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;작업 순서&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;첫 번째 인덱스부터 시작해서 &lt;b&gt;두 요소&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;li&gt;이제 두 번째 요소와 세 번째 요소를 &lt;b&gt;비교&lt;/b&gt;하여 교체가 필요한 경우 &lt;b&gt;교체&lt;/b&gt;한다.&lt;/li&gt;
&lt;li&gt;마지막 요소까지 반복한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;시간 복잡도&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사이클을 돌 때마다 n, n-1, n-2, .... , 2, 1번 실행되게 되므로 &lt;b&gt;시간 복잡도&lt;/b&gt;는 &lt;code&gt;O(n^2)&lt;/code&gt;이다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 코드로 나타내면 다음과 같다.&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public void bubbleSort(int[] array) {
        int n = array.length;

        // 배열의 모든 요소에 대해 반복
        for (int i = 0; i &amp;lt; n - 1; i++) {

            // 배열의 인접 요소 쌍을 비교
            for (int j = 0; j &amp;lt; n - 1 - i; j++) {
                if (array[j] &amp;gt; array[j + 1]) {
                    // 요소가 잘못된 순서라면 교환
                    int temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;
                }
            }
        }
    }&lt;/code&gt;&lt;/pre&gt;</description>
      <category>개인 공부/알고리즘&amp;amp;자료구조</category>
      <category>버블 정렬</category>
      <category>알고리즘</category>
      <category>정렬</category>
      <author>코딩하는 해달</author>
      <guid isPermaLink="true">https://coreeny.tistory.com/205</guid>
      <comments>https://coreeny.tistory.com/205#entry205comment</comments>
      <pubDate>Mon, 28 Oct 2024 10:09:04 +0900</pubDate>
    </item>
    <item>
      <title>[트러블 슈팅] 안드로이드 애플리케이션 배포 시 구글 로그인이 안되는 문제</title>
      <link>https://coreeny.tistory.com/204</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 개요&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;Android Studio를 사용해서 애플리케이션을 개발하고 배포할 경우에 흔히 발생 할 수 있는&lt;code&gt; com.google.android.gms .common.api.ApiException: 10&lt;/code&gt; 오류를 해결한 케이스에 대해 다뤄보려합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2.트러블 슈팅&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.1 배경 (아키텍처 다이어그램)&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;login logic.png&quot; data-origin-width=&quot;481&quot; data-origin-height=&quot;281&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VkpUy/btsKkpurVA6/rkAkzdlN3lvsfo9mOwwfy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VkpUy/btsKkpurVA6/rkAkzdlN3lvsfo9mOwwfy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VkpUy/btsKkpurVA6/rkAkzdlN3lvsfo9mOwwfy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVkpUy%2FbtsKkpurVA6%2FrkAkzdlN3lvsfo9mOwwfy1%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;481&quot; height=&quot;281&quot; data-filename=&quot;login logic.png&quot; data-origin-width=&quot;481&quot; data-origin-height=&quot;281&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;2.2 발단&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 환경은 안드로이드 스튜디오에서 아래의 라이브러리를 사용해 구현한 구글 로그인 기능이 개발 환경에서 실행할 경우에는 잘 작동이 되지만 google play console에 번들을 통해 테스트를 올리면 로그인이 안되는 오류가 발생했습니다.&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;play-services-auth:21.0.0
com.google.gms:google-services:4.4.1
androidx.credentials:credentials:1.3.0-alpha02&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때 오류메시지는 다음과 같았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;com.google.android.gms .common.api.ApiException: 10&lt;/code&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 에러는 애플리케이션의 SHA-1 key 값과 구글 로그인 api에 등록된 SHA-1 key 값이 동일하지 않을 때 발생하는 오류였습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.3 전개&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안드로이드 스튜디오에서 sha 인증키를 확인해보았습니다.&lt;br /&gt;sha 키 확인하는 방법은 &lt;a href=&quot;https://coreeny.tistory.com/74&quot;&gt;여기&lt;/a&gt;를 확인해보면 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;GCP_window.PNG&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAQ5HA/btsKk2yXk7H/4qFlfcr1WmcYgOa6jT8R91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAQ5HA/btsKk2yXk7H/4qFlfcr1WmcYgOa6jT8R91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAQ5HA/btsKk2yXk7H/4qFlfcr1WmcYgOa6jT8R91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAQ5HA%2FbtsKk2yXk7H%2F4qFlfcr1WmcYgOa6jT8R91%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;1280&quot; height=&quot;1400&quot; data-filename=&quot;GCP_window.PNG&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;studio_sha_key.PNG&quot; data-origin-width=&quot;535&quot; data-origin-height=&quot;27&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSsw4A/btsKj1gLTzl/6PV8K4HpdrQfmf88vkqknk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSsw4A/btsKj1gLTzl/6PV8K4HpdrQfmf88vkqknk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSsw4A/btsKj1gLTzl/6PV8K4HpdrQfmf88vkqknk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSsw4A%2FbtsKj1gLTzl%2F6PV8K4HpdrQfmf88vkqknk%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;535&quot; height=&quot;27&quot; data-filename=&quot;studio_sha_key.PNG&quot; data-origin-width=&quot;535&quot; data-origin-height=&quot;27&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;2.4 위기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확인해본뒤 SHA-1 키를 다시 붙여넣기하고 빌드를 한 후에 테스트로 올려봤음에도 같은 오류가 발생했습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.5 절정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이렇게 며칠을 날리고 보니 문득 드는 생각이 빌드한 번들을 테스트에 올릴 때 APK를 설정해주는 절차가 있었던 것 같은 느낌에 다시 들어가서 찾아보니..&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;앱 서명 버전.PNG&quot; data-origin-width=&quot;1404&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bT4VoZ/btsKjZJ6J6K/evlQxc7TVKeTvEf7XHAY8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bT4VoZ/btsKjZJ6J6K/evlQxc7TVKeTvEf7XHAY8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bT4VoZ/btsKjZJ6J6K/evlQxc7TVKeTvEf7XHAY8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbT4VoZ%2FbtsKjZJ6J6K%2FevlQxc7TVKeTvEf7XHAY8K%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;1404&quot; height=&quot;1040&quot; data-filename=&quot;앱 서명 버전.PNG&quot; data-origin-width=&quot;1404&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알고보니 배포할 때는 구글에서 서명한 sha키를 사용했어야합니다...&lt;br /&gt;구글의 sha키는 여기서 확인하면 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;앱 서명 본.PNG&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1056&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEH9oX/btsKlHgvjKD/419qAIE25Ju00AgdMfqAzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEH9oX/btsKlHgvjKD/419qAIE25Ju00AgdMfqAzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEH9oX/btsKlHgvjKD/419qAIE25Ju00AgdMfqAzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEH9oX%2FbtsKlHgvjKD%2F419qAIE25Ju00AgdMfqAzk%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;1440&quot; height=&quot;1056&quot; data-filename=&quot;앱 서명 본.PNG&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1056&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.6 결말&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배포가 처음이라 확인을 못한것도 문제였고.. 다음부터는 배포할 때 좀 더 확인을 하고 진행해야겠다는 생각을 했습니다.&lt;/p&gt;</description>
      <category>개인 공부/Android Studio</category>
      <category>안드로이드 스튜디오</category>
      <category>트러블 슈팅</category>
      <author>코딩하는 해달</author>
      <guid isPermaLink="true">https://coreeny.tistory.com/204</guid>
      <comments>https://coreeny.tistory.com/204#entry204comment</comments>
      <pubDate>Fri, 25 Oct 2024 20:29:26 +0900</pubDate>
    </item>
    <item>
      <title>RESTful API</title>
      <link>https://coreeny.tistory.com/203</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;RESTful API란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;두 컴퓨터 시스템이 인터넷을 통해 &lt;b&gt;정보를 안전하게 교환하기 위해 사용&lt;/b&gt;하는 인터페이스이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;API란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애플리케이션 프로그래밍 인터페이스(API)는 다른 소프트웨어 시스템과 &lt;b&gt;통신하기 위해 따라야 하는 규칙을 정의&lt;/b&gt;한다. 개발자는 다른 애플리케이션이 프로그래밍 방식으로 애플리케이션과 통신할 수 있도록 API를 표시하거나 생성한다. 따라서 웹 API는 클라이언트와 웹 리소스 사이의 게이트웨이라고 생각할 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;클라이언트&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트는 웹에서 정보에 액세스하려는 &lt;b&gt;사용자&lt;/b&gt;이다. 클라이언트는 API를 사용하는 사람 뿐아니라 소프트웨어 시스템일 수도 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;리소스&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리소스는 다양한 애플리케이션이 &lt;b&gt;클라이언트에게 제공하는 정보&lt;/b&gt;이다. 리소스는 이미지, 동영상, 텍스트, 숫자 또는 모든 유형의 데이터 일 수 있다. 클라이언트에 리소스를 제공하는 시스템을 서버라고도 한다. 서비스 제공자는 API를 사용하여 리소스를 공유하고 보안, 제어 및 인증을 유지하며 웹 서비스를 제공한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;REST란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;REST는 Representational State Transfer의 약자로 &lt;b&gt;API 작동 방식에 대한 조건을 부과&lt;/b&gt;하는 소프트웨어 아키텍처이다. REST기반 아키텍처를 사용하면 대규모 고성능 통신을 안정적으로 지원할 수 있고 쉽게 구현하고 수정할 수 있어 모든 API 시스템을 파악하고 여러 플랫폼에서 사용할 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;REST 아키텍처 스타일의 원칙&lt;/b&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;균일한 인터페이스&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 RESTful API의 기본이다. 이는 서버가 &lt;b&gt;표준 형식으로 정보를 전송함을 의미&lt;/b&gt;한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&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;br /&gt;(균일한 리소스 식별자 사용)&lt;/li&gt;
&lt;li&gt;클라이언트는 원하는 경우 리소스를 수정하거나 삭제하기에 충분한 정보를 리소스 표현에서 가지고 있음.&lt;br /&gt;(서버는 리소스를 자세히 설명하는 메타데이터 제공)&lt;/li&gt;
&lt;li&gt;클라이언트는 표현을 추가로 처리하는 방법에 대한 정보 수신.&lt;br /&gt;(서버는 클라이언트가 리소스를 적절히 사용할 수 있는 방법에 대한 메타데이터 제공)&lt;/li&gt;
&lt;li&gt;클라이언트는 작업을 완료하는 데 필요한 다른 모든 관련 리소스에 대한 정보를 수신&lt;br /&gt;(서버는 클라이언트가 더 많은 리소스를 동적으로 검색할 수 있도록 표현에 하이퍼링크를 넣어 전송)&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;무상태&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 요청은 서로 독립적이며, 서버는 &lt;b&gt;이전의 요청상태를 기억하지 않음&lt;/b&gt;을 의미한다. 따라서 클라이언트는 필요한 모든 정보를 요청에 포함하여야 한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;계층화 시스템&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;REST 서버는 &lt;b&gt;다중 계층으로 구성&lt;/b&gt;될 수 있으며 보안, 로드 밸런싱 등 다양한 중간계층을 보함 할 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;캐시 가능성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 응답 시간을 개선하기 위해 클라이언트 또는 중개자에 일부 응답을 저장하는 프로세스인 &lt;b&gt;캐싱을 지원&lt;/b&gt;한다. 따라서 RESTful 웹 서비스는 캐시 가능 또는 캐시 불가능으로 정의되는 API 응답을 사용하여 캐싱을 제어할 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;온디맨드 코드&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버는 소프트웨어 프로그래밍 코드를 클라이언트에 전송하여 클라이언트 기능을 일시적으로 확장하거나 사용자를 지정할 수 있다. EX) 웹 사이트에서 등록 양식을 작성하면 브라우저는 잘못된 전화번호와 같은 실수를 즉시 강조 표시함 &amp;larr; 서버에서 전송한 코드를 통해 수행 가능&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;REST API 설계 규칙&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;- URL 규칙&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;URI 경로에는 소문자 사용&lt;/li&gt;
&lt;li&gt;언더바(_) 대신 하이픈(-)을 사용(가독성을 위함)&lt;/li&gt;
&lt;li&gt;마지막에 슬래시(/)를 포함하지 않음&lt;/li&gt;
&lt;li&gt;행위는 포함하지 않음
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;행위는 메서드를 사용하여 전달(GET, POST, PUT 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;파일 확장자는 URI에 포함하지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;- HTTP 메서드 활용&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;GET: Read(조회)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;POST: Create (생성)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;PUT: Update (전체 수정)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;PATCH: Update (일부 수정)&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;DELETE: Delete (정보 삭제)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;- HTTP 응답 상태 코드 활용&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1xx: 정보 응답 / 2xx: 성공 응답 / 3xx: 리다이렉트 / 4xx: 클라이언트 요청 오류 / 5xx: 서버 오류&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개인 공부/Spring</category>
      <author>코딩하는 해달</author>
      <guid isPermaLink="true">https://coreeny.tistory.com/203</guid>
      <comments>https://coreeny.tistory.com/203#entry203comment</comments>
      <pubDate>Mon, 21 Oct 2024 11:51:15 +0900</pubDate>
    </item>
    <item>
      <title>[CSLU] 개인정보 처리 방침</title>
      <link>https://coreeny.tistory.com/202</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1번.PNG&quot; data-origin-width=&quot;795&quot; data-origin-height=&quot;1124&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TqnRl/btsJOjNSDNf/mavSSN2RpiAkyLpKk9oQAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TqnRl/btsJOjNSDNf/mavSSN2RpiAkyLpKk9oQAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TqnRl/btsJOjNSDNf/mavSSN2RpiAkyLpKk9oQAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTqnRl%2FbtsJOjNSDNf%2FmavSSN2RpiAkyLpKk9oQAk%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;795&quot; height=&quot;1124&quot; data-filename=&quot;1번.PNG&quot; data-origin-width=&quot;795&quot; data-origin-height=&quot;1124&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2번.PNG&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;1124&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMdf5y/btsJNfZ6CmB/yVt9FY6ZsCfDIW3lkQj3MK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMdf5y/btsJNfZ6CmB/yVt9FY6ZsCfDIW3lkQj3MK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMdf5y/btsJNfZ6CmB/yVt9FY6ZsCfDIW3lkQj3MK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMdf5y%2FbtsJNfZ6CmB%2FyVt9FY6ZsCfDIW3lkQj3MK%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;796&quot; height=&quot;1124&quot; data-filename=&quot;2번.PNG&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;1124&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3번.PNG&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;1123&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byGojE/btsJN2yRBvq/FJaSIMfet7LoQBEtCym4t1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byGojE/btsJN2yRBvq/FJaSIMfet7LoQBEtCym4t1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byGojE/btsJN2yRBvq/FJaSIMfet7LoQBEtCym4t1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyGojE%2FbtsJN2yRBvq%2FFJaSIMfet7LoQBEtCym4t1%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;794&quot; height=&quot;1123&quot; data-filename=&quot;3번.PNG&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;1123&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <author>코딩하는 해달</author>
      <guid isPermaLink="true">https://coreeny.tistory.com/202</guid>
      <comments>https://coreeny.tistory.com/202#entry202comment</comments>
      <pubDate>Thu, 26 Sep 2024 16:12:12 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] Gradle이란?</title>
      <link>https://coreeny.tistory.com/201</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Gradle&lt;/b&gt;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Java나 Groovy, Kotlin등 여러 유형의 소프트웨어를 빌드할 수 있는 &lt;b&gt;오픈 소스 빌드 자동화 도구&lt;/b&gt;이다. Gradle은 빌드하려는 대상이나 방법을 거의 고정하지 않아 유연하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Gradle이 자동화 할 수 있는 작업들&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Compile - Java 파일의 소스코드를 컴퓨터가 이해할 수 있도록 바이트 코드로 변환&lt;/li&gt;
&lt;li&gt;Test - 유닛 테스트, UI 테스트&lt;/li&gt;
&lt;li&gt;Packaging - 스프링 코드를 패키징 해 .jar 파일이나, .war 파일로 생성&lt;/li&gt;
&lt;li&gt;Deploy &amp;amp; Run - 서버 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;용어 정리&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로젝트 - Gradle이 빌드하는 것, 프로젝트에는 빌드 스크립트가 포함되며 해당 프로젝트에 대한 &lt;b&gt;태스크, 의존성, 플러그인 및 기타 구성&lt;/b&gt;을 정의한다.&lt;/li&gt;
&lt;li&gt;태스크 - 코드 컴파일, 테스트 실행 또는 배포와 같은 &lt;b&gt;특정 작업을 실행하기 위한 로직&lt;/b&gt;을 포함하는 기본단위&lt;/li&gt;
&lt;li&gt;플러그인 - 로직과 구성을 재사용할 수 있는 수단을 제공하는 모듈, 플러그인을 사용함으로써 빌드 스크립트의 중복을 줄일 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Gradle Project 구성&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;249&quot; data-origin-height=&quot;336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZukcU/btsJMpHBL9S/Ah0bV1fsOu9IM0s7Amg3Sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZukcU/btsJMpHBL9S/Ah0bV1fsOu9IM0s7Amg3Sk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZukcU/btsJMpHBL9S/Ah0bV1fsOu9IM0s7Amg3Sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZukcU%2FbtsJMpHBL9S%2FAh0bV1fsOu9IM0s7Amg3Sk%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;249&quot; height=&quot;336&quot; data-origin-width=&quot;249&quot; data-origin-height=&quot;336&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;.gradle - gradle 버전 별 엔진 및 설정 파일&lt;/li&gt;
&lt;li&gt;.idea - 에디터 관련 파일&lt;/li&gt;
&lt;li&gt;gradle/wrapper - 사용자가 Gradle을 설치하지 않아도 태스크를 실행할 수 있도록 도와줌
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;gradle-wrapper.jar - Wrapper 파일로 실행 스크립트가 동작하면 Wrapper에 맞는 환경을 로컬 캐시가 다운로드 받고 명령에 해당하는 태스크 실행&lt;/li&gt;
&lt;li&gt;gradle-wrapper.properties - gradle Wrapper 설정 파일&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;gradlew - Unix용 실행 스크립트&lt;/li&gt;
&lt;li&gt;gradlew.bat - Windows용 실행 스크립트&lt;/li&gt;
&lt;li&gt;build.gradle - 의존성이나 플러그인 설정 등 프로젝트 빌드에 대한 모든 기능 정의&lt;/li&gt;
&lt;li&gt;settings.gradle - 빌드할 프로젝트 정보 설정&lt;/li&gt;
&lt;/ul&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;b&gt;Maven&lt;/b&gt;&lt;/h4&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; : 주로 Java&lt;/li&gt;
&lt;li&gt;&lt;b&gt;구성&lt;/b&gt; : XML 기반의 pom.xml 파일을 사용하여 프로젝트 의존성과 빌드 설정을 정의&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특징&lt;/b&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;li&gt;XML 구성이 비교적 복잡&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Gradle&lt;/b&gt;&lt;/h4&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; : Java, Groovy, Kotlin&lt;/li&gt;
&lt;li&gt;&lt;b&gt;구성&lt;/b&gt; : Groovy 또는 Kotlin DSL을 사용하여 build.gradle 파일로 정의&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특징&lt;/b&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;li&gt;병렬 빌드를 지원, 대규모 프로젝트에서 효율적&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Ant&lt;/b&gt;&lt;/h4&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;: Java&lt;/li&gt;
&lt;li&gt;&lt;b&gt;구성&lt;/b&gt;: XML 기반의 build.xml 파일을 사용&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특징&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;매우 유연, 기본적으로 의존성 관리 기능 제공 X&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Make&lt;/b&gt;&lt;/h4&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;: 주로 C/C++&lt;/li&gt;
&lt;li&gt;&lt;b&gt;구성&lt;/b&gt;: Makefile을 사용하여 빌드 명령과 의존성 정의&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특징&lt;/b&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;li&gt;UNIX 기반 시스템에서 주로 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Bazel&lt;/b&gt;&lt;/h4&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;li&gt;&lt;b&gt;구성&lt;/b&gt;: Starlark 스크립트를 사용하여 빌드 구성을 정의&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특징&lt;/b&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;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;SBT(Simple Build Tool)&lt;/b&gt;&lt;/h4&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;: Scala, Java&lt;/li&gt;
&lt;li&gt;&lt;b&gt;구성&lt;/b&gt;: Scala DSL로 빌드 설정을 정의&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특징&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Scala와 Java 프로젝트에 적합, REPL 환경을 제공하여 빠른 피드백 가능&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개인 공부/Spring</category>
      <category>Gradle</category>
      <category>빌드</category>
      <category>자동화 도구</category>
      <author>코딩하는 해달</author>
      <guid isPermaLink="true">https://coreeny.tistory.com/201</guid>
      <comments>https://coreeny.tistory.com/201#entry201comment</comments>
      <pubDate>Wed, 25 Sep 2024 16:33:05 +0900</pubDate>
    </item>
    <item>
      <title>[백 준 Java] 1759번 : 암호만들기</title>
      <link>https://coreeny.tistory.com/200</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;문제 설명&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;바로 어제 최백준 조교가 방 열쇠를 주머니에 넣은 채 깜빡하고 서울로 가 버리는 황당한 상황에 직면한 조교들은, 702호에 새로운 보안 시스템을 설치하기로 하였다. 이 보안 시스템은 열쇠가 아닌 암호로 동작하게 되어 있는 시스템이다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;암호는 서로 다른 L개의 알파벳 소문자들로 구성되며 최소 한 개의 모음(a, e, i, o, u)과 최소 두 개의 자음으로 구성되어 있다고 알려져 있다. 또한 정렬된 문자열을 선호하는 조교들의 성향으로 미루어 보아 암호를 이루는 알파벳이 암호에서 증가하는 순서로 배열되었을 것이라고 추측된다. 즉, abc는 가능성이 있는 암호이지만 bac는 그렇지 않다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;새 보안 시스템에서 조교들이 암호로 사용했을 법한 문자의 종류는 C가지가 있다고 한다. 이 알파벳을 입수한 민식, 영식 형제는 조교들의 방에 침투하기 위해 암호를 추측해 보려고 한다. C개의 문자들이 모두 주어졌을 때, 가능성 있는 암호들을 모두 구하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&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: #ffffff; color: #555555; text-align: start;&quot;&gt;첫째 줄에 두 정수 L, C가 주어진다. (3 &amp;le; L &amp;le; C&amp;nbsp;&amp;le; 15) 다음 줄에는 C개의 문자들이 공백으로 구분되어 주어진다. 주어지는 문자들은 알파벳 소문자이며, 중복되는 것은 없다.&lt;/span&gt;&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: #ffffff; color: #555555; text-align: start;&quot;&gt;각 줄에 하나씩, 사전식으로 가능성 있는 암호를 모두 출력한다.&lt;/span&gt;&lt;/p&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; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/tag/124&quot;&gt;수학&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/tag/125&quot;&gt;브루트포스 알고리즘&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/tag/6&quot;&gt;조합론&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/tag/5&quot;&gt;백트래킹&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;풀이코드&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667561401668&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.*;

public class Main {
    static int L, C;
    static char[] chars;
    static List&amp;lt;String&amp;gt; results = new ArrayList&amp;lt;&amp;gt;();

    static final char[] VOWELS = {'a', 'e', 'i', 'o', 'u'};

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        L = sc.nextInt();
        C = sc.nextInt();
        chars = new char[C];

        for (int i = 0; i &amp;lt; C; i++) {
            chars[i] = sc.next().charAt(0);
        }

        Arrays.sort(chars); // [a, c, i, s, t, w]
        generatePassword(0, new StringBuilder(), 0, 0);

        for (String password : results) {
            System.out.println(password);
        }
    }

    static void generatePassword(int index, StringBuilder current, int vowelsCount, int consonantsCount) {
        if (current.length() == L) {
            if (vowelsCount &amp;gt;= 1 &amp;amp;&amp;amp; consonantsCount &amp;gt;= 2) {
                results.add(current.toString());
            }
            return;
        }

        for (int i = index; i &amp;lt; C; i++) {
            current.append(chars[i]);
            if (isVowel(chars[i])) {
                generatePassword(i + 1, current, vowelsCount + 1, consonantsCount);
            } else {
                generatePassword(i + 1, current, vowelsCount, consonantsCount + 1);
            }
            current.deleteCharAt(current.length() - 1);
        }
    }

    static boolean isVowel(char c) {
        for (char v : VOWELS) {
            if (c == v) return true;
        }
        return false;
    }
}&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;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1759&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/1759&lt;/a&gt;&lt;/p&gt;</description>
      <category>개인 공부/백준</category>
      <category>Java</category>
      <category>백준</category>
      <category>자바</category>
      <author>코딩하는 해달</author>
      <guid isPermaLink="true">https://coreeny.tistory.com/200</guid>
      <comments>https://coreeny.tistory.com/200#entry200comment</comments>
      <pubDate>Tue, 24 Sep 2024 20:06:11 +0900</pubDate>
    </item>
    <item>
      <title>[디자인 패턴] MVC 패턴</title>
      <link>https://coreeny.tistory.com/199</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;MVC Pattern&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;디자인 패턴 중 하나인 MVC 패턴은 하나의 프로젝트, 애플리케이션을 구성할 때, 그 구성요소를 Model, View, Controller 세 가지로 구분한 패턴이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Model&lt;/h3&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;모델은 애플리케이션의 핵심 데이터와 비즈니스 로직을 나타낸다. 데이터 저장소와의 상호작용, 데이터 처리 및 유효성 검사와 같은 작업을 수행한다. 모델은 독립적으로 작동하며, 뷰와 컨트롤러와 직접적으로 통신하지 않는다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;특징&lt;/h4&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;li&gt;변경이 일어나면, 변경 통지에 대한 처리방법을 구현해야 함.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;View&lt;/h3&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;뷰는 체크박스, 텍스트 박스 등과 같은 사용자 인터페이스를 나타낸다. 따라서 데이터 및 객체의 입력과 출력을 담당한다.&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;특징&lt;/h4&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;li&gt;변경이 일어나면 변경 통지에 대한 처리방법을 구현해야 함.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #000000;&quot; data-ke-size=&quot;size23&quot;&gt;Controller&lt;/h3&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;데이터와 사용자인터페이스 요소들을 잇는 다리역할을 함. 사용자가 데이터를 클릭하고, 수정하는 것에 대한 이벤트를 처리하는 부분을 뜻 함.&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;특징&lt;/h4&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;h3 data-ke-size=&quot;size23&quot;&gt;패턴 구조&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;mvc.drawio.png&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;241&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beDM1D/btsJIqnIPd5/dIu8zGITcoNq7f3mqyIyX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beDM1D/btsJIqnIPd5/dIu8zGITcoNq7f3mqyIyX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beDM1D/btsJIqnIPd5/dIu8zGITcoNq7f3mqyIyX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeDM1D%2FbtsJIqnIPd5%2FdIu8zGITcoNq7f3mqyIyX0%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;404&quot; height=&quot;241&quot; data-filename=&quot;mvc.drawio.png&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;241&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;/h3&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;사용자가 보는 페이지, 데이터 처리, 컨트롤 세가지로 애플리케이션을 구성하면, 각각의 책임을 확실하게 만들어 맡은 바에만 집중할 수 있게 된다. 따라서 유지보수성, 확장성, 유연성이 증가하고, 중복코딩이라는 문제점 또한 사라지게 된다.&lt;/p&gt;</description>
      <category>개인 공부/디자인 패턴</category>
      <category>MVC</category>
      <category>til</category>
      <category>디자인 패턴</category>
      <author>코딩하는 해달</author>
      <guid isPermaLink="true">https://coreeny.tistory.com/199</guid>
      <comments>https://coreeny.tistory.com/199#entry199comment</comments>
      <pubDate>Mon, 23 Sep 2024 20:37:58 +0900</pubDate>
    </item>
    <item>
      <title>[백 준 Java] 2170번 : 선 긋기</title>
      <link>https://coreeny.tistory.com/198</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;문제 설명&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;매우 큰 도화지에 자를 대고 선을 그으려고 한다. 선을 그을 때에는 자의 한 점에서 다른 한 점까지 긋게 된다. 선을 그을 때에는 이미 선이 있는 위치에 겹쳐서 그릴 수도 있는데, 여러 번 그은 곳과 한 번 그은 곳의 차이를 구별할 수 없다고 하자.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이와 같은 식으로 선을 그었을 때, 그려진 선(들)의 총 길이를 구하는 프로그램을 작성하시오. 선이 여러 번 그려진 곳은 한 번씩만 계산한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&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: #ffffff; color: #555555; text-align: start;&quot;&gt;첫째 줄에 선을 그은 횟수 N (1 &amp;le; N &amp;le; 1,000,000)이 주어진다. 다음 N개의 줄에는 선을 그을 때 선택한 두 점의 위치 x, y (-1,000,000,000 &amp;le; x &amp;lt; y &amp;le; 1,000,000,000)가 주어진다.&lt;/span&gt;&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: #ffffff; color: #555555; text-align: start;&quot;&gt;첫째 줄에 그은 선의 총 길이를 출력한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;알고리즘&lt;/b&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/tag/97&quot;&gt;정렬&lt;/a&gt;&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/tag/106&quot;&gt;스위핑&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;풀이코드&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1667561401668&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.*;
import java.util.*;

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

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(reader.readLine());
        ArrayList&amp;lt;int[]&amp;gt; lines = new ArrayList&amp;lt;&amp;gt;();
        int answer = 0;
        ArrayList&amp;lt;int[]&amp;gt; sumLines = new ArrayList&amp;lt;&amp;gt;();

        for (int i = 0; i &amp;lt; n; i++) {
            lines.add(Arrays.stream(reader.readLine().split(&quot; &quot;)).mapToInt(Integer::parseInt).toArray());
        }

        lines.sort((o1, o2) -&amp;gt; o1[0]!=o2[0] ? o1[0]-o2[0] : o1[1]-o2[1]);

        sumLines.add(lines.get(0));

        for (int[] line : lines) {
            if (sumLines.get(sumLines.size() - 1)[0] &amp;lt;= line[0] &amp;amp;&amp;amp; sumLines.get(sumLines.size() - 1)[1] &amp;gt;= line[0]) {
                if (sumLines.get(sumLines.size() - 1)[1] &amp;lt; line[1]) {
                    sumLines.get(sumLines.size() - 1)[1] = line[1];
                }
            } else {
                sumLines.add(line);
            }
        }

        for (int[] line : sumLines) {
            answer += Math.abs(line[1] - line[0]);
        }
        System.out.println(answer);
    }
}&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;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2170&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/2170&lt;/a&gt;&lt;/p&gt;</description>
      <category>개인 공부/백준</category>
      <category>백준</category>
      <category>자바</category>
      <author>코딩하는 해달</author>
      <guid isPermaLink="true">https://coreeny.tistory.com/198</guid>
      <comments>https://coreeny.tistory.com/198#entry198comment</comments>
      <pubDate>Mon, 23 Sep 2024 11:45:15 +0900</pubDate>
    </item>
  </channel>
</rss>