<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Everyday Learning</title>
    <link>https://become-programmer.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Fri, 10 Apr 2026 05:22:32 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>yeoni:)</managingEditor>
    <image>
      <title>Everyday Learning</title>
      <url>https://tistory1.daumcdn.net/tistory/5510293/attach/85f9c9a162b34068a06edd7158d2fef8</url>
      <link>https://become-programmer.tistory.com</link>
    </image>
    <item>
      <title>Container With Most Water</title>
      <link>https://become-programmer.tistory.com/entry/Container-With-Most-Water</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;2026-03-11&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;size16&quot;&gt;오늘의 문제는 neetcode의 Container With Most Water이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;heights의 배열이 주어지면 가장 큰 면적의 물을 담길 수 있는 크기를 리턴하면 된다.&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;이 문제를 풀 때 고려해야 하는 것은 양쪽 height가 다르다면 작은 수가 기준이 된다.&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;브루트포스 방식으로 풀면 간단하지만 시간 복잡도가 O(n^2)이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;투 포인터를 사용하면 시간복잡도가 O(n)이며 효율적이게 값을 구할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1773224569075&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public int maxArea(int[] heights) {
        int l = 0, r = heights.length - 1;
        int max = 0;
        while(l &amp;lt; r){
            int wid = r - l;
            max = Math.max(max, Math.min(heights[l], heights[r]) * wid);
            if(heights[l] &amp;lt; heights[r]){
                l++;
            }else{
                r--;
            }
        }
        return max;
    }
}&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;/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;먼저 각 포인터들을 가장 끝에 두어 width를 최대로 하고 포인터를 안으로 이동하며&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 넓은 면적을 구한다.&lt;/p&gt;</description>
      <category>알고리즘</category>
      <category>neetcode</category>
      <category>two pointer</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/373</guid>
      <comments>https://become-programmer.tistory.com/entry/Container-With-Most-Water#entry373comment</comments>
      <pubDate>Wed, 11 Mar 2026 10:24:51 +0900</pubDate>
    </item>
    <item>
      <title>3Sum</title>
      <link>https://become-programmer.tistory.com/entry/3Sum</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;2026-03-10&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;size16&quot;&gt;오늘 내가 기록할 알고리즘은 NeetCode의 Two Pointer 문제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스의 3가지 수의 합이 0이 되어야 하는 모든 리스트를 리턴해야 하는데, 중복되는 수가 있으면 안된다.&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;i&gt;&lt;b&gt;처음 풀이는 brute force 방식으로 문제를 해결해 보았다.&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1773108720856&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public List&amp;lt;List&amp;lt;Integer&amp;gt;&amp;gt; threeSum(int[] nums) {
        Set&amp;lt;List&amp;lt;Integer&amp;gt;&amp;gt; list = new HashSet&amp;lt;&amp;gt;();
        Arrays.sort(nums);
        for(int i = 0; i &amp;lt; nums.length; i++){
            for(int j = i + 1; j &amp;lt; nums.length; j++){
                for(int k = j + 1; k &amp;lt; nums.length; k++){
                    if(nums[i] + nums[j] + nums[k] == 0){
                        List&amp;lt;Integer&amp;gt; subList = Arrays.asList(nums[i], nums[j], nums[k]);
                        list.add(subList);
                    }
                }
            }
        }
        return new ArrayList&amp;lt;&amp;gt;(list);
    }
}&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;리턴 형식이 List임에도 불구하고 Set을 선택한 이유는 중복되는 값을 피하기 위해서다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제공받은 배열을 정렬함으로 인해서 우리는 중복되지 않는 값만 Set에 저장할 수 있다.&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;for문을 세 개 생성한 다음 루프를 돌면서 모든 경우의 수를 탐색한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때에 3개 수의 합이 0이라면 해당 값을 리스트로 저장해 Set에 보관한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;루프가 종료되면 Set Collection을 리스트의 파라미터로 넣어서 리턴한다.&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;i&gt;&lt;b&gt;따라서 우리는 Two Pointer를 활용해 해당 문제를 풀어보도록하겠다.&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1773109087907&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Solution {
    public List&amp;lt;List&amp;lt;Integer&amp;gt;&amp;gt; threeSum(int[] nums) {
        Arrays.sort(nums);
        List&amp;lt;List&amp;lt;Integer&amp;gt;&amp;gt; res = new ArrayList&amp;lt;&amp;gt;();

        for (int i = 0; i &amp;lt; nums.length; i++) {
            if (nums[i] &amp;gt; 0) break;
            if (i &amp;gt; 0 &amp;amp;&amp;amp; nums[i] == nums[i - 1]) continue;

            int l = i + 1, r = nums.length - 1;
            while (l &amp;lt; r) {
                int sum = nums[i] + nums[l] + nums[r];
                if (sum &amp;gt; 0) {
                    r--;
                } else if (sum &amp;lt; 0) {
                    l++;
                } else {
                    res.add(Arrays.asList(nums[i], nums[l], nums[r]));
                    l++;
                    r--;
                    while (l &amp;lt; r &amp;amp;&amp;amp; nums[l] == nums[l - 1]) {
                        l++;
                    }
                }
            }
        }
        return res;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Brute Force 부분과 비슷한 점이라면 정렬을 우선적으로 해주는 것이다.&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;우선적으로 세 개의 수 중에 하나의 인덱스 값은 고정으로 두고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나머지 두 개의 값을 투포인터를 이용해 찾는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 만약 고정한 인덱스의 값이 0보다 크다면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 양수라면 세 개의 합이 0을 넘을 수 밖에 없다는 뜻이기에 반복문을 종료하고 값을 리턴한다.&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;투포인터의 인덱스 값은 고정된 인덱스 보다 1 큰 값과 뒤에서 마지막 인덱스를 둔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;while문에서 만약 세 수의 합이 0보다 크다면 0에 가까운 값으로 만들기 위해 오른쪽 인덱스를 감소시키고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0보다 작다면 왼쪽 인덱스의 값을 증가시킨다.&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;만약 세 개의 합이 0이라면, 리스트에 저장하고 왼쪽과 오른쪽의 인덱스를 이동시켜준다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건문 내에 있는 while 반복문은 중복된 값이 들어가는지 확인하는 로직으로서&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;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;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;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;왼쪽 인덱스만 증가시켜도 중복된 값이 들어갈 수 없다는 것을 알게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘</category>
      <category>3sum</category>
      <category>neetcode</category>
      <category>알고리즘</category>
      <category>알고리즘 자바풀이</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/372</guid>
      <comments>https://become-programmer.tistory.com/entry/3Sum#entry372comment</comments>
      <pubDate>Tue, 10 Mar 2026 11:29:02 +0900</pubDate>
    </item>
    <item>
      <title>따끈따끈한 SAA-C03 자격증 합격 후기</title>
      <link>https://become-programmer.tistory.com/entry/%EB%94%B0%EB%81%88%EB%94%B0%EB%81%88%ED%95%9C-SAA-C03-%EC%9E%90%EA%B2%A9%EC%A6%9D-%ED%95%A9%EA%B2%A9-%ED%9B%84%EA%B8%B0</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;시험 후기&lt;/b&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;329&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/psYPu/dJMcabbqsrW/v9uHqbAP2fRa16NPYyteuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/psYPu/dJMcabbqsrW/v9uHqbAP2fRa16NPYyteuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/psYPu/dJMcabbqsrW/v9uHqbAP2fRa16NPYyteuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpsYPu%2FdJMcabbqsrW%2Fv9uHqbAP2fRa16NPYyteuk%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;956&quot; height=&quot;329&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;329&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 부산에 위치한 앤아버 어학원 지하 1층 시험장에서 시험을 봤다. 시험 시간은 10시부터였지만 시험보는 사람이 나밖에 없어서 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;9시 반에&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;시험 문제 절반 정도 가량은 덤프 문제와 동일했고 나머지는 처음보는 문제였다. 문제가 덤프 문제보다 지문 길이가 짧았지만 헷갈리는 문제가 많았던 것 같다. 다 풀고 나니 1시간 정도가 지났고 다시 한번 문제를 살펴보고 제출하니 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;여러 사람의 후기를 보니 당일날 시험 결과를 알 수 있대서 메일을 확인해보니 메일이 오지 않았다. 혹시나 하는 마음에 AWS 시험 결과 페이지에 들어가보니 '합격'이라는 시험 결과를 볼 수 있었다!!! 720점 커트라인에 800점, 나쁘지 않은 결과로 합격을 했고 배지를 받을 수 있었다.&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-origin-width=&quot;412&quot; data-origin-height=&quot;252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d9s1Pk/dJMcac9e5wm/SKlslnLEHTttoneF9rjOjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d9s1Pk/dJMcac9e5wm/SKlslnLEHTttoneF9rjOjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d9s1Pk/dJMcac9e5wm/SKlslnLEHTttoneF9rjOjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd9s1Pk%2FdJMcac9e5wm%2FSKlslnLEHTttoneF9rjOjk%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;412&quot; height=&quot;252&quot; data-origin-width=&quot;412&quot; data-origin-height=&quot;252&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;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;준비 기간&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS는 EC2인스턴스와 S3 정도 사용해본게 다였고 클라우드 지식이 부족하기에 1달 정도 넉넉히 잡고 준비를 했다. 근데 진짜 열심히 공부한 건 일주일 정도 밖에 안되는 것 같다. 일주일 동안 덤프 문제 500개 풀고, 강의를 다봤으니 말이다. 결론은 최대한 짧고 굵게 준비하는게 정신 건강에 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;준비 방법&lt;/b&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. Udemy 강의&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 유데미 강의와 유료 덤프 문제로 시험을 준비했다. 유데미 강의는 한글 버전도 있어 AWS 기초를 다듬기 좋다. 더군다나, 시험에 나올만한 서비스들을 상세히 설명해줘서 이해하고 문제를 풀 수 있었다. 처음에는 기초를 파악하기 위해 전체 강의를 한번 봤다. 덤프 문제를 풀고 난 이후에는 전체 강의를 2배속으로 다시 봤다. 이렇게 보니 처음에 흘려 들었던 정보도 덤프 문제를 풀면서 봤던 서비스들을 더 깊이 이해할 수 있게 되었다.&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;2. 유료 덤프 문제&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유료 덤프 문제는 아는 동생이 시험을 보고 자신이 구매한 걸 공유해줬다. 1000문제 이상 되는데 시험 5일 전에 풀기 시작해서 500문제 조금 넘게 푼 것 같다. 처음 풀 때에는 정답인 것과 아닌 것의 이유를 찾아가며 공부를 했다. 문제의 번역이 이상하거나 가끔 정답이 아닌 것을 정답이라고 할 때도 있어 ChatGPT를 함께 활용하며 AWS 서비스를 이해하려고 했다. 시험 하루 전날에는 풀었던 문제의 지문과 정답을 다시 한번 확인했다. 전날에 이렇게 하지 않았다면 불합격했을지도 모르겠다. 왜냐하면 덤프문제에서 거의 절반 가까이 출제되었기 때문이다. 가격은 비싸지만, 해당 문제를 풀이하며 도움을 많이 받았기 때문에 준비하는 데 도움이 될 것이라 생각한다.&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;유데미 강의의 경우는 할인할 때 구매하면 15,000원에 구매가능하다. 사실 유데미는 할인을 자주 하기 때문에 정가를 주고 사면 바보다. 유료 덤프 문제의 같은 경우는 한글 버전이 69.98 달러 정도하는데, 지금 환율로 따지면 10만원 가량 한다. 할인 쿠폰을 적용하면 59.98 달러에 구매가능하다!&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;Udemy 강의: &lt;a href=&quot;https://www.udemy.com/course/aws-certified-solutions-architect-associate-saa-c03/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.udemy.com/course/aws-certified-solutions-architect-associate-saa-c03/&lt;/a&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;a href=&quot;https://www.dumptop.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.dumptop.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1762132407180&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;국제 인증시험 최신버전 덤프를 제공해드리는 웹사이트 - DumpTOP&quot; data-og-description=&quot;보물섬 문제들이 모두 덤프에서 출제되어 CFE-Investigation시험 가볍게 합격했습니다. 저는 문제만 달달 외우는것보다 문제푸는 방법을 알려고 많이 공들였어요. 자격증취득을 위한 덤프공부라지&quot; data-og-host=&quot;www.dumptop.com&quot; data-og-source-url=&quot;https://www.dumptop.com/&quot; data-og-url=&quot;https://www.dumptop.com/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.dumptop.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.dumptop.com/&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;국제 인증시험 최신버전 덤프를 제공해드리는 웹사이트 - DumpTOP&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;보물섬 문제들이 모두 덤프에서 출제되어 CFE-Investigation시험 가볍게 합격했습니다. 저는 문제만 달달 외우는것보다 문제푸는 방법을 알려고 많이 공들였어요. 자격증취득을 위한 덤프공부라지&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.dumptop.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>클라우드</category>
      <category>AWS</category>
      <category>AWS SSA</category>
      <category>AWS SSA-C03</category>
      <category>AWS 시험</category>
      <category>AWS 자격증</category>
      <category>SAA 시험</category>
      <category>SAA 시험 후기</category>
      <category>saa 자격증</category>
      <category>SAA 합격</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/371</guid>
      <comments>https://become-programmer.tistory.com/entry/%EB%94%B0%EB%81%88%EB%94%B0%EB%81%88%ED%95%9C-SAA-C03-%EC%9E%90%EA%B2%A9%EC%A6%9D-%ED%95%A9%EA%B2%A9-%ED%9B%84%EA%B8%B0#entry371comment</comments>
      <pubDate>Mon, 3 Nov 2025 10:58:46 +0900</pubDate>
    </item>
    <item>
      <title>동기 처리와 비동기 처리의 차이, 그리고 서버 효율에 대한 이야기</title>
      <link>https://become-programmer.tistory.com/entry/%EB%8F%99%EA%B8%B0-%EC%B2%98%EB%A6%AC%EC%99%80-%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%B2%98%EB%A6%AC%EC%9D%98-%EC%B0%A8%EC%9D%B4-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EC%84%9C%EB%B2%84-%ED%9A%A8%EC%9C%A8%EC%97%90-%EB%8C%80%ED%95%9C-%EC%9D%B4%EC%95%BC%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;백엔드 개발을 하다 보면 동기 처리와 비동기 처리에 대한 이야기를 자주 접하게 된다. 개발을 처음 시작했을 때에는 코드를 작성하는 것에만 집중했지만 서비스를 운영하고 관리를 하다보니 API 처리 방식과 서버 리소스 사용의 효율성에 대해 고민이 든다. 이번 글에서는 동기 처리와 비동기 처리의 차이, 쓰레드 풀과 Executor의 역할, 그리고 비동기 처리의 메모리 사용 이슈까지 정리해본다. 또한 프론트엔드와 백엔드의 처리 방식이 서로 다를 때 발생하는 상황도 함께 살펴본다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;동기 처리란?&lt;/b&gt;&lt;/span&gt;&lt;/h4&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;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;동기 처리란 &lt;b&gt;요청을 보내고 응답이 올 때까지 작업 흐름이 멈추는 방식&lt;/b&gt;이다. 클라이언트가 서버에 API 요청을 보내면, 서버는 해당 요청을 처리하는 동안 쓰레드를 점유하고, 처리 완료 후에야 응답을 반환한다. 이 방식에서는 요청 처리 중 다른 작업을 할 수 없다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;서버 내부 흐름&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. 클라이언트가 HTTP 요청 전송&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. Tomcat(서블릿 컨테이너)가 요청 수신&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3. 워커 스레드(Worker Thread)가 Thread Pool에서 할당&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;4. 비즈니스 로직(DB 조회, 외부 API 호출 등) 실행&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;5. 작업 완료 후 응답 반환&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;6. 워커 스레드가 Thread Pool로 반환&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;동기 처리의 한계&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;요청 하나당 서버 워커 스레드 하나를 점유하기 때문에 &lt;b&gt;워커스레드가 모두 점유되면 추가 요청은 큐에 대기하거나 거절&lt;/b&gt;된다. 만약 IO 작업이나&amp;nbsp; 외부 API를 불러오는 로직이 있다면 대기 시간이 길어지면서 처리량이 급감할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;예제 코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1751683778007&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;@RestController
public class SyncController {

    @GetMapping(&quot;/sync&quot;)
    public String syncApi() {
        heavyDatabaseQuery();
        return &quot;Done&quot;;
    }

    private void heavyDatabaseQuery() {
        try {
            Thread.sleep(3000); // DB 작업 대기 시뮬레이션
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;비동기 처리란?&lt;/b&gt;&lt;/span&gt;&lt;/h4&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;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;비동기 처리란 &lt;b&gt;요청을 보내고 결과를 기다리는 동안 다른 작업을 수행할 수 있는 방식&lt;/b&gt;이다. 서버는 요청을 처리할 때 외부 작업(DB 조회, 파일 IO 등)을 별도의 스레드나 이벤트 루프에 위임하고, 메인 쓰레드는 즉시 반환된다. 클라이언트와 서버 모두 비동기 처리 방식을 적용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;서버 내부 흐름&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;1. 클라이언트가 HTTP 요청 전송&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;2. Tomcat이 요청 수신&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;3. 워커 스레드가 Thread Pool에서 할당&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;4. 비즈니스 로직을 Executor에게 위임&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;5. 워커 스레드는 즉시 반환&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;6. Executor 스레드가 비동기 처리 수행&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;7. 처리 완료 후 결과를 클라이언트에 비동기 응답&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;비동기 처리의 장점&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;워커 스레드가 Executor에게 위임 후 즉시 반환되기 때문에 더 많은 요청을 처리할 수 있다.&lt;/b&gt; 따라서 IO-bound 작업 지연이 생기더라도 서버 처리량에는 영향이 덜 미친다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;주의사항&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;비동기 처리를 위한 로직을 짤 때 예외처리가 복잡해진다. 또한 Executor Thread Pool이 과도하게 커지면 메모리 사용량이 증가하게 되고 컨텍스트 스위칭 비용이 발생하게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;예제 코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1751683788591&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;@RestController
public class AsyncController {

    @GetMapping(&quot;/async&quot;)
    public Mono&amp;lt;String&amp;gt; asyncApi() {
        return Mono.fromCallable(this::heavyDatabaseQuery)
                   .subscribeOn(Schedulers.boundedElastic());
    }

    private String heavyDatabaseQuery() {
        try {
            Thread.sleep(3000); // DB 작업 대기 시뮬레이션
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        return &quot;Done&quot;;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;쓰레드 풀과 Executor의 역할&lt;/b&gt;&lt;/span&gt;&lt;/h4&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;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;쓰레드 풀이란?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;쓰레드 풀은 &lt;b&gt;서버(Tomcat)가 요청을 처리하기 위해 미리 생성해놓은 워커 스레드들의 집합&lt;/b&gt;이다. 요청이 들어오면 이 풀에서 하나의 워커 스레드를 할당하고, 요청 처리가 끝나면 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 100px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 21.279%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;항목&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 78.721%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;내용&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 21.279%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;관리 주체&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 78.721%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Tomcat(또는 Jetty 등 서블릿 컨테이너)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 21.279%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;기본 크기&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 78.721%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;200개&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 21.279%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;처리 방식&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 78.721%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;요청 하나당 스레드 하나 점유&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 21.279%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;반환 시점&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 78.721%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;요청 처리 완료 시&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;Executor란?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Executor는 &lt;b&gt;자바에서 비동기 작업을 실행하고 관리하는 API&lt;/b&gt;이다. Spring에서는 @Async, WebClient 내부에서 Executor를 사용한다. 워크 스레드가 처리 중인 작업을 Executor Thread Pool에 위임하면 워커 스레드는 바로 반환된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 100px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 20.6977%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;항목&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 79.3023%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;내용&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 20.6977%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;관리 주체&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 79.3023%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;Spring(ExecutorService, ThreadPoolTaskExecutor)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 20.6977%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;기본 크기&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 79.3023%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;8개(Spring Boot 기본), 설정 가능&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 20.6977%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;처리 방식&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 79.3023%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;요청 로직을 비동기 스레드로 위임&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 20.6977%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;반환 시점&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 79.3023%; height: 20px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;위임 직후&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;비동기 처리에서 Executor를 사용하면 메모리를 더 사용하는 것이 아닐까?&lt;/b&gt;&lt;/span&gt;&lt;/h4&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;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;비동기 처리 시 Executor Thread Pool이 추가로 동작하고, 비동기 작업을 담는 Future, Task 객체들이 힙 메모리에 유지된다. 이로 인해 메모리 사용량은 동기 처리보다 증가할 수 있다. 하지만 비동기 처리는 요청당 워커 스레드가 블로킹되지 않기 때문에 서버가 동시에 처리할 수 있는 요청의 양이 크게 늘어난다. 결과적으로 같은 시간 동안 더 많은 요청을 처리할 수 있고, 메모리 사용량 증가 대비 처리량 향상 폭이 더 크기 때문에 효율적이라고 말한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;동기식 API의 블로킹 범위&lt;/b&gt;&lt;/span&gt;&lt;/h4&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;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;동기식 API는 요청 하나가 처리될 때까지 해당 요청을 맡은 서버 워커 스레드를 반환하지 않는다. 이 블로킹은 한 사용자의 요청 범위에서 발생한다. 하지만 여러 사용자가 동시에 같은 API를 호출하면 각각의 요청이 별도의 워커 스레드에 할당되어 처리된다. 워커 스레드 수가 충분하다면 다른 사용자 요청에는 영향을 주지 않는다. 그러나 워커 스레드가 한계에 도달하면 새로운 요청은 대기하거나 실패하게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;프론트 코드가 비동기 처리이고 백엔드 API가 동기 처리라면 데이터 처리는 빨라지는 것일까?&lt;/b&gt;&lt;/span&gt;&lt;/h4&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;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;프론트엔드에서 API를 비동기 호출한다고 해서 백엔드의 처리 속도가 빨라지는 것은 아니다. 프론트 비동기 처리의 목적은 사용자 경험 개선이다. API 호출이 완료될 때까지 UI가 멈추지 않도록 하고, 다른 동작을 이어갈 수 있게 한다. 하지만 백엔드가 동기 처리 방식이라면 서버는 요청당 하나의 워커 스레드를 계속 점유하며 처리한다. 결국 백엔드 처리 시간이 느리면 전체 응답 시간은 그대로이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;프론트 코드가 비동기 처리를 하는 이유&lt;/b&gt;&lt;/span&gt;&lt;/h4&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;size14&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;프론트엔드는 사용자의 UI 경험이 중요하기 때문에 비동기 처리가 기본이다. 비동기 호출을 통해 화면이 멈추지 않고 로딩 상태를 보여주거나 다른 인터랙션을 할 수 있다. 서버가 동기이든 비동기이든 프론트 비동기 처리는 사용자 인터페이스를 부드럽게 만드는 핵심 요소이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로젝트/팀 프로젝트</category>
      <category>Executor</category>
      <category>Thread Pool</category>
      <category>동기 처리</category>
      <category>동기처리 동작 방식</category>
      <category>비동기 처리</category>
      <category>비동기처리 동작방식</category>
      <category>스레드풀 이해하기</category>
      <category>쓰레드 풀</category>
      <category>자바 executor</category>
      <category>자바 비동기 처리</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/370</guid>
      <comments>https://become-programmer.tistory.com/entry/%EB%8F%99%EA%B8%B0-%EC%B2%98%EB%A6%AC%EC%99%80-%EB%B9%84%EB%8F%99%EA%B8%B0-%EC%B2%98%EB%A6%AC%EC%9D%98-%EC%B0%A8%EC%9D%B4-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EC%84%9C%EB%B2%84-%ED%9A%A8%EC%9C%A8%EC%97%90-%EB%8C%80%ED%95%9C-%EC%9D%B4%EC%95%BC%EA%B8%B0#entry370comment</comments>
      <pubDate>Sat, 5 Jul 2025 12:01:20 +0900</pubDate>
    </item>
    <item>
      <title>Docker를 사용할 때 Volume이란? 실무 경험으로 이해하기</title>
      <link>https://become-programmer.tistory.com/entry/Docker%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%A0-%EB%95%8C-Volume%EC%9D%B4%EB%9E%80-%EC%8B%A4%EB%AC%B4-%EA%B2%BD%ED%97%98%EC%9C%BC%EB%A1%9C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. Docker란?&lt;/h4&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;size16&quot;&gt;Docker는 애플리케이션을 컨테이너(container)라는 가벼운 단위로 패키징하고 실행할 수 있게 해주는 플랫폼이다.&lt;br /&gt;이 컨테이너는 애플리케이션 + 환경(라이브러리, 설정 등)을 하나로 묶어 배포하므로, &quot;내 PC에선 잘 되는데?&quot; 같은 환경 문제를 크게 줄여준다는 특징이 있다. 이러한 장점 때문에 윈도우, 리눅스 등 어떤 OS를 사용하든지 상관없이 배포할 수 있다.&lt;br /&gt;&lt;br /&gt;-&amp;nbsp;개발&amp;nbsp;&amp;rarr;&amp;nbsp;배포&amp;nbsp;&amp;rarr;&amp;nbsp;운영이&amp;nbsp;일관된&amp;nbsp;환경에서&amp;nbsp;이뤄짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;nbsp;Dockerfile,&amp;nbsp;docker-compose.yml&amp;nbsp;등을&amp;nbsp;이용해&amp;nbsp;손쉽게&amp;nbsp;빌드/실행&amp;nbsp;가능&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;2. 그렇다면 Docker Volume은 무엇일까?&lt;/h4&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;size16&quot;&gt;Docker 컨테이너는 기본적으로 임시적인 파일 시스템을 사용한다. 즉, 컨테이너를 삭제하거나 재시작하면 내부에 있던 데이터는 모두 사라지게 되버린다. 수정사항이 발생하면 컨테이너를 내렸다 올려야 하는 상황이 빈번한데, 자칫 잘못하다가는 큰 사고로 이어질 수 있다.&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;이때 Docker Volume을 사용하면 컨테이너와는 별도로 데이터를 지속적으로 저장할 수 있다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;사용&amp;nbsp;예시:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1750753515752&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;services:
  app:
    image: my-app
    volumes:
      - /host/data:/app/data	// 내부 저장소:도커 저장소&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;위처럼 볼륨을 설정하면, 컨테이너가 꺼져도 /host/data에 있는 파일은 유지된다.&amp;nbsp;&lt;br /&gt;즉, 컨테이너가 데이터를 저장하는 위치를 호스트의 폴더나 Docker Volume 저장소로 연결하는 것이다.&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;br /&gt;3.&amp;nbsp;실무에서&amp;nbsp;겪은&amp;nbsp;사례:&amp;nbsp;왜&amp;nbsp;볼륨이&amp;nbsp;중요했는가?&lt;/h4&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;size16&quot;&gt;사내 시스템에는 파일 업로드와 다운로드 기능이 존재하는데, 볼륨을 설정하지 않고 서비스를 올렸다. 아직 시스템이 안정화되지 않은 상황에 볼륨을 설정하지 않고 올리게 되니 docker compose down -&amp;gt; up를 반복하는 상황에서 컨테이너 내부에 저장된 파일들이 전부 사라지는 문제가 발생하였다. 물론 DB에는 파일 경로가 저장되어 있었지만, 정작 파일 자체는 존재하지 않게 되어 파일을 읽어 오지 못했다.&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;br /&gt;이 경험을 통해, 데이터가 컨테이너 수명과 함께 날아가면 안 되는 경우에는 반드시 volume을 사용해야 한다는 점을 절실히 느꼈다.&lt;/p&gt;
&lt;pre id=&quot;code_1750753717372&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;volumes:
  - /var/groupware/data/upload:/var/groupware/upload
  - /var/groupware/data/logs:/var/groupware/logs
  - /var/groupware/data/doc:/var/groupware/doc
  - /var/groupware/data/font:/var/groupware/font&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&lt;br /&gt;4. 깨달음: 볼륨은 선택이 아닌 필수다!&lt;/h4&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;size16&quot;&gt;초기엔 Docker의 간편함에 집중했지만, 실제 운영환경에 가까워질수록 데이터의 지속성(persistence)이 매우 중요하다.&lt;br /&gt;볼륨은 단순한 보조 수단이 아니라, 컨테이너 기반 시스템에서 데이터를 보호하기 위한 핵심 전략인 것 같다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;관련&amp;nbsp;명령어&amp;nbsp;간단&amp;nbsp;정리:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1750753750665&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 기존 볼륨 확인
docker volume ls

# 볼륨 생성
docker volume create my-volume

# 볼륨을 수동으로 컨테이너에 마운트
docker run -v my-volume:/data my-image

# docker-compose에서도 사용 가능
volumes:
  - my-volume:/data&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&lt;br /&gt;5.&amp;nbsp;마무리하며&lt;/h4&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;size16&quot;&gt;Docker를 처음 사용할 땐 시스템 구축에만 집중하게 되지만, 결국엔 지속 가능한 운영이 핵심이 된다.&lt;br /&gt;볼륨은 그 지속성의 시작점이다. 나와 같이 실수로 소중한 데이터를 날리기 전에, 꼭 볼륨을 설정해두시길 바란다.&lt;/p&gt;</description>
      <category>클라우드</category>
      <category>docker</category>
      <category>docker volume</category>
      <category>docker volume 설정 방법</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/369</guid>
      <comments>https://become-programmer.tistory.com/entry/Docker%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%A0-%EB%95%8C-Volume%EC%9D%B4%EB%9E%80-%EC%8B%A4%EB%AC%B4-%EA%B2%BD%ED%97%98%EC%9C%BC%EB%A1%9C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0#entry369comment</comments>
      <pubDate>Tue, 24 Jun 2025 17:33:19 +0900</pubDate>
    </item>
    <item>
      <title>Grafana + Loki + Promtail을 활용한 로그 수집 및 시각화 시스템 구축하기(1)</title>
      <link>https://become-programmer.tistory.com/entry/Grafana-Loki-Promtail%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%9C-%EB%A1%9C%EA%B7%B8-%EC%88%98%EC%A7%91-%EB%B0%8F-%EC%8B%9C%EA%B0%81%ED%99%94-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B01</link>
      <description>&lt;h2&gt;개요&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;실제 운영 중인 Spring 애플리케이션에서 발생하는 로그를 수집하고, 시각화하여 모니터링할 수 있는 시스템을 구축했다. 이 시스템은 &lt;strong&gt;Grafana&lt;/strong&gt;, &lt;strong&gt;Loki&lt;/strong&gt;, &lt;strong&gt;Promtail&lt;/strong&gt; 세 가지 도구를 활용하였고, GCP의 Ubuntu 서버 2대에 구성되었다.   &lt;/p&gt;
   &lt;br&gt;


&lt;h2&gt;아키텍처 구조&lt;/h2&gt;
&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;서버 A (Spring 앱 실행 중)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Spring 애플리케이션이 Docker 컨테이너에서 실행 중&lt;/li&gt;
&lt;li&gt;Promtail을 통해 컨테이너 로그 수집&lt;/li&gt;
&lt;li&gt;수집된 로그는 서버 B의 Loki로 전송&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;서버 B (로그 저장 및 시각화)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Loki: 로그 저장소 역할&lt;/li&gt;
&lt;li&gt;Grafana: 로그 시각화 대시보드&lt;/li&gt;
&lt;li&gt;Database: 별도 용도로 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;네트워크 구성&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;3100 포트&lt;/code&gt;: Promtail이 Loki에 로그를 전송할 수 있도록 오픈&lt;/li&gt;
&lt;li&gt;&lt;code&gt;3000 포트&lt;/code&gt;: Grafana UI 접속용 포트&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;  

&lt;h2&gt;도구 설명&lt;/h2&gt;
&lt;hr&gt;
&lt;h3&gt;Promtail&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;로그 수집기 역할&lt;/li&gt;
&lt;li&gt;로컬 로그 파일이나 도커 컨테이너 로그를 읽고, Loki에 전송&lt;/li&gt;
&lt;li&gt;경량이므로 서버 부하가 거의 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Loki&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;로그를 저장하는 시스템&lt;/li&gt;
&lt;li&gt;시계열 데이터베이스처럼 동작하나 인덱싱 방식이 경량화되어 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Grafana&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Loki에 저장된 로그를 쿼리하여 시각화&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;다양한 필터링 및 탐색 기능을 제공&lt;/p&gt;
 &lt;br&gt;

&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;서버 B 설정 (Loki &amp;amp; Grafana)&lt;/h2&gt;
&lt;hr&gt;
&lt;h3&gt;1. Docker Compose 설정&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;# docker-compose.yml
version: &amp;quot;3&amp;quot;

services:
  loki:
    image: grafana/loki:2.9.2
    container_name: loki
    ports:
      - &amp;quot;3100:3100&amp;quot;
    volumes:
      - ./loki-config.yaml:/etc/loki/local-config.yaml
      - loki-data:/tmp/loki

  grafana:
    image: grafana/grafana
    container_name: grafana
    ports:
      - &amp;quot;3000:3000&amp;quot;
    volumes:
      - grafana-storage:/var/lib/grafana
    environment:
      - GF_SECURITY_ADMIN_USER=user
      - GF_SECURITY_ADMIN_PASSWORD=password
    restart: always

volumes:
  grafana-storage:
  loki-data:&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. Loki 설정 파일&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;# loki-config.yaml
auth_enabled: false

server:
  http_listen_port: 3100
  grpc_listen_port: 9095

ingester:
  lifecycler:
    ring:
      kvstore:
        store: inmemory
      replication_factor: 1
  chunk_idle_period: 5m
  max_chunk_age: 1h
  wal:
    enabled: true
    dir: /tmp/loki/wal

schema_config:
  configs:
    - from: 2022-01-01
      store: boltdb-shipper
      object_store: filesystem
      schema: v11
      index:
        prefix: index_
        period: 24h

storage_config:
  boltdb_shipper:
    active_index_directory: /tmp/loki/index
    cache_location: /tmp/loki/boltdb-cache
    shared_store: filesystem
  filesystem:
    directory: /tmp/loki/chunks

limits_config:
  reject_old_samples: true
  reject_old_samples_max_age: 168h

table_manager:
  retention_deletes_enabled: true
  retention_period: 168h&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. 실행 명령어&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose up -d&lt;/code&gt;&lt;/pre&gt;
  &lt;br&gt; 

&lt;h2&gt;서버 A 설정 (Promtail)&lt;/h2&gt;
&lt;hr&gt;
&lt;h3&gt;Promtail 설정 파일&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;# promtail-config.yaml
server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /tmp/positions.yaml

clients:
  - url: http://&amp;lt;서버B의IP&amp;gt;:3100/loki/api/v1/push

scrape_configs:
  - job_name: spring-app
    static_configs:
      - targets:
          - localhost
        labels:
          host: server-a
          job: spring
          __path__: /var/lib/docker/containers/*/*.log&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Promtail 실행 명령어&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker run -d \
  --name=promtail \
  -v /var/lib/docker/containers:/var/lib/docker/containers:ro \
  -v /var/log:/var/log \
  -v &amp;quot;$(pwd)/promtail-config.yaml&amp;quot;:/etc/promtail/config.yaml \
  grafana/promtail:2.9.2 \
  -config.file=/etc/promtail/config.yaml&lt;/code&gt;&lt;/pre&gt;
   &lt;br&gt;

&lt;h2&gt;Grafana 설정 및 시각화&lt;/h2&gt;
&lt;hr&gt;
&lt;h3&gt;1. Grafana 접속&lt;/h3&gt;
&lt;p&gt;브라우저에서 &lt;code&gt;http://&amp;lt;서버B-IP&amp;gt;:3000&lt;/code&gt;으로 접속 후 로그인&lt;br&gt;기본 계정: &lt;code&gt;user / password&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;2. 데이터 소스 추가&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;왼쪽 사이드바 &amp;gt; Settings &amp;gt; Data Sources &amp;gt; Add data source&lt;/li&gt;
&lt;li&gt;Loki 선택&lt;/li&gt;
&lt;li&gt;URL: &lt;code&gt;http://loki:3100&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Save &amp;amp; Test&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. 로그 탐색&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;왼쪽 메뉴 &amp;gt; Explore&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;쿼리 예시:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{job=&amp;quot;spring&amp;quot;, host=&amp;quot;server-a&amp;quot;}&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;로그가 실시간으로 출력되는 것을 확인 가능&lt;/p&gt;
 &lt;br&gt; 


&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;장점&lt;/h2&gt;
&lt;hr&gt;
&lt;h3&gt;운영 및 모니터링 측면&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;운영 중인 서버에서 발생하는 로그를 별도의 서버로 전송해 부하 분산&lt;/li&gt;
&lt;li&gt;실시간으로 로그를 탐색하고, 오류 상황을 빠르게 인지 가능&lt;/li&gt;
&lt;li&gt;다중 서버나 마이크로서비스 환경에서 로그 통합이 용이&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;관리 효율&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;특정 시간대, 호스트, job 단위로 필터링이 가능하여 분석 편의성 향상&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;개발 및 운영자 간 협업 시 동일한 로그를 기반으로 문제 해결 가능&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;필요 시 알람 설정도 가능 (Grafana Alert 설정 활용)  &lt;/p&gt;
 &lt;br&gt;  

&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;결론&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;Grafana, Loki, Promtail을 조합하면 로그 수집과 시각화를 매우 효율적으로 구성할 수 있다. 특히 도커 환경에서의 로그 수집에 최적화되어 있으며, GCP 또는 클라우드 서버에서도 비교적 쉽게 배포가 가능하다.&lt;br&gt;&lt;br&gt;&lt;br&gt;소비채집 프로젝트를 처음 배포했을 당시에는 실사용자가 적어 로그 수집과 분석에 대한 필요성을 크게 느끼지 못했다. 그러나 최근 400명 규모의 청소년들이 사용하는 서비스 운영을 앞두고, 장애 발생 시 빠르게 대응할 수 있는 체계가 필요하다고 느꼈다. 매번 서버에 접속해 도커 로그를 직접 확인하는 방식은 번거롭고, 로그를 한눈에 파악하기 어렵다는 한계도 있었다. 안정적인 운영을 위해 이제는 로그 수집 및 시각화 환경을 제대로 구축하고, 프로젝트의 로그 구조도 정비할 필요가 있다.&lt;/p&gt;</description>
      <category>프로젝트/팀 프로젝트</category>
      <category>grafana</category>
      <category>Loki</category>
      <category>promtail</category>
      <category>로그 분석하기</category>
      <category>로그 수집</category>
      <category>로그 시각화</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/368</guid>
      <comments>https://become-programmer.tistory.com/entry/Grafana-Loki-Promtail%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%9C-%EB%A1%9C%EA%B7%B8-%EC%88%98%EC%A7%91-%EB%B0%8F-%EC%8B%9C%EA%B0%81%ED%99%94-%EC%8B%9C%EC%8A%A4%ED%85%9C-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B01#entry368comment</comments>
      <pubDate>Wed, 4 Jun 2025 10:08:23 +0900</pubDate>
    </item>
    <item>
      <title>99클럽 코테 스터디 6기 16일차 TIL (미들러)</title>
      <link>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EA%B8%B0-16%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC-1</link>
      <description>&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제: 백준 18126번 너구리 구구&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2308&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/H0lAq/btsNvgBeFoF/TOkiSqBZXAKRQhHIhtip71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/H0lAq/btsNvgBeFoF/TOkiSqBZXAKRQhHIhtip71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/H0lAq/btsNvgBeFoF/TOkiSqBZXAKRQhHIhtip71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FH0lAq%2FbtsNvgBeFoF%2FTOkiSqBZXAKRQhHIhtip71%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;2308&quot; height=&quot;1440&quot; data-origin-width=&quot;2308&quot; data-origin-height=&quot;1440&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;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;풀이 방법&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;전형적인 그래프 문제로 DFS 혹은 BFS로 값을 구할 수 있다. 여기서 주의해야 할 점이 있다면, 가중치 값이 int 범위를 초과할 수 있기 때문에 반환 값의 형식을 long으로 설정해야 한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;전체 코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1745324157078&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    static ArrayList&amp;lt;int[]&amp;gt;[] graph;
    static boolean[] visited;
    static long maxDistance = 0;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        graph = new ArrayList[n + 1];
        visited = new boolean[n + 1];

        for (int i = 1; i &amp;lt;= n; i++) {
            graph[i] = new ArrayList&amp;lt;&amp;gt;();
        }

        for (int i = 0; i &amp;lt; n - 1; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int u = Integer.parseInt(st.nextToken());
            int v = Integer.parseInt(st.nextToken());
            int w = Integer.parseInt(st.nextToken());

            graph[u].add(new int[] {v, w});
            graph[v].add(new int[] {u, w});
        }

        dfs(1, 0);
        System.out.println(maxDistance);
    }

    static void dfs(int node, long distance) {
        visited[node] = true;
        maxDistance = Math.max(maxDistance, distance);

        for (int[] next : graph[node]) {
            int nextNode = next[0];
            int weight = next[1];

            if (!visited[nextNode]) {
                dfs(nextNode, distance + weight);
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;graph&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;리스트를 생성한 뒤 초기화를 시켜주고 연결된 정점 번호와 가중치를 저장하기 위해 배열로 리스트에 저장한다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;dfs()&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;visited[] 배열은 방문 여부를 저장하기 위함이다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;이 메서드는 현재 노드까지의 누적 거리를 전달하고 가장 긴거리를 maxDistance에 저장한다.&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/99클럽 코테스터디 6기</category>
      <category>99클럽</category>
      <category>99클럽코테스터디6기</category>
      <category>til</category>
      <category>백준 18126번</category>
      <category>백준 너구리 구구</category>
      <category>코테스터디 17일차</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/367</guid>
      <comments>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EA%B8%B0-16%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC-1#entry367comment</comments>
      <pubDate>Tue, 22 Apr 2025 21:19:53 +0900</pubDate>
    </item>
    <item>
      <title>99클럽 코테 스터디 6기 16일차 TIL (미들러)</title>
      <link>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EA%B8%B0-16%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC</link>
      <description>&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제: 프로그래머스 신규 아이디 추천&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2818&quot; data-origin-height=&quot;1232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oupBI/btsNuBYLKg4/kUMR4E92zzfQYOTR6jNM41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oupBI/btsNuBYLKg4/kUMR4E92zzfQYOTR6jNM41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oupBI/btsNuBYLKg4/kUMR4E92zzfQYOTR6jNM41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoupBI%2FbtsNuBYLKg4%2FkUMR4E92zzfQYOTR6jNM41%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;2818&quot; height=&quot;1232&quot; data-origin-width=&quot;2818&quot; data-origin-height=&quot;1232&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;풀이 방법&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;위와 같이 규칙에 맞는 아이디를 추천해주는 프로그램을 개발하는 것인데, 특별한 알고리즘이 필요하진 않고 요구한 것을 차례대로 구현하면 된다. 사실 정규표현식만 제대로 숙지하고 있으면 어려운 문제가 아니다. 하지만 난 정규 표현식에 익숙하지 않아서 그런지 클린하지 못한 코드를 작성하고 시간도 오래 걸렸다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;첫 번째 시도&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1744943771827&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.Stack;

class Solution {
    public String solution(String new_id) {
        char[] charId = new_id.toCharArray();

        Stack&amp;lt;Character&amp;gt; stack = new Stack&amp;lt;&amp;gt;();
        Character first = charId[0];
        if (Character.isUpperCase(first)) {
            first = Character.toLowerCase(first);
        }
        if (Character.isDigit(first) || Character.isLowerCase(first) || first == '-' || first == '_' || first == '.') {
            stack.add(first);
        }
        for (int i = 1; i &amp;lt; charId.length; i++) {
            Character c = charId[i];
            if (Character.isUpperCase(c)) {
                c = Character.toLowerCase(c);
            }
            if (!Character.isDigit(c) &amp;amp;&amp;amp; c != '-' &amp;amp;&amp;amp; c != '_' &amp;amp;&amp;amp; c != '.' &amp;amp;&amp;amp; !Character.isLowerCase(c)) {
                continue;
            }

            if (!stack.isEmpty() &amp;amp;&amp;amp; stack.peek() == '.' &amp;amp;&amp;amp; c == '.') {
                continue;
            }

            stack.add(c);
        }

        while (!stack.isEmpty()) {
            if (stack.peek() != '.' &amp;amp;&amp;amp; stack.get(0) != '.')
                break;
            if (!stack.isEmpty() &amp;amp;&amp;amp; stack.peek() == '.') {
                stack.pop();
            }
            if (!stack.isEmpty() &amp;amp;&amp;amp; stack.get(0) == '.') {
                stack.remove(0);
            }
        }

        if (stack.isEmpty()) {
            stack.add('a');
        }

        if (stack.size() &amp;gt;= 16) {
            while (stack.size() &amp;gt;= 16 || stack.peek() == '.') {
                stack.pop();
            }
        }

        if (stack.size() &amp;lt;= 2) {
            while (stack.size() &amp;lt; 3) {
                stack.add(stack.peek());
            }
        }

        StringBuilder sb = new StringBuilder();
        for (Character c : stack) {
            sb.append(c);
        }
        
        return sb.toString();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;스택을 사용하여 모든 수를 저장하고 StringBuilder로 출력하도록 하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;코드도 길어지고 조건도 많아져서 코드가 많이 지저분해진 것 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;정규표현식 코드&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1745237386751&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) {
        // String id = &quot;...!@BaT#*..y.abcdefghijklm&quot;;
        // String id = &quot;z-+.^.&quot;;
        // String id = &quot;=.=&quot;;
        String id = &quot;123_.def&quot;;

        id = id.toLowerCase();
        id = id.replaceAll(&quot;[^a-z0-9._-]&quot;, &quot;&quot;);
        id = id.replaceAll(&quot;[.]{2,}&quot;, &quot;.&quot;);
        id = id.replaceAll(&quot;^[.][.]$&quot;, &quot;&quot;);
        id = id.isEmpty() ? &quot;a&quot; : id;
        if (id.length() &amp;gt;= 16)
            id = id.substring(0, 15);
        id = id.replaceAll(&quot;[.]$&quot;, &quot;&quot;);
        StringBuilder sb = new StringBuilder(id);
        while (sb.length() &amp;lt;= 2) {
            sb.append(sb.charAt(sb.length() - 1));
        }
        id = sb.toString();
        System.out.println(id);

    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;toLowerCase()&lt;/span&gt;: 모든 문자를 소문자로 변환시켜주는 메서드&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&quot;[^a-z0-9._-]&quot;&lt;/span&gt;: 대문자 안에서 '^'는 부정을 뜻한다, 즉 소문자나 숫자, '.', '_', '-' 가 아니라면 빈값으로 치환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&quot;^[.][.]$&quot;&lt;/span&gt;: 대문자 밖의 '^'는 첫 번째 문자를 뜻하며 대문자 뒤의 '$'는 마지막 문자를 뜻한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;정규 표현식을 이용하니 확실히 코드가 간결해지고 쉽게 문제를 풀 수 있는 것 같다.&lt;/p&gt;</description>
      <category>알고리즘/99클럽 코테스터디 6기</category>
      <category>99클럽</category>
      <category>99클럽코테스터디6기</category>
      <category>til</category>
      <category>코테스터디 16일차</category>
      <category>프로그래머스</category>
      <category>프로그래머스 신규 아이디 추천</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/366</guid>
      <comments>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EA%B8%B0-16%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC#entry366comment</comments>
      <pubDate>Mon, 21 Apr 2025 21:14:17 +0900</pubDate>
    </item>
    <item>
      <title>99클럽 코테 스터디 6기 15일차 TIL (미들러)</title>
      <link>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EA%B8%B0-14%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC-1</link>
      <description>&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제: 백준 17271번 리그 오브 레전설(Small)&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1447&quot; data-origin-height=&quot;730&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DdZTO/btsNqfu5SHY/2yP8BX0NM5FBVM5Qz8p9U0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DdZTO/btsNqfu5SHY/2yP8BX0NM5FBVM5Qz8p9U0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DdZTO/btsNqfu5SHY/2yP8BX0NM5FBVM5Qz8p9U0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDdZTO%2FbtsNqfu5SHY%2F2yP8BX0NM5FBVM5Qz8p9U0%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;1447&quot; height=&quot;730&quot; data-origin-width=&quot;1447&quot; data-origin-height=&quot;730&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;풀이 방법&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style5&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;A와 B의 스킬로 N시간 안에 가능한 스킬 조합을 찾는 문제다.스킬을 사용하지 않는 시간이 없어야 한다는 조건이 있기에 중간에 빈 시간이 없도록 만들어야 한다. 이 문제는 하위 문제의 중복으로 다이나믹 프로그래밍 알고리즘을 사용하여 풀 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;전체 코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1744943771827&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] input = br.readLine().split(&quot; &quot;);
        int n = Integer.parseInt(input[0]);
        int m = Integer.parseInt(input[1]);

        final int MOD = 1_000_000_007;
        int[] dp = new int[n + 1];
        dp[0] = 1;

        for (int i = 1; i &amp;lt;= n; i++) {
            dp[i] = dp[i - 1];
            if (i &amp;gt;= m) {
                dp[i] = (dp[i] + dp[i - m]) % MOD;
            }
        }

        System.out.println(dp[n]);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;dp[i]는 길이가 i인 문자열을 만들 수 있는 경우의 수이다. 문자열의 길이를 1부터 N가지 증가시키면서, 경우의 수를 계산한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;점화식&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;dp[i] += dp[i - 1]&lt;/span&gt;: &lt;span&gt;길이가 i - 1인 문자열에 문자 A를 추가하여 길이 i를 만드는 경우&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;dp[i] += dp[i - M]&lt;/span&gt;: &lt;span&gt;길이가 i - M인 문자열에 문자 B를 추가하여 길이 i를 만드는 경우 (단, i &amp;gt;= M일 때만 가능)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;마지막에는 오버플로우 방지를 위해 1,000,000,007로 나눈다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/99클럽 코테스터디 6기</category>
      <category>99클럽</category>
      <category>99클럽코테스터디6기</category>
      <category>til</category>
      <category>백준 17271번</category>
      <category>백준 리그 오브 레전설(small)</category>
      <category>코테스터디 15일차</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/365</guid>
      <comments>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EA%B8%B0-14%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC-1#entry365comment</comments>
      <pubDate>Fri, 18 Apr 2025 11:39:20 +0900</pubDate>
    </item>
    <item>
      <title>99클럽 코테 스터디 6기 14일차 TIL (미들러)</title>
      <link>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EA%B8%B0-14%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제: 백준 17484번 진우의 달 여행(Small)&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1449&quot; data-origin-height=&quot;807&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/slzPq/btsNpvdacXq/aqawm0EqgkVVPPkGShtN51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/slzPq/btsNpvdacXq/aqawm0EqgkVVPPkGShtN51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/slzPq/btsNpvdacXq/aqawm0EqgkVVPPkGShtN51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FslzPq%2FbtsNpvdacXq%2Faqawm0EqgkVVPPkGShtN51%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;1449&quot; height=&quot;807&quot; data-origin-width=&quot;1449&quot; data-origin-height=&quot;807&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;달의 도달하기 위해 필요한 최소 연료 값을 구하는 것인데, 이 문제에서의 조건은 같은 방향으로 연달아 움질일 수 없다는 점이다. 해당 조건 때문에 이 문제를 풀기까지 굉장히 오랜시간이 걸린 것 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;문제를 읽어보니 다이나믹 프로그래밍으로 풀어야 한다고 생각을 했는데, 방향이라는 조건이 있다보니 3차원 배열을 사용해야 했다. 스스로 풀기에 한계를 느껴 인공지능에게 도움을 받았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;전체 코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1744684916301&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) throws IOException {
        // 입력 및 저장
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), &quot; &quot;);
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());

        int[][] space = new int[n][m];
        for (int i = 0; i &amp;lt; n; i++) {
            st = new StringTokenizer(br.readLine(), &quot; &quot;);
            for (int j = 0; j &amp;lt; m; j++) {
                space[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        int[][][] dp = new int[n][m][3]; // 3차원 DP 배열
        final int MAX = 1000 * 100 + 1;
        for (int i = 0; i &amp;lt; n; i++)
            for (int j = 0; j &amp;lt; m; j++)
                Arrays.fill(dp[i][j], MAX);

        // 첫 번째 행 초기화
        for (int j = 0; j &amp;lt; m; j++) {
            dp[0][j][0] = dp[0][j][1] = dp[0][j][2] = space[0][j];
        }

        // DP
        for (int i = 1; i &amp;lt; n; i++) {
            for (int j = 0; j &amp;lt; m; j++) {
                for (int d = 0; d &amp;lt; 3; d++) {
                    int prevJ = j + (d - 1);
                    if (prevJ &amp;lt; 0 || prevJ &amp;gt;= m)
                        continue;

                    for (int prevD = 0; prevD &amp;lt; 3; prevD++) {
                        if (d == prevD)
                            continue;
                        dp[i][j][d] = Math.min(dp[i][j][d], dp[i - 1][prevJ][prevD] + space[i][j]);
                    }
                }
            }
        }
        int answer = MAX;
        for (int j = 0; j &amp;lt; m; j++) {
            for (int d = 0; d &amp;lt; 3; d++) {
                answer = Math.min(answer, dp[n - 1][j][d]);
            }
        }
        System.out.println(answer);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;첫번째 행은 이전 행이 따로 없기 때문에 배열의 d 값을 초기화 시켜주는 작업이 필요하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;prevJ&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;d 값에 따라 이전 열을 계산하는 변수이다. 만약 prevJ가 0보다 작거나, m보다 크거나 같다면 배열을 벗어났기에 continue를 해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;prevD&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이전 방향과 동일한 방향으로 이동할 수 없기 때문에 d == prevD와 동일한다면 continue하고 그렇지 않은 경우 최소 값을 구해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;answer&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;최소값을 구해야 하기 때문에 반복문을 통해 마지막 행에서 최소값을 찾아준다.&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;size14&quot;&gt;메모이제이션을 항상 2차원 배열로 시행하다가 3차원 배열로 구현하려니 너무 어렵게 느껴졌다. 3차원 배열로 다이나믹 알고리즘을 구현하는 문제를 더 많이 접해봐야 할 것 같다는 생각이 들었다.&lt;/p&gt;</description>
      <category>알고리즘/99클럽 코테스터디 6기</category>
      <category>99클럽</category>
      <category>99클럽코테스터디6기</category>
      <category>til</category>
      <category>백준 17484번</category>
      <category>백준 진우의 달 여행</category>
      <category>코테스터디 14일차</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/364</guid>
      <comments>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EA%B8%B0-14%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC#entry364comment</comments>
      <pubDate>Thu, 17 Apr 2025 16:42:52 +0900</pubDate>
    </item>
    <item>
      <title>99클럽 코테 스터디 6기 13일차 TIL (미들러)</title>
      <link>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EA%B8%B0-13%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제: 프로그래머스 JadenCase&amp;nbsp;문자열&amp;nbsp;만들기&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;659&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dp9UVa/btsNm0xPzjA/2KqmMyBJI0RJI0EHDt3AG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dp9UVa/btsNm0xPzjA/2KqmMyBJI0RJI0EHDt3AG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dp9UVa/btsNm0xPzjA/2KqmMyBJI0RJI0EHDt3AG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdp9UVa%2FbtsNm0xPzjA%2F2KqmMyBJI0RJI0EHDt3AG1%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;715&quot; height=&quot;659&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;659&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이 문제에서 요구하는 건 첫글자는 대문자로, 나머지 글자는 소문자로 바꾸는 문제이다. 별다른 알고리즘이 필요하지 않고 구현만 하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;첫시도(실패)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1744684916301&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public String solution(String s) {
        String[] arr = s.split(&quot; &quot;);
        String answer = &quot;&quot;;
        for (int i = 0; i &amp;lt; arr.length; i++) {
            char first = arr[i].charAt(0);
            if (Character.isAlphabetic(first)) {
                answer += Character.toUpperCase(first);
            } else {
                answer += first;
            }
            for (int j = 1; j &amp;lt; arr[i].length(); j++) {
                char c = arr[i].charAt(j);
                answer += Character.toLowerCase(c);
            }
            if (i != arr.length - 1)
                answer += &quot; &quot;;
        }
    return answer;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이 코드에서 오류가 날 수 밖에 없었던 이유는 시간 초과도 있었고 첫 글자를 제외한 나머지 글자가 숫자일 때 LowerCase() 변경하는 과정에서 생길 수 밖에 없었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;최종 코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1744685237699&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public String solution(String s) {
        int idx = 0;
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i &amp;lt; s.length(); i++) {
            char c = s.charAt(i);
            if (c == ' ')
                idx = -1;

            if (Character.isDigit(c)) {
                sb.append(c);
                idx++;
                continue;
            }

            if (idx == 0) {
                sb.append(Character.toUpperCase(c));
            } else {
                sb.append(Character.toLowerCase(c));
            }

            idx++;
        }
    return sb.toString();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;String에 값을 담아 리턴하는 것보다 StringBuilder를 사용하는 것이 성능면에서 낫기 때문에 StringBuilder를 사용하였고 인덱스를 사용하여 글자의 위치를 파악하였다. 만약 현재 char 값이 숫자라면 변환없이 바로 리턴 값에 저장하고 idx == 0 이라면 첫 글자라는 뜻이기에 대문자로 변경한다. 그외의 경우는 소문자로 변경해주었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/99클럽 코테스터디 6기</category>
      <category>99클럽</category>
      <category>99클럽코테스터디6기</category>
      <category>til</category>
      <category>코테스터디 13일차</category>
      <category>프로그래머스 JadenCase 문자열 만들기</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/363</guid>
      <comments>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EA%B8%B0-13%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC#entry363comment</comments>
      <pubDate>Wed, 16 Apr 2025 10:56:09 +0900</pubDate>
    </item>
    <item>
      <title>99클럽 코테 스터디 6기 12일차 TIL (미들러)</title>
      <link>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EA%B8%B0-12%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제: 백준 2156번 포도주 마시기&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;743&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnQuLM/btsNk6ln7zE/1J6WTsqUmKhKieUfKUOHmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnQuLM/btsNk6ln7zE/1J6WTsqUmKhKieUfKUOHmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnQuLM/btsNk6ln7zE/1J6WTsqUmKhKieUfKUOHmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnQuLM%2FbtsNk6ln7zE%2F1J6WTsqUmKhKieUfKUOHmk%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;1448&quot; height=&quot;743&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;743&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;일단 이 문제는 정렬이 안되기에 탐색은 어려울 것 같다는 생각이 들었고, 중복적으로 계산을 시도해야 하기 때문에 다이나믹 프로그래밍으로 풀어야 한다고 생각이 들었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;첫시도(실패)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1744684916301&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        int[] wine = new int[n];
        for (int i = 0; i &amp;lt; n; i++) {
            wine[i] = Integer.parseInt(br.readLine());
        }

        int[] dp = new int[n];
        if (n &amp;gt;= 3) {
            dp[0] = wine[0];
            dp[1] = dp[0] + wine[1];
            dp[2] = wine[2] + Math.max(wine[0], wine[1]);
            for (int i = 3; i &amp;lt; n; i++) {
                dp[i] = wine[i] + Math.max(dp[i - 2], wine[i - 1] + dp[i - 3]);
            }
        } else if (n == 1) {
            System.out.println(wine[0]);
            return;
        } else if (n == 2) {
            System.out.println(wine[0] + wine[1]);
            return;
        }

        int max = 0;
        for (int val : dp) {
            max = Math.max(val, max);
        }

        System.out.println(max);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;문제에서 3잔을 연달아 마실 수 없다는 조건이 있다. 이에 따라 점화식을 아래와 같이 세웠다.&lt;/p&gt;
&lt;pre id=&quot;code_1744684967456&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dp[i] = wine[i] + Math.max(dp[i - 2], wine[i - 1] + dp[i - 3]);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;dp[i&amp;nbsp;-&amp;nbsp;2]&amp;nbsp;+&amp;nbsp;wine[i]&amp;nbsp;(현재&amp;nbsp;잔을&amp;nbsp;마시고,&amp;nbsp;이전&amp;nbsp;잔을&amp;nbsp;건너뛰는&amp;nbsp;경우)&lt;br /&gt;dp[i&amp;nbsp;-&amp;nbsp;3]&amp;nbsp;+&amp;nbsp;wine[i&amp;nbsp;-&amp;nbsp;1]&amp;nbsp;+&amp;nbsp;wine[i]&amp;nbsp;(현재&amp;nbsp;잔과&amp;nbsp;이전&amp;nbsp;잔을&amp;nbsp;마시고,&amp;nbsp;두&amp;nbsp;잔&amp;nbsp;전을&amp;nbsp;건너뛰는&amp;nbsp;경우)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;하지만 코드를 제출해보니, 틀렸다는 메세지가 나왔다. 그 이유는 점화식에서 현재 포도주를 제외한 조건이 빠졌기 때문이었다. 올바른 점화식은 아래와 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1744685126249&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dp[i] = Math.max(dp[i - 1], Math.max(dp[i - 2] + wine[i], dp[i - 3] + wine[i - 1] + wine[i]));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;dp[i&amp;nbsp;-&amp;nbsp;1]&amp;nbsp;(이전까지의&amp;nbsp;최대값,&amp;nbsp;현재&amp;nbsp;잔을&amp;nbsp;마시지&amp;nbsp;않는&amp;nbsp;경우) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;dp[i&amp;nbsp;-&amp;nbsp;2]&amp;nbsp;+&amp;nbsp;wine[i]&amp;nbsp;(현재&amp;nbsp;잔을&amp;nbsp;마시고,&amp;nbsp;이전&amp;nbsp;잔을&amp;nbsp;건너뛰는&amp;nbsp;경우) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;dp[i&amp;nbsp;-&amp;nbsp;3]&amp;nbsp;+&amp;nbsp;wine[i&amp;nbsp;-&amp;nbsp;1]&amp;nbsp;+&amp;nbsp;wine[i]&amp;nbsp;(현재&amp;nbsp;잔과&amp;nbsp;이전&amp;nbsp;잔을&amp;nbsp;마시고,&amp;nbsp;두&amp;nbsp;잔&amp;nbsp;전을&amp;nbsp;건너뛰는&amp;nbsp;경우)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;최종 코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1744685237699&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        int[] wine = new int[n];
        for (int i = 0; i &amp;lt; n; i++) {
            wine[i] = Integer.parseInt(br.readLine());
        }

        if (n == 1) {
            System.out.println(wine[0]);
            return;
        }

        int[] dp = new int[n];
        dp[0] = wine[0];
        dp[1] = wine[0] + wine[1];
        if (n &amp;gt; 2) {
            dp[2] = Math.max(dp[1], Math.max(wine[0] + wine[2], wine[1] + wine[2]));
        }

        for (int i = 3; i &amp;lt; n; i++) {
            dp[i] = Math.max(dp[i - 1], Math.max(dp[i - 2] + wine[i], dp[i - 3] + wine[i - 1] + wine[i]));
        }

        System.out.println(dp[n - 1]);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;점화식을 이렇게 수정하고 나니, 통과할 수 있었다.&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;size14&quot;&gt;이전보다는 어떤 문제가 다이나믹 프로그래밍에 적합한지 알 것 같다. 하지만 아직까지 점화식을 세우는 데는 어려움이 있다. 다양한 문제를 경험해보고, 감을 잡아야 할 것 같다.&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/99클럽 코테스터디 6기</category>
      <category>99클럽</category>
      <category>99클럽코테스터디6기</category>
      <category>til</category>
      <category>백준 2156번</category>
      <category>백준 포도주 마시기</category>
      <category>코테스터디 12일차</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/362</guid>
      <comments>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EA%B8%B0-12%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC#entry362comment</comments>
      <pubDate>Tue, 15 Apr 2025 11:52:04 +0900</pubDate>
    </item>
    <item>
      <title>99클럽 코테 스터디 6기 11일차 TIL (미들러)</title>
      <link>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EA%B8%B0-11%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제: 백준 16401번 과자 나눠주기&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1198&quot; data-origin-height=&quot;705&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7bpfJ/btsNkW9I3rB/8I5fJfqyPxfnskmbsOsoJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7bpfJ/btsNkW9I3rB/8I5fJfqyPxfnskmbsOsoJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7bpfJ/btsNkW9I3rB/8I5fJfqyPxfnskmbsOsoJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7bpfJ%2FbtsNkW9I3rB%2F8I5fJfqyPxfnskmbsOsoJ0%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;1198&quot; height=&quot;705&quot; data-origin-width=&quot;1198&quot; data-origin-height=&quot;705&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;M명의 조카가 있고 N개의 과자가 있다. 동일한 크기의 과자를 나눠준다고 할 때 최대 과자의 길이를 출력해야 한다. 여기서 과자의 길이는 양수이고 같은 길이로 막대과자를 나눠줄 수 없다면 0을 출력해야 한다. 또한 입력 값은 int 범위 내에 들어오는 값으로 입력되는 값 모두 int로 설정해주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이 문제는 나눠줄 수 있는 막대과자의 최대 길이를 구하는 것으로 이분탐색을 통해 값을 구할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;최종 코드&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1744596736316&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), &quot; &quot;);

        int m = Integer.parseInt(st.nextToken());
        int n = Integer.parseInt(st.nextToken());

        st = new StringTokenizer(br.readLine(), &quot; &quot;);
        int[] snacks = new int[n];
        for (int i = 0; i &amp;lt; n; i++) {
            snacks[i] = Integer.parseInt(st.nextToken());
        }

        Arrays.sort(snacks);

        int start = 1;
        int end = snacks[n - 1];

        while (start &amp;lt;= end) {
            int mid = (start + end) / 2;

            int cnt = 0;
            for (int i = 0; i &amp;lt; n; i++) {
                if (snacks[i] &amp;gt;= mid) {
                    cnt += snacks[i] / mid;
                }
            }

            if (cnt &amp;gt;= m) {
                start = mid + 1;
            } else {
                end = mid - 1;
            }

        }
        System.out.println(end);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;처음 이분 탐색으로 풀려고 하니, 탐색 대상을 어떻게 설정해야 하나 고민이 되었다. 다른 이분 탐색 문제를 풀었을 때 인덱스를 이용하여 탐색했기에 여기서도 인덱스를 가지고 탐색을 하려고 했다. 하지만 답이 나오지 않았다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이분탐색에서 우리가 얻고자하는 것은 과자의 최대 길이이다. 특정 과자나 인덱스를 찾는 것이 아니기 때문에 과자의 길이로 탐색해야 한다는 것을 알게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;1. &lt;span style=&quot;color: #006dd7;&quot;&gt;입력&lt;/span&gt;: 값 입력 받기&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;2. &lt;span style=&quot;color: #006dd7;&quot;&gt;정렬&lt;/span&gt;: 값을 입력 받고 입력받은 막대 과자의 길이를 오름차순으로 정렬&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;3. &lt;span style=&quot;color: #006dd7;&quot;&gt;범위 지정하기&lt;/span&gt;: 시작 값은 막대의 최소 길이인 1, 최대 값은 입력 값에서 최대 막대 과자 길이&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;4. &lt;span style=&quot;color: #006dd7;&quot;&gt;반복문&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- 반복문을 돌면서 중간값(mid)을 m명에게 나눠줄 수 있는지 탐색, cnt 변수로 몇 명에게 나눌 수 있는지 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- 조건을 만족하는 경우(cnt &amp;gt;= m), 더 큰 길이를 탐색하기 위해 start = mid + 1로 이동&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- 만족하지 않는 경우, 더 작은 길이를 탐색하기 위해 end = mid + 1로 이동&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;5. &lt;span style=&quot;color: #006dd7;&quot;&gt;출력&lt;/span&gt;: end 값 출력&lt;/p&gt;</description>
      <category>알고리즘/99클럽 코테스터디 6기</category>
      <category>99클럽</category>
      <category>99클럽코테스터디6기</category>
      <category>til</category>
      <category>백준 16401번</category>
      <category>백준 과자 나눠주기</category>
      <category>코테스터디 11일차</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/361</guid>
      <comments>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EA%B8%B0-11%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC#entry361comment</comments>
      <pubDate>Mon, 14 Apr 2025 11:20:25 +0900</pubDate>
    </item>
    <item>
      <title>99클럽 코테 스터디 6기 10일차 TIL (미들러)</title>
      <link>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EA%B8%B0-10%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제: 백준 1783번 병든 나이트&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-04-11 오후 10.40.50.png&quot; data-origin-width=&quot;2312&quot; data-origin-height=&quot;1488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWZhxl/btsNinBqkXr/77VYgifqfR2gbMJvUTDNLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWZhxl/btsNinBqkXr/77VYgifqfR2gbMJvUTDNLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWZhxl/btsNinBqkXr/77VYgifqfR2gbMJvUTDNLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWZhxl%2FbtsNinBqkXr%2F77VYgifqfR2gbMJvUTDNLK%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;2312&quot; height=&quot;1488&quot; data-filename=&quot;스크린샷 2025-04-11 오후 10.40.50.png&quot; data-origin-width=&quot;2312&quot; data-origin-height=&quot;1488&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이 문제는 단순한 규칙 찾기 문제이다. 예제가 많은 것을 보고 눈치를 챘어야 하는데,,, 몰랐다. 그래서 이 문제를 어떤 알고리즘으로 풀어야 하나 고민이 되었던 것 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이 문제에서 나이트는 4가지 방법으로만 움직일 수 있고 이동 횟수가 5회 이상이라면 모든 이동방법을 다 사용해야 한다는 조건이 있다. 그리고 나이트는 위, 아래 그리고 오른쪽으로 밖에 이동하지 못한다. 즉, n이 작다면 갈 수 있는 칸은 한정적인 것이다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;전체코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1744379075735&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] input = br.readLine().split(&quot; &quot;);
        long n = Long.parseLong(input[0]);
        long m = Long.parseLong(input[1]);

        long result = 0;

        if (n == 1) {
            result = 1;
        } else if (n == 2) {
            result = Math.min(4, (m + 1) / 2);
        } else {
            if (m &amp;lt; 7) {
                result = Math.min(4, m);
            } else {
                result = m - 2;
            }
        }
        System.out.println(result);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;n == 1 이라면 갈 수 있는 칸은 위치하고 있는 자리 뿐이기에 result 값을 1로 설정한다. n == 2라면 최대로 갈 수 있는 칸은 4개이지만 m의 수에 따라 달라진다. m이 2이하라면 조건에 따라 움직이지 못하기 때문이다. n == 3 이상이라면, 그리고 m이 6이상이라면 4가지 조건을 모두 사용할 수 있기에 조건문을 두어 result 값을 다르게 출력한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;규칙만 찾으면 쉬운 문제인데 규칙을 못 찾으면 그 어느 문제보다 어려운 것 같다ㅠ&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/99클럽 코테스터디 6기</category>
      <category>99클럽</category>
      <category>99클럽코테스터디6기</category>
      <category>til</category>
      <category>백준 1783번</category>
      <category>백준 병든 나이트</category>
      <category>코테스터디 9일차</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/360</guid>
      <comments>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EA%B8%B0-10%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC#entry360comment</comments>
      <pubDate>Fri, 11 Apr 2025 22:49:31 +0900</pubDate>
    </item>
    <item>
      <title>99클럽 코테 스터디 6기 9일차 TIL (미들러)</title>
      <link>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EA%B8%B0-9%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;문제: 백준 2437번 저울&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1432&quot; data-origin-height=&quot;770&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dwdojP/btsNdUMM4oV/Et02fE8IdPXX4ys6p6x300/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dwdojP/btsNdUMM4oV/Et02fE8IdPXX4ys6p6x300/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dwdojP/btsNdUMM4oV/Et02fE8IdPXX4ys6p6x300/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdwdojP%2FbtsNdUMM4oV%2FEt02fE8IdPXX4ys6p6x300%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;1432&quot; height=&quot;770&quot; data-origin-width=&quot;1432&quot; data-origin-height=&quot;770&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;/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;1. 저울추의 값이 중복되는 문제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 메모이제이션을 실행할 때에 어떤 식으로 값을 저장해야 하는지에 대한 문제&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;/p&gt;
&lt;pre id=&quot;code_1744252071129&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Test2437 {
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        int[] w = new int[n];
        StringTokenizer st = new StringTokenizer(br.readLine(), &quot; &quot;);
        for (int i = 0; i &amp;lt; n; i++) {
            w[i] = Integer.parseInt(st.nextToken());
        }

        Arrays.sort(w);

        long currentSum = 0;

        for (int i = 0; i &amp;lt; n; i++) {
            if (w[i] &amp;gt; currentSum + 1) {
                System.out.println(currentSum + 1);
                return;
            }
            currentSum += w[i];
        }

        System.out.println(currentSum + 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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추의 무게를 정렬한다음 현재 추의 무게가 측정 가능한 범위 + 1 보다 크다면 그 값이 최소 측정이 불가능한 값이 되는 것이다. 만약 값이 크지 않다면 현재 추를 사용해 측정 가능한 범위를 확장한다.&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/99클럽 코테스터디 6기</category>
      <category>99클럽</category>
      <category>99클럽코테스터디6기</category>
      <category>til</category>
      <category>백준 2437번</category>
      <category>백준 저울</category>
      <category>코테스터디 9일차</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/359</guid>
      <comments>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EA%B8%B0-9%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC#entry359comment</comments>
      <pubDate>Thu, 10 Apr 2025 11:30:55 +0900</pubDate>
    </item>
    <item>
      <title>99클럽 코테 스터디 6기 8일차 TIL (미들러)</title>
      <link>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EA%B8%B0-8%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제: 백준 9996번 한국이 그리울 땐 서버에 접속하지&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1443&quot; data-origin-height=&quot;758&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lchIy/btsNe9uuD8l/XkSu3FiJSgOtv210KRkqyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lchIy/btsNe9uuD8l/XkSu3FiJSgOtv210KRkqyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lchIy/btsNe9uuD8l/XkSu3FiJSgOtv210KRkqyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlchIy%2FbtsNe9uuD8l%2FXkSu3FiJSgOtv210KRkqyK%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;1443&quot; height=&quot;758&quot; data-origin-width=&quot;1443&quot; data-origin-height=&quot;758&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;소문자와 '*' 하나로 이루어진 패턴과 각각의 파일명이 일치하는지 구하는 문제이다. 입력 조건을 보게 되면 별표의 경우 문자열의 시작과 끝에 있지 않는다고 이야기한다. 이 말은 별표를 기준으로 두 그룹의 문자열로 나뉘게 되고 해당 문자열을 입력된 파일명과 비교를 해야 한다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;첫 번째 시도(실패)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1744174401584&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        String pattern = br.readLine();

        String first = &quot;&quot;;
        String last = &quot;&quot;;
        int dividePlace = 0;
        for (int i = 0; i &amp;lt; pattern.length(); i++) {
            char c = pattern.charAt(i);
            if (c == '*') {
                dividePlace = i;
                first = pattern.substring(0, dividePlace);
                last = pattern.substring(dividePlace + 1, pattern.length());
                break;
            }
        }

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i &amp;lt; n; i++) {
            String fileName = br.readLine();
            if (fileName.substring(0, dividePlace).equals(first)
                    &amp;amp;&amp;amp; fileName.substring(fileName.length() - dividePlace).equals(last)) {
                sb.append(&quot;DA&quot;);
            } else {
                sb.append(&quot;NE&quot;);
            }
            sb.append(&quot;\n&quot;);
        }

        System.out.println(sb);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;해당 코드를 제출하니 런타임 에러 (StringIndexOutOfBounds)라는 에러가 발생했다. 에러의 원인을 곰곰이 생각해 보니, 패턴 문자열보다 입력되는 파일명이 더 짧을 수도 있겠다는 생각이 들었다. 따라서 아래와 같이 코드를 변경하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;최종 코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1744174518546&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        String pattern = br.readLine();

        String first = &quot;&quot;;
        String last = &quot;&quot;;
        for (int i = 0; i &amp;lt; pattern.length(); i++) {
            char c = pattern.charAt(i);
            if (c == '*') {
                first = pattern.substring(0, i);
                last = pattern.substring(i + 1, pattern.length());
                break;
            }
        }

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i &amp;lt; n; i++) {
            String fileName = br.readLine();

            if (fileName.length() &amp;lt; first.length() + last.length()) {
                sb.append(&quot;NE\n&quot;);
                continue;
            }

            if (fileName.substring(0, first.length()).equals(first)
                    &amp;amp;&amp;amp; fileName.substring(fileName.length() - last.length()).equals(last)) {
                sb.append(&quot;DA&quot;);
            } else {
                sb.append(&quot;NE&quot;);
            }
            sb.append(&quot;\n&quot;);
        }

        System.out.println(sb);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;불필요한 변수는 제거해주고, 파일명의 길이가 패턴의 길이(별표 제외) 보다 짧으면 continue 하도록 코드를 변경했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;코드를 간략히 설명하자면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;패턴에서 별표를 중심으로 문자열의 시작(first)과 끝(last) 문자를 생성하고 해당 문자와 파일명과 비교하도록 하였다. 만약 파일명의 시작과 끝이 동일할 경우 'DA'를 출력하고 아닐 경우 'NE'를 출력하도록 했다.&lt;/p&gt;</description>
      <category>알고리즘/99클럽 코테스터디 6기</category>
      <category>99클럽</category>
      <category>99클럽코테스터디6기</category>
      <category>til</category>
      <category>백준 9996번</category>
      <category>백준 한국이 그리울 땐 서버에 접속하지</category>
      <category>코테스터디 8일차</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/358</guid>
      <comments>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EA%B8%B0-8%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC#entry358comment</comments>
      <pubDate>Wed, 9 Apr 2025 13:59:44 +0900</pubDate>
    </item>
    <item>
      <title>99클럽 코테 스터디 6기 7일차 TIL (미들러)</title>
      <link>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EA%B8%B0-7%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제: 백준 10799번 쇠막대기&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1435&quot; data-origin-height=&quot;841&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dDBeo2/btsNdluZAPy/FBqu9gCKt5qME2GOLhgOK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dDBeo2/btsNdluZAPy/FBqu9gCKt5qME2GOLhgOK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dDBeo2/btsNdluZAPy/FBqu9gCKt5qME2GOLhgOK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdDBeo2%2FbtsNdluZAPy%2FFBqu9gCKt5qME2GOLhgOK0%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;1435&quot; height=&quot;841&quot; data-origin-width=&quot;1435&quot; data-origin-height=&quot;841&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;잘려진 쇠막대기 조각의 총 개수를 구하는 문제이다. Stack을 사용하여 쌍이 나올 때마다 개수를 세면 되지 않을까 생각했지만 원하는 출력 값이 나오지 않았다. 어떤 조건이 더 필요할까 곰곰이 생각해보니 곧바로 쌍이 나오는 경우와 닫는 괄호가 따로 나오는 경우가 다르다는 것을 알게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;닫는 괄호가 ')' 이고, 이전 문자가 여는 괄호 '(' 인 경우, 이는 레이저를 의미하기에 스택에서 하나를 제거하고 현재 스택에 남아있는 여는 괄호의 개수를 더해야 한다. 이와 다르게 이전 문자가 여는 괄호 '(' 가 아닌 경우는 쇠막대기의 끝을 의미하기에 스택에서 하나를 제거하고 조각 하나를 추가해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;제출 코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1744077661741&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String input = br.readLine();

        Stack&amp;lt;Character&amp;gt; stack = new Stack&amp;lt;&amp;gt;();
        int count = 0;

        char first = input.charAt(0);
        if (first == '(')
            stack.add(first);

        for (int i = 1; i &amp;lt; input.length(); i++) {
            char c = input.charAt(i);
            if (c == '(') {
                stack.add(c);
            } else if (c == ')' &amp;amp;&amp;amp; input.charAt(i - 1) == '(') {
                stack.pop();
                count += stack.size();
            } else {
                stack.pop();
                count++;
            }
        }

        System.out.println(count);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;first 변수&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;닫는 괄호가 먼저 나올 일은 없지만 ArrayOutBoundException이라는 예외를 피하기 위해 변수를 만들고 조건문을 작성하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;for 반복문&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;1번부터 반복하면서 여는 괄호('(') 일때 Stack에 넣고 닫는 괄호이면서 이전 값이 여는 괄호일 때 Stack.pop()를 하고 stack에 남은 개수를 카운트하도록 하였다. 그 외의 경우에는 1만 카운트하도록 하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;최종 코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1744077917420&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String str = br.readLine();

        int totalcount = 0;

        Stack&amp;lt;Character&amp;gt; stack = new Stack&amp;lt;&amp;gt;();

        for(int i = 0; i &amp;lt; str.length(); i++){
            char ch = str.charAt(i);
            if(ch == '('){
                stack.push(ch);
            }
            else{
                stack.pop();
                if(str.charAt(i - 1) == '('){
                    totalcount += stack.size();
                }else{
                    totalcount++;
                }
            }
        }
        System.out.println(totalcount);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;닫는 괄호가 먼저 나올 일이 없으니 first 변수를 제외하고 반복되어 사용되는 코드를 줄인 코드이다. 이렇게 하니 중복코드없이 보기에도 깔끔하고 보다 명확해진 것 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/99클럽 코테스터디 6기</category>
      <category>99클럽</category>
      <category>99클럽코테스터디6기</category>
      <category>til</category>
      <category>백준 10799번</category>
      <category>백준 쇠막대기</category>
      <category>코테스터디 7일차</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/357</guid>
      <comments>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EA%B8%B0-7%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC#entry357comment</comments>
      <pubDate>Tue, 8 Apr 2025 11:08:11 +0900</pubDate>
    </item>
    <item>
      <title>99클럽 코테 스터디 6기 6일차 TIL (미들러)</title>
      <link>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EA%B8%B0-6%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제: 백준 4963번 섬의 개수&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1399&quot; data-origin-height=&quot;799&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhycTC/btsNaK3FfoX/8E9yU5cjKwRynCN2WuhRm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhycTC/btsNaK3FfoX/8E9yU5cjKwRynCN2WuhRm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhycTC/btsNaK3FfoX/8E9yU5cjKwRynCN2WuhRm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhycTC%2FbtsNaK3FfoX%2F8E9yU5cjKwRynCN2WuhRm1%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;1399&quot; height=&quot;799&quot; data-origin-width=&quot;1399&quot; data-origin-height=&quot;799&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;각 테스트 케이스에서 가로, 세로, 대각선으로 연결되어 있는 섬을 구하는 문제이다. 이 문제는 DFS나 BFS 알고리즘을 통해 풀 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;코드가 길기 때문에 메서드 별로 나눠서 설명하도록 하겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Main&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743988282940&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    static int[] dr = { 1, -1, 0, 0, -1, -1, 1, 1 };
    static int[] dc = { 0, 0, 1, -1, -1, 1, -1, 1 };

    static int w;
    static int h;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        StringBuilder sb = new StringBuilder();
        
        while (true) {
            st = new StringTokenizer(br.readLine(), &quot; &quot;);
            w = Integer.parseInt(st.nextToken());
            h = Integer.parseInt(st.nextToken());

            if (w == 0 &amp;amp;&amp;amp; h == 0)
                break;

            int[][] map = new int[h][w];
            for (int i = 0; i &amp;lt; h; i++) {
                st = new StringTokenizer(br.readLine(), &quot; &quot;);
                for (int j = 0; j &amp;lt; w; j++) {
                    map[i][j] = Integer.parseInt(st.nextToken());
                }
            }
            boolean[][] visited = new boolean[h][w];
            sb.append(countLands(map, visited)).append(&quot;\n&quot;);
        }
        System.out.println(sb);
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;static 변수 dr, dc&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;섬(1)이 가로, 세로, 대각선에 존재하는지 체크한다. 위, 아래, 양 옆뿐만 아니라 각 대각선도 체크해야 하기 때문이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;while문&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;해당 문제는 여러 개의 테스트 케이스를 입력 값으로 두기 때문에 반복문을 이용하여 값을 받고 조건문을 통해 while문을 빠져나오도록 설정(조건: w와 h가 0일 때)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;int[][] map&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;정사각형으로 이루어진 지도의 값을 저장하는 배열&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;boolean[][] visited&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;지도의 위치에 방문했는지 체크하는 배열&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;coundLands&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743988675111&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private static int countLands(int[][] map, boolean[][] visited) {
    int count = 0;
    for (int i = 0; i &amp;lt; map.length; i++) {
        for (int j = 0; j &amp;lt; map[i].length; j++) {
            if (map[i][j] == 1 &amp;amp;&amp;amp; !visited[i][j]) {
                count += bfs(i, j, map, visited);
            }
        }
    }
    return count;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;섬의 개수를 세는 메서드로 만약 현재 반복문에서 가리키는 곳이 섬(1)이고 방문하지 않았다면 dfs() 메서드를 호출하고 count 값을 업데이트한다. 반복문이 종료되었을 때에는 count를 리턴한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;bfs&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743988810202&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private static int bfs(int x, int y, int[][] map, boolean[][] visited) {
    Queue&amp;lt;int[]&amp;gt; q = new LinkedList&amp;lt;&amp;gt;();
    q.offer(new int[] { x, y });
    visited[x][y] = true;

    while (!q.isEmpty()) {
        int[] target = q.poll();

        for (int i = 0; i &amp;lt; 8; i++) {
            int r = target[0] + dr[i];
            int c = target[1] + dc[i];
            if (r &amp;gt;= 0 &amp;amp;&amp;amp; r &amp;lt; h &amp;amp;&amp;amp; c &amp;gt;= 0 &amp;amp;&amp;amp; c &amp;lt; w &amp;amp;&amp;amp; map[r][c] == 1 &amp;amp;&amp;amp; !visited[r][c]) {
                q.offer(new int[] { r, c });
                visited[r][c] = true;
            }
        }
    }
    return 1;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;Queue를 만들어 현재 값을 저장하고 반복문을 통해 가로, 세로, 대각선에 섬이 있는지 체크하는 로직이다. 섬이 존재한다면 반복문을 돌며 q 변수에 저장이 되고 방문여부를 true로 변경한다. 존재하는 섬이 없다면 1을 리턴한다.&lt;/p&gt;</description>
      <category>알고리즘/99클럽 코테스터디 6기</category>
      <category>99클럽</category>
      <category>99클럽코테스터디6기</category>
      <category>til</category>
      <category>백준 4963번</category>
      <category>백준 섬의 개수</category>
      <category>코테스터디 6일차</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/356</guid>
      <comments>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EA%B8%B0-6%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC#entry356comment</comments>
      <pubDate>Mon, 7 Apr 2025 10:23:08 +0900</pubDate>
    </item>
    <item>
      <title>99클럽 코테 스터디 6기 5일차 TIL (미들러)</title>
      <link>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EA%B8%B0-5%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제: 백준 2559번 수열&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1162&quot; data-origin-height=&quot;681&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNEt3m/btsM7YgRtX5/twQJCamh9vio5gvaL7AJBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNEt3m/btsM7YgRtX5/twQJCamh9vio5gvaL7AJBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNEt3m/btsM7YgRtX5/twQJCamh9vio5gvaL7AJBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNEt3m%2FbtsM7YgRtX5%2FtwQJCamh9vio5gvaL7AJBk%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;1162&quot; height=&quot;681&quot; data-origin-width=&quot;1162&quot; data-origin-height=&quot;681&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이 문제는 주어진 k일 동안 연속된 온도의 합이 가장 큰 값을 출력해야 한다. 문제가 어렵지 않았는데 다양한 방법을 시도하다 여러 실패를 맛보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;첫 번째 시도&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743729899815&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new java.io.InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), &quot; &quot;);
        int n = Integer.parseInt(st.nextToken());
        int k = Integer.parseInt(st.nextToken());

        int[] arr = new int[n];
        st = new StringTokenizer(br.readLine(), &quot; &quot;);
        for (int i = 0; i &amp;lt; n; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }

        int max = Integer.MIN_VALUE;
        Queue&amp;lt;Integer&amp;gt; q = new LinkedList&amp;lt;&amp;gt;();
        
        for (int i = 0; i &amp;lt; n; i++) {
            if (q.size() == k) {
                int sum = 0;
                for (Integer val : q) {
                    sum += val;
                }
                max = Math.max(max, sum);
                q.remove();
            }
            q.add(arr[i]);
        }

        System.out.println(max);

    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;Queue를 활용하여 값을 저장하고 지정된 사이즈보다 클 때 합을 계산하도록 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;값은 정확하게 반환되는데, 큐 내부 연산과 for문 내에서 합을 계산하기 위해 반복문을 내부에서 한번 더 사용하기 때문에 시간 초과 에러가 떴다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;두 번째 시도&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743730063112&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new java.io.InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), &quot; &quot;);
        int n = Integer.parseInt(st.nextToken());
        int k = Integer.parseInt(st.nextToken());

        int[] arr = new int[n];
        st = new StringTokenizer(br.readLine(), &quot; &quot;);
        for (int i = 0; i &amp;lt; n; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }

        int max = Integer.MIN_VALUE;

        for (int i = 0; i &amp;lt;= n - k; i++) {
            int sum = 0;
            for (int j = i; j &amp;lt; k + i; j++) {
                sum += arr[j];
            }
            max = Math.max(max, sum);
        }

        System.out.println(max);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이중 for문을 활용하여 값을 계산하도록 했다. 코드도 단순하고 쉽지만 중첩된 반복문을 사용하기 때문에 시간복잡도가 O(N^2)이 되어 좋지 않은 알고리즘 코드가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;891&quot; data-origin-height=&quot;86&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFRlf3/btsM8PKd3Ua/jFKLIZZ4oA96cUH8Joi0M0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFRlf3/btsM8PKd3Ua/jFKLIZZ4oA96cUH8Joi0M0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFRlf3/btsM8PKd3Ua/jFKLIZZ4oA96cUH8Joi0M0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFRlf3%2FbtsM8PKd3Ua%2FjFKLIZZ4oA96cUH8Joi0M0%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;891&quot; height=&quot;86&quot; data-origin-width=&quot;891&quot; data-origin-height=&quot;86&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;세 번째 시도&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743730184903&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new java.io.InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), &quot; &quot;);
        int n = Integer.parseInt(st.nextToken());
        int k = Integer.parseInt(st.nextToken());

        int[] arr = new int[n];
        st = new StringTokenizer(br.readLine(), &quot; &quot;);
        for (int i = 0; i &amp;lt; n; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }

        int max = Integer.MIN_VALUE;
        int sum = 0;

        int first = 0;
        int second = 0;
        while (second &amp;lt; n) {
            sum += arr[second];

            if (second - first + 1 &amp;gt; k) {
                sum -= arr[first];
                first++;
            }

            if (second - first + 1 == k) {
                max = Math.max(max, sum);
            }

            second++;
        }

        System.out.println(max);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;투포인터 알고리즘을 활용한 풀이이다. 다른 코드에 비해 for문을 한 번만 사용하기에 시간복잡도는 O(N)이 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;if(second - first +1 &amp;gt; k)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;second - first +1 &amp;gt; k 가 된다면 구간의 길이를 초과하게 됨으로 첫 번째 포인터의 값을 빼주어야 한다. 그리고 해당 포인터의 위치를 이동한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;if(second - first + 1 == k)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;포인터의 간격이 구간의 길이와 일치할 때는 해당 값을 가장 큰 합과 비교하여 저장하도록 한다.&lt;/p&gt;</description>
      <category>알고리즘/99클럽 코테스터디 6기</category>
      <category>99클럽</category>
      <category>99클럽코테스터디6기</category>
      <category>til</category>
      <category>백준 2559번</category>
      <category>백준 수열</category>
      <category>코테스터디 5일차</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/355</guid>
      <comments>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EA%B8%B0-5%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC#entry355comment</comments>
      <pubDate>Fri, 4 Apr 2025 10:35:51 +0900</pubDate>
    </item>
    <item>
      <title>99클럽 코테 스터디 6기 4일차 TIL (미들러)</title>
      <link>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EA%B8%B0-4%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제: 백준 2468번 안전 영역&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;825&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2468&quot; target=&quot;_blank&quot; title=&quot;안전영역 문제&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lXdFE/btsM6fCCxM4/fNjpqIISk1Q96QZ4KHzkhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlXdFE%2FbtsM6fCCxM4%2FfNjpqIISk1Q96QZ4KHzkhK%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;1448&quot; height=&quot;825&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;825&quot;/&gt;&lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;어떤 지역의 높이 정보가 주어졌을 때, 장마철에 물에 잠기지 않는 안전한 영역의 최대 개수를 계산해야 하는데, 이를 위해서는 모든 경우의 수를 구해야 한다고 생각했다. 모든 가능성을 다 확인한 다음, 안전한 영역의 개수를 구하기 위해 DFS || BFS 알고리즘을 활용해서 문제를 풀었다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;첫 번째 시도(실패)&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743646005225&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());
        int[][] height = new int[n][n];
        int max = 0;
        StringTokenizer st;
        for (int i = 0; i &amp;lt; n; i++) {
            st = new StringTokenizer(br.readLine(), &quot; &quot;);
            for (int j = 0; j &amp;lt; n; j++) {
                int nums = Integer.parseInt(st.nextToken());
                height[i][j] = nums;
                max = Math.max(max, nums);
            }
        }

        int maxHeight = 0;
        for (int i = 1; i &amp;lt; max; i++) {
            maxHeight = Math.max(maxHeight, countSafeSpace(height, n, i));
        }

        System.out.println(maxHeight);
    }

    private static int countSafeSpace(int[][] height, int n, int h) {
        boolean[][] space = new boolean[n][n];

        for (int i = 0; i &amp;lt; n; i++) {
            for (int j = 0; j &amp;lt; n; j++) {
                if (height[i][j] &amp;lt;= h) {
                    space[i][j] = true;
                }
            }
        }

        int count = 0;

        for (int i = 0; i &amp;lt; n; i++) {
            for (int j = 0; j &amp;lt; n; j++) {
                if (!space[i][j]) {
                    count += dfs(space, i, j, n);
                }
            }
        }

        return count;
    }

    private static int dfs(boolean[][] space, int x, int y, int n) {
        int[] dr = { 1, -1, 0, 0 };
        int[] dc = { 0, 0, 1, -1 };
        Stack&amp;lt;int[]&amp;gt; stack = new Stack&amp;lt;&amp;gt;();
        stack.push(new int[] { x, y });
        space[x][y] = true;

        while (!stack.isEmpty()) {
            int[] val = stack.pop();
            for (int i = 0; i &amp;lt; 4; i++) {
                int r = val[0] + dr[i];
                int c = val[1] + dc[i];

                if (r &amp;gt;= 0 &amp;amp;&amp;amp; r &amp;lt; n &amp;amp;&amp;amp; c &amp;gt;= 0 &amp;amp;&amp;amp; c &amp;lt; n &amp;amp;&amp;amp; space[r][c] == false) {
                    stack.push(new int[] { r, c });
                    space[r][c] = true;
                }
            }
        }

        return 1;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;예제로 문제를 풀었을 때도 이상 없이 동작했는데 실패했다는 문구가 떴다. 무엇이 문제일까 곰곰이 생각해 봐도 답이 나오지 않았다. 그래서 나는 인공지능의 힘을 빌려 틀린 이유에 대해 알아보았다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;알아보니, 경우의 수 범위를 잘못 설정해 비가 안 오거나 모든 게 물에 잠길 가능성을 포함하지 않아서였다. 즉, main 메서드 내의 for문은 0 ~ max까지 탐색하도록 했어야 했다.&lt;/p&gt;
&lt;pre id=&quot;code_1743646334655&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for (int i = 0; i &amp;lt;= max; i++) {
    maxHeight = Math.max(maxHeight, countSafeSpace(height, n, i));
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;코드를 아래와 같이 변경하니 오류 없이 동작했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;1. DFS, BFS 모두 사용할 수 있지만 시간복잡도나 메모리 측면에서는 BFS가 더 효율적이고 직관적이다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;2. boolean[] 배열을 미리 초기화하는 건 직관적이지만, 방문 여부를 체크하는 배열로 따로 두고 조건문에서 관리하는 것이 더 명확하다.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;인공지능의 제안에 따라 Queue로 BFS 알고리즘을 구현하였고, 방문 여부를 체크할 때 각 데이터의 높이를 비교하기로 하였다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1743646666290&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());
        int[][] height = new int[n][n];
        int max = 0;
        StringTokenizer st;
        for (int i = 0; i &amp;lt; n; i++) {
            st = new StringTokenizer(br.readLine(), &quot; &quot;);
            for (int j = 0; j &amp;lt; n; j++) {
                int nums = Integer.parseInt(st.nextToken());
                height[i][j] = nums;
                max = Math.max(max, nums);
            }
        }

        int maxHeight = 0;

        for (int i = 0; i &amp;lt;= max; i++) {
            maxHeight = Math.max(maxHeight, countSafeSpace(height, n, i));
        }

        System.out.println(maxHeight);
    }

    private static int countSafeSpace(int[][] height, int n, int h) {
        boolean[][] visited = new boolean[n][n];
        int count = 0;

        for (int i = 0; i &amp;lt; n; i++) {
            for (int j = 0; j &amp;lt; n; j++) {
                if (height[i][j] &amp;gt; h &amp;amp;&amp;amp; !visited[i][j]) {
                    count += dfs(visited, height, i, j, n, h);
                }
            }
        }

        return count;
    }

    private static int dfs(boolean[][] visited, int[][] height, int x, int y, int n, int h) {
        int[] dr = { 1, -1, 0, 0 };
        int[] dc = { 0, 0, 1, -1 };
        visited[x][y] = true;
        Queue&amp;lt;int[]&amp;gt; q = new LinkedList&amp;lt;&amp;gt;();
        q.offer(new int[] { x, y });

        while (!q.isEmpty()) {
            int[] val = q.poll();
            for (int i = 0; i &amp;lt; 4; i++) {
                int r = val[0] + dr[i];
                int c = val[1] + dc[i];

                if (r &amp;gt;= 0 &amp;amp;&amp;amp; r &amp;lt; n &amp;amp;&amp;amp; c &amp;gt;= 0 &amp;amp;&amp;amp; c &amp;lt; n &amp;amp;&amp;amp; !visited[r][c] &amp;amp;&amp;amp; height[r][c] &amp;gt; h) {
                    q.offer(new int[] { r, c });
                    visited[r][c] = true;
                }
            }
        }

        return 1;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;시간복잡도나 메모리 측면으로 봤을 때 더 나아졌는지 모르겠지만, 방문 여부 배열을 따로 두니 코드가 훨씬 깔끔해졌다. 인공지능의 말이 모두 정확한 건 아니지만 풀이할 때&amp;nbsp;다른 사람들의 코드를 보거나 인공지능의 힘을 빌리는 것도 생각을 확장하는 데에 도움을 주는 것 같다.&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/99클럽 코테스터디 6기</category>
      <category>99클럽</category>
      <category>99클럽코테스터디6기</category>
      <category>til</category>
      <category>백준 2468번</category>
      <category>백준 안전영역</category>
      <category>코테스터디 4일차</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/354</guid>
      <comments>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EA%B8%B0-4%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC#entry354comment</comments>
      <pubDate>Thu, 3 Apr 2025 11:26:03 +0900</pubDate>
    </item>
    <item>
      <title>99클럽 코테 스터디 6기 3일차 TIL (미들러)</title>
      <link>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EA%B8%B0-3%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제: 프로그래머스 바탕화면 정리&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;코딩테스트를 준비하는 머쓱이는 프로그래머스에서 문제를 풀고 나중에 다시 코드를 보면서 공부하려고 작성한 코드를 컴퓨터 바탕화면에 아무 위치에나 저장해 둡니다. 저장한 코드가 많아지면서 머쓱이는 본인의 컴퓨터 바탕화면이 너무 지저분하다고 생각했습니다. 프로그래머스에서 작성했던 코드는 그 문제에 가서 다시 볼 수 있기 때문에 저장해 둔 파일들을 전부 삭제하기로 했습니다.&lt;br /&gt;&lt;br /&gt;컴퓨터 바탕화면은 각 칸이 정사각형인 격자판입니다. 이때 컴퓨터 바탕화면의 상태를 나타낸 문자열 배열 wallpaper가 주어집니다. 파일들은 바탕화면의 격자칸에 위치하고 바탕화면의 격자점들은 바탕화면의 가장 왼쪽 위를 (0, 0)으로 시작해 (세로 좌표, 가로 좌표)로 표현합니다. 빈칸은 &quot;.&quot;, 파일이 있는 칸은 &quot;#&quot;의 값을 가집니다. 드래그를 하면 파일들을 선택할 수 있고, 선택된 파일들을 삭제할 수 있습니다. &lt;br /&gt;&lt;br /&gt;머쓱이는 최소한의 이동거리를 갖는 한 번의 드래그로 모든 파일을 선택해서 한 번에 지우려고 하며 드래그로 파일들을 선택하는 방법은 다음과 같습니다.드래그는 바탕화면의 격자점 S(lux, luy)를 마우스 왼쪽 버튼으로 클릭한 상태로 격자점 E(rdx, rdy)로 이동한 뒤 마우스 왼쪽 버튼을 떼는 행동입니다. 이때, &quot;점 S에서 점 E로 드래그한다&quot;고 표현하고 점 S와 점 E를 각각 드래그의 시작점, 끝점이라고 표현합니다.점 S(lux, luy)에서 점 E(rdx, rdy)로 드래그를 할 때, &quot;드래그 한 거리&quot;는 |rdx - lux| + |rdy - luy|로 정의합니다.점 S에서 점 E로 드래그를 하면 바탕화면에서 두 격자점을 각각 왼쪽 위, 오른쪽 아래로 하는 직사각형 내부에 있는 모든 파일이 선택됩니다.&lt;br /&gt;&lt;br /&gt;예를 들어 wallpaper = [&quot;.#...&quot;, &quot;..#..&quot;, &quot;...#.&quot;]인 바탕화면을 그림으로 나타내면 다음과 같습니다.이러한 바탕화면에서 다음 그림과 같이 S(0, 1)에서 E(3, 4)로 드래그하면 세 개의 파일이 모두 선택되므로 드래그 한 거리 (3 - 0) + (4 - 1) = 6을 최솟값으로 모든 파일을 선택 가능합니다.&lt;br /&gt;&lt;br /&gt;(0, 0)에서 (3, 5)로 드래그해도 모든 파일을 선택할 수 있지만 이때 드래그 한 거리는 (3 - 0) + (5 - 0) = 8이고 이전의 방법보다 거리가 늘어납니다.머쓱이의 컴퓨터 바탕화면의 상태를 나타내는 문자열 배열 wallpaper가 매개변수로 주어질 때 바탕화면의 파일들을 한 번에 삭제하기 위해 최소한의 이동거리를 갖는 드래그의 시작점과 끝점을 담은 정수 배열을 return하는 solution 함수를 작성해 주세요. 드래그의 시작점이 (lux, luy), 끝점이 (rdx, rdy)라면 정수 배열 [lux, luy, rdx, rdy]를 return하면 됩니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;문제가 길어서 어려울 줄 알았는데, 읽어보니 x, y 최소 값과 최대 값을 구하면 되는 거였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;값을 구하기 위해 Integer 클래스의 min(), max() 함수를 활용해보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1743571573897&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public int[] solution(String[] wallpaper) {
        int[] answer = { Integer.MAX_VALUE, Integer.MAX_VALUE, 
                        Integer.MIN_VALUE, Integer.MIN_VALUE };

        for (int i = 0; i &amp;lt; wallpaper.length; i++) {
            char[] paper = wallpaper[i].toCharArray();
            for (int j = 0; j &amp;lt; paper.length; j++) {
                char c = paper[j];
                if (c == '#') {
                    answer[0] = Integer.min(answer[0], i);
                    answer[1] = Integer.min(answer[1], j);
                    answer[2] = Integer.max(answer[2], i + 1);
                    answer[3] = Integer.max(answer[3], j + 1);
                }
            }
        }
        return answer;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;int[] answer 배열 초기화&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;최소와 최대 값을 저장하기 위해 배열의 값을 초기화 해주었다. 배열의 0, 1 번째는 최소 값이 들어가야 하기에 Integer.MAX_VALUE를 사용하였고 2, 3 번째 배열은 최대 값을 저장하기 위해 MIN_VALUE 를 사용하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;반복문&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이중 for문으로 배열의 모든 값을 반복하게 하였다. 만약 현재의 값이 '#'라면, 배열의 값을 갱신하도록 했다. 위의 배열과 동일하게 최소값이 저장되어야 할 answer[0]과 answer[1]의 Integer.min() 함수를 사용했고 나머지는 Integer.max() 함수를 사용했다. 최대 값의 경우 배열이 0부터 시작하기 때문에 +1를 해주었다.&lt;/p&gt;</description>
      <category>알고리즘/99클럽 코테스터디 6기</category>
      <category>99클럽</category>
      <category>99클럽코테스터디6기</category>
      <category>til</category>
      <category>코테스터디 3일차</category>
      <category>프로그래머스 바탕화면정리</category>
      <category>프로그래머스 자바</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/353</guid>
      <comments>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EA%B8%B0-3%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC#entry353comment</comments>
      <pubDate>Wed, 2 Apr 2025 14:33:23 +0900</pubDate>
    </item>
    <item>
      <title>99클럽 코테 스터디 6기 2일차 TIL (미들러)</title>
      <link>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EA%B8%B0-2%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제: 14495번 피보나치 비스무리한 수열&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1435&quot; data-origin-height=&quot;703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XZuHb/btsM4kjzNOF/wWaxeKTsELKhsIahMCJrOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XZuHb/btsM4kjzNOF/wWaxeKTsELKhsIahMCJrOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XZuHb/btsM4kjzNOF/wWaxeKTsELKhsIahMCJrOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXZuHb%2FbtsM4kjzNOF%2FwWaxeKTsELKhsIahMCJrOk%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;1435&quot; height=&quot;703&quot; data-origin-width=&quot;1435&quot; data-origin-height=&quot;703&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;피보나치 수열 계산을 위해 배열을 만든 뒤 반복문으로 값을 저장했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;n차 시도(실패)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743494300286&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        if (n &amp;lt;= 3)
            System.out.println(1);
        else
            System.out.println(fibo(n));
    }
    private static int fibo(int n) {
        int[] arr = new int[n + 1];
        arr[1] = arr[2] = arr[3] = 1;

        for (int i = 4; i &amp;lt; arr.length; i++) {
            arr[i] = arr[i - 1] + arr[i - 3];
        }
        return arr[n];
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;너무 쉬운 문제이기에 바로 통과할 줄 알았다. 근데 아무리 고치고 고쳐도 계속 틀렸다는 메세지만 받았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;n차 시도 끝에 성공&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1743494396884&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) throws NumberFormatException, IOException {
       BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        long[] dp = new long[117];
        dp[1] = dp[2] = dp[3] = 1;
        for (int i = 4; i &amp;lt;= n; i++) {
            dp[i] = dp[i - 1] + dp[i - 3];
        }
        System.out.print(dp[n]);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;알고보니 값이 너무 커져서 int 범위를 초과했던 것.. 간단한 문제였는데 쓸데없이 시간을 많이 잡아먹었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;다음부터는 데이터 범위를 고려하며 문제를 풀어야겠다.&lt;/p&gt;</description>
      <category>알고리즘/99클럽 코테스터디 6기</category>
      <category>99클럽</category>
      <category>99클럽코테스터디6기</category>
      <category>til</category>
      <category>백준 14495번</category>
      <category>백준 피보나치 비스무리한 수열</category>
      <category>코테스터디 2일차</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/352</guid>
      <comments>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EA%B8%B0-2%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC#entry352comment</comments>
      <pubDate>Tue, 1 Apr 2025 17:03:38 +0900</pubDate>
    </item>
    <item>
      <title>99클럽 코테 스터디 22일차 TIL (미들러)</title>
      <link>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-22%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제: 11053번 가장 긴 증가하는 부분 수열&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;584&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFtTZm/btsMmc8uJXF/vUzFlleBKM4jICKKywgQ50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFtTZm/btsMmc8uJXF/vUzFlleBKM4jICKKywgQ50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFtTZm/btsMmc8uJXF/vUzFlleBKM4jICKKywgQ50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFtTZm%2FbtsMmc8uJXF%2FvUzFlleBKM4jICKKywgQ50%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;1160&quot; height=&quot;584&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;584&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;입력 수가 크지 않기 때문에 충분히 어렵지 않을 꺼라고 생각했다. 하지만 첫 시도부터 실패를 맛보고 말았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;1차 시도(실패)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739883986566&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());
        int[] arr = new int[n];
        int[] dp = new int[n];
        dp[0] = 1;

        StringTokenizer st = new StringTokenizer(br.readLine(), &quot; &quot;);

        for (int i = 0; i &amp;lt; n; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }

        int max = arr[0];

        for (int i = 1; i &amp;lt; n; i++) {
            if (max &amp;lt; arr[i]) {
                dp[i] = dp[i - 1] + 1;
                max = arr[i];
            } else {
                dp[i] = dp[i - 1];
            }
        }

        System.out.println(dp[n - 1]);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;실패한 이유&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;LIS의 경우 증가하는 부분 수열을 구해야 하는데, 단순히 이전 값만 비교하는 식으로 문제로 풀었다. 이 방식의 경우 부분을 찾지 않기 때문에 해당 문제에 올바르지 않은 코드였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;두번째 시도(성공)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739884201726&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());
        int[] arr = new int[n];

        int[] dp = new int[n];
        Arrays.fill(dp, 1);

        StringTokenizer st = new StringTokenizer(br.readLine(), &quot; &quot;);

        for (int i = 0; i &amp;lt; n; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }

        for (int i = 1; i &amp;lt; n; i++) {
            for (int j = 0; j &amp;lt; i; j++) {
                if (arr[i] &amp;gt; arr[j]) {
                    dp[i] = Math.max(dp[i], dp[j] + 1);
                }
            }
        }

        int max = 0;
        for (int i : dp) {
            max = Math.max(max, i);
        }

        System.out.println(max);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;모든 수의 값을 1로 업데이트 해주고, i번째 원소에 대해 이번 원소들을 모두 비교하여 큰 값으로 업데이트 하도록 코드를 변경했다. 그리고 가장 큰 부분 수열의 길이를 출력하도록 하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;코테스터디 TIL&lt;/b&gt;&lt;/h4&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;size14&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-21%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.02.18 - [알고리즘/99클럽 코테스터디 5기] - 99클럽 코테 스터디 21일차 TIL (미들러)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1739884279838&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;99클럽 코테 스터디 21일차 TIL (미들러)&quot; data-og-description=&quot;문제: 1003번 피보나치 함수예제// Input3013// Output1 00 11 2&amp;nbsp;&amp;nbsp;풀이방법피보나치 수열을 이용하여 재귀를 풀 경우, 동일한 식을 반복해버리기에 시간을 초과해버린다. 메모이제이션 기법을 활용하면 &quot; data-og-host=&quot;become-programmer.tistory.com&quot; data-og-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-21%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-21%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dquJ7c/hyYjpMEWIS/0BKFppQnFFlxpPJSKW9deK/img.png?width=800&amp;amp;height=449&amp;amp;face=0_0_800_449,https://scrap.kakaocdn.net/dn/lJFbH/hyYfBurekn/cWkEWkIILjrmlzEd4ONWIk/img.png?width=800&amp;amp;height=449&amp;amp;face=0_0_800_449,https://scrap.kakaocdn.net/dn/9xu6f/hyYfGoXiqj/PZRCtK2iv8sYwNKqPz9OG0/img.png?width=2334&amp;amp;height=1310&amp;amp;face=0_0_2334_1310&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-21%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-21%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dquJ7c/hyYjpMEWIS/0BKFppQnFFlxpPJSKW9deK/img.png?width=800&amp;amp;height=449&amp;amp;face=0_0_800_449,https://scrap.kakaocdn.net/dn/lJFbH/hyYfBurekn/cWkEWkIILjrmlzEd4ONWIk/img.png?width=800&amp;amp;height=449&amp;amp;face=0_0_800_449,https://scrap.kakaocdn.net/dn/9xu6f/hyYfGoXiqj/PZRCtK2iv8sYwNKqPz9OG0/img.png?width=2334&amp;amp;height=1310&amp;amp;face=0_0_2334_1310');&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;99클럽 코테 스터디 21일차 TIL (미들러)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제: 1003번 피보나치 함수예제// Input3013// Output1 00 11 2&amp;nbsp;&amp;nbsp;풀이방법피보나치 수열을 이용하여 재귀를 풀 경우, 동일한 식을 반복해버리기에 시간을 초과해버린다. 메모이제이션 기법을 활용하면&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;become-programmer.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-20%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.02.15 - [알고리즘/99클럽 코테스터디 5기] - 99클럽 코테 스터디 20일차 TIL (미들러)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1739884285148&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;99클럽 코테 스터디 20일차 TIL (미들러)&quot; data-og-description=&quot;문제: 19598번 최소 회의실 개수예제// Input30 4015 305 10// Output2&amp;nbsp;&amp;nbsp;풀이방법회의실 배정과 관련된 문제는 풀어보았지만, 최소 회의실 개수를 구하는 것은 쉽지 않은 것 같다.&amp;nbsp;&amp;nbsp;시도1(실패)public class M&quot; data-og-host=&quot;become-programmer.tistory.com&quot; data-og-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-20%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-20%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/rbNbU/hyYf1GE50D/zxB3lYEDBynhJ9oMjgALJ0/img.png?width=800&amp;amp;height=402&amp;amp;face=0_0_800_402,https://scrap.kakaocdn.net/dn/dXNZsw/hyYfPzs7iH/K1QDdc9KSalE8qp48SvOu1/img.png?width=800&amp;amp;height=402&amp;amp;face=0_0_800_402,https://scrap.kakaocdn.net/dn/7k5ca/hyYjl4yIL0/dKN2g4qOxbjOpgS4KHNlq1/img.png?width=1471&amp;amp;height=741&amp;amp;face=0_0_1471_741&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-20%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-20%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/rbNbU/hyYf1GE50D/zxB3lYEDBynhJ9oMjgALJ0/img.png?width=800&amp;amp;height=402&amp;amp;face=0_0_800_402,https://scrap.kakaocdn.net/dn/dXNZsw/hyYfPzs7iH/K1QDdc9KSalE8qp48SvOu1/img.png?width=800&amp;amp;height=402&amp;amp;face=0_0_800_402,https://scrap.kakaocdn.net/dn/7k5ca/hyYjl4yIL0/dKN2g4qOxbjOpgS4KHNlq1/img.png?width=1471&amp;amp;height=741&amp;amp;face=0_0_1471_741');&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;99클럽 코테 스터디 20일차 TIL (미들러)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제: 19598번 최소 회의실 개수예제// Input30 4015 305 10// Output2&amp;nbsp;&amp;nbsp;풀이방법회의실 배정과 관련된 문제는 풀어보았지만, 최소 회의실 개수를 구하는 것은 쉽지 않은 것 같다.&amp;nbsp;&amp;nbsp;시도1(실패)public class M&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;become-programmer.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>알고리즘/99클럽 코테스터디 5기</category>
      <category>99클럽</category>
      <category>99클럽코테스터디</category>
      <category>til</category>
      <category>백준 11053번</category>
      <category>백준 가장 긴 증가하는 부분 수열</category>
      <category>코테스터디 22일차</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/351</guid>
      <comments>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-22%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC#entry351comment</comments>
      <pubDate>Tue, 18 Feb 2025 22:12:59 +0900</pubDate>
    </item>
    <item>
      <title>99클럽 코테 스터디 21일차 TIL (미들러)</title>
      <link>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-21%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제: 1003번 피보나치 함수&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-02-18 오전 9.06.19.png&quot; data-origin-width=&quot;2334&quot; data-origin-height=&quot;1310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUBo4b/btsMm5zIVvp/dFOgQ1OhJ0MVOqM7Fb4OTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUBo4b/btsMm5zIVvp/dFOgQ1OhJ0MVOqM7Fb4OTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUBo4b/btsMm5zIVvp/dFOgQ1OhJ0MVOqM7Fb4OTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUBo4b%2FbtsMm5zIVvp%2FdFOgQ1OhJ0MVOqM7Fb4OTK%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;2334&quot; height=&quot;1310&quot; data-filename=&quot;스크린샷 2025-02-18 오전 9.06.19.png&quot; data-origin-width=&quot;2334&quot; data-origin-height=&quot;1310&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739837210976&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Input
3
0
1
3
// Output
1 0
0 1
1 2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;피보나치 수열을 이용하여 재귀를 풀 경우, 동일한 식을 반복해버리기에 시간을 초과해버린다. 메모이제이션 기법을 활용하면 반복적인 계산을 하지 않고 해당 값을 저장해놓기 때문에 훨씬 효율적이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1739837367745&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int t = Integer.parseInt(br.readLine());
        int[][] dp = new int[41][2];

        dp[0][0] = 1;
        dp[0][1] = 0;
        dp[1][0] = 0;
        dp[1][1] = 1;

        for (int i = 2; i &amp;lt; 41; i++) {
            dp[i][0] = dp[i - 1][0] + dp[i - 2][0];
            dp[i][1] = dp[i - 1][1] + dp[i - 2][1];
        }

        StringBuilder sb = new StringBuilder();
        while (t-- &amp;gt; 0) {
            int n = Integer.parseInt(br.readLine());
            sb.append(dp[n][0]).append(&quot; &quot;).append(dp[n][1]).append(&quot;\n&quot;);

        }
        System.out.println(sb);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;dp라는 이름을 배열을 생성하고, [n][0]에는 0의 호출 횟수, [n][1]에는 1의 호출 횟수를 자연수 40까지 값을 저장해놓는다. 그리고 반복문을 이용하여 해당 숫자의 0, 1의 호출 횟수를 출력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;코테스터디 TIL&lt;/b&gt;&lt;/h4&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;size14&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-20%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.02.15 - [알고리즘/99클럽 코테스터디 5기] - 99클럽 코테 스터디 20일차 TIL (미들러)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1739837504350&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;99클럽 코테 스터디 20일차 TIL (미들러)&quot; data-og-description=&quot;문제: 19598번 최소 회의실 개수예제// Input30 4015 305 10// Output2&amp;nbsp;&amp;nbsp;풀이방법회의실 배정과 관련된 문제는 풀어보았지만, 최소 회의실 개수를 구하는 것은 쉽지 않은 것 같다.&amp;nbsp;&amp;nbsp;시도1(실패)public class M&quot; data-og-host=&quot;become-programmer.tistory.com&quot; data-og-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-20%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-20%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/23rkV/hyYfJskCwZ/cHNd6QhaOF0e1xG2cURU90/img.png?width=800&amp;amp;height=402&amp;amp;face=0_0_800_402,https://scrap.kakaocdn.net/dn/8DP9n/hyYfLjnwnE/wORKz9eFcK1Hd3AyTDBta0/img.png?width=800&amp;amp;height=402&amp;amp;face=0_0_800_402,https://scrap.kakaocdn.net/dn/btLfKU/hyYf3RUl2K/09CKPtt9iZBesvoajXKrk0/img.png?width=1471&amp;amp;height=741&amp;amp;face=0_0_1471_741&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-20%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-20%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/23rkV/hyYfJskCwZ/cHNd6QhaOF0e1xG2cURU90/img.png?width=800&amp;amp;height=402&amp;amp;face=0_0_800_402,https://scrap.kakaocdn.net/dn/8DP9n/hyYfLjnwnE/wORKz9eFcK1Hd3AyTDBta0/img.png?width=800&amp;amp;height=402&amp;amp;face=0_0_800_402,https://scrap.kakaocdn.net/dn/btLfKU/hyYf3RUl2K/09CKPtt9iZBesvoajXKrk0/img.png?width=1471&amp;amp;height=741&amp;amp;face=0_0_1471_741');&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;99클럽 코테 스터디 20일차 TIL (미들러)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제: 19598번 최소 회의실 개수예제// Input30 4015 305 10// Output2&amp;nbsp;&amp;nbsp;풀이방법회의실 배정과 관련된 문제는 풀어보았지만, 최소 회의실 개수를 구하는 것은 쉽지 않은 것 같다.&amp;nbsp;&amp;nbsp;시도1(실패)public class M&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;become-programmer.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-18%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.02.13 - [알고리즘/99클럽 코테스터디 5기] - 99클럽 코테 스터디 18일차 TIL (미들러)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1739837509690&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;99클럽 코테 스터디 18일차 TIL (미들러)&quot; data-og-description=&quot;문제: 17503번 맥주 축제import java.util.*;import java.io.*;public class Main {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static class Beer {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int favor, level;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public Beer(int favor, int level) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.favor = favor;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot; data-og-host=&quot;become-programmer.tistory.com&quot; data-og-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-18%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-18%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/joAdO/hyYf5IWJu4/oPSL9RPpccSyxUL53IPZP1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/2nNWN/hyYf3YF5QD/I8InxRmFQNaKTXaWuDL6ck/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-18%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-18%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/joAdO/hyYf5IWJu4/oPSL9RPpccSyxUL53IPZP1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/2nNWN/hyYf3YF5QD/I8InxRmFQNaKTXaWuDL6ck/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;99클럽 코테 스터디 18일차 TIL (미들러)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제: 17503번 맥주 축제import java.util.*;import java.io.*;public class Main {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static class Beer {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int favor, level;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public Beer(int favor, int level) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.favor = favor;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;become-programmer.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>알고리즘/99클럽 코테스터디 5기</category>
      <category>99클럽</category>
      <category>99클럽코테스터디</category>
      <category>til</category>
      <category>백준 1003번</category>
      <category>백준 피보나치 함수</category>
      <category>코테스터디 21일차</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/350</guid>
      <comments>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-21%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC#entry350comment</comments>
      <pubDate>Tue, 18 Feb 2025 09:13:00 +0900</pubDate>
    </item>
    <item>
      <title>99클럽 코테 스터디 20일차 TIL (미들러)</title>
      <link>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-20%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제: 19598번 최소 회의실 개수&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1471&quot; data-origin-height=&quot;741&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgUyTd/btsMk1xidsb/N5yoOSVykBlYyCTkrbY9sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgUyTd/btsMk1xidsb/N5yoOSVykBlYyCTkrbY9sk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgUyTd/btsMk1xidsb/N5yoOSVykBlYyCTkrbY9sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdgUyTd%2FbtsMk1xidsb%2FN5yoOSVykBlYyCTkrbY9sk%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;1471&quot; height=&quot;741&quot; data-origin-width=&quot;1471&quot; data-origin-height=&quot;741&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739548224535&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Input
3
0 40
15 30
5 10

// Output
2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;회의실 배정과 관련된 문제는 풀어보았지만, 최소 회의실 개수를 구하는 것은 쉽지 않은 것 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;시도1(실패)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739548569391&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());

        int[][] meetings = new int[n][2];

        for (int i = 0; i &amp;lt; n; i++) {
            String[] str = br.readLine().split(&quot; &quot;);
            meetings[i][0] = Integer.parseInt(str[0]);
            meetings[i][1] = Integer.parseInt(str[1]);
        }

        Arrays.sort(meetings, Comparator.comparingInt(o -&amp;gt; o[0]));

        int cnt = 1;
        int endTime = 0;
        int idx = 0;

        while (idx &amp;lt; n) {
            for (int i = idx + 1; i &amp;lt; n; i++) {
                if (endTime &amp;lt;= meetings[i][0]) {
                    endTime = meetings[i][1];
                } else {
                    cnt++;
                    break;
                }
            }
            idx++;
        }
        System.out.println(cnt);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;그리디 알고리즘을 활용하여 빨리 시작하는 회의 순으로 정렬한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이전 회의 종료시간과 현재 회의 시작시간을 비교하고 종료시간이 더 클 경우 회의실의 개수를 늘린다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;문제점&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;시작시간으로 정렬하고 비교하게 되면, 다음 회의를 제외하곤 비교가 불가능하다. 따라서 회의실의 개수가 잘못 계산된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;시도2&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739706497573&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());

        int[][] meetings = new int[n][2];

        for (int i = 0; i &amp;lt; n; i++) {
            String[] str = br.readLine().split(&quot; &quot;);
            meetings[i][0] = Integer.parseInt(str[0]);
            meetings[i][1] = Integer.parseInt(str[1]);
        }

        Arrays.sort(meetings, Comparator.comparingInt(a -&amp;gt; a[0]));

        PriorityQueue&amp;lt;Integer&amp;gt; pq = new PriorityQueue&amp;lt;&amp;gt;();
        int cnt = 0;

        for (int[] meeting : meetings) {
            int start = meeting[0];
            int end = meeting[1];

            while (!pq.isEmpty() &amp;amp;&amp;amp; pq.peek() &amp;lt;= start) {
                pq.poll();
            }

            pq.offer(end);

            cnt = Math.max(cnt, pq.size());
        }
        System.out.println(cnt);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;배열로 값을 입력 받고, 시작시간이 빠른 순으로 정렬한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;우선순위 큐도 선언하는데, 이 큐에는 회의의 종료시간만 저장된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;반복문을 이용하여 입력될 회의의 시작시간이 종료시간과 같거나 클 경우, 큐에 저장된 값을 제거한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;만약 조건에 부합하지 못하면 큐에 값을 삽입한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;그리고 회의실의 개수를 최대 갯수로 업데이트한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;코테스터디 TIL&lt;/b&gt;&lt;/h4&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;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/JAVA-%EB%B0%B1%EC%A4%80-1946%EB%B2%88-%EC%8B%A0%EC%9E%85%EC%82%AC%EC%9B%90&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2023.06.26 - [알고리즘/백준] - JAVA [백준] 1946번: 신입사원&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1739706764035&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;JAVA [백준] 1946번: 신입사원&quot; data-og-description=&quot;자바 1946번 문제 언제나 최고만을 지향하는 굴지의 대기업 진영 주식회사가 신규 사원 채용을 실시한다. 인재 선발 시험은 1차 서류심사와 2차 면접시험으로 이루어진다. 최고만을 지향한다는 &quot; data-og-host=&quot;become-programmer.tistory.com&quot; data-og-source-url=&quot;https://become-programmer.tistory.com/entry/JAVA-%EB%B0%B1%EC%A4%80-1946%EB%B2%88-%EC%8B%A0%EC%9E%85%EC%82%AC%EC%9B%90&quot; data-og-url=&quot;https://become-programmer.tistory.com/entry/JAVA-%EB%B0%B1%EC%A4%80-1946%EB%B2%88-%EC%8B%A0%EC%9E%85%EC%82%AC%EC%9B%90&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/fIMF7/hyYcTbpx1m/tr0F9ax7LHFZoLVQBd91k0/img.png?width=800&amp;amp;height=344&amp;amp;face=0_0_800_344,https://scrap.kakaocdn.net/dn/cGfLct/hyYfLDeTGL/RxunH4RVM8DxekABGBxhh0/img.png?width=800&amp;amp;height=344&amp;amp;face=0_0_800_344,https://scrap.kakaocdn.net/dn/TyRQs/hyYfV0dqdc/dkkqG8oCAkvhysEprudZj1/img.png?width=1160&amp;amp;height=500&amp;amp;face=0_0_1160_500&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/JAVA-%EB%B0%B1%EC%A4%80-1946%EB%B2%88-%EC%8B%A0%EC%9E%85%EC%82%AC%EC%9B%90&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://become-programmer.tistory.com/entry/JAVA-%EB%B0%B1%EC%A4%80-1946%EB%B2%88-%EC%8B%A0%EC%9E%85%EC%82%AC%EC%9B%90&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/fIMF7/hyYcTbpx1m/tr0F9ax7LHFZoLVQBd91k0/img.png?width=800&amp;amp;height=344&amp;amp;face=0_0_800_344,https://scrap.kakaocdn.net/dn/cGfLct/hyYfLDeTGL/RxunH4RVM8DxekABGBxhh0/img.png?width=800&amp;amp;height=344&amp;amp;face=0_0_800_344,https://scrap.kakaocdn.net/dn/TyRQs/hyYfV0dqdc/dkkqG8oCAkvhysEprudZj1/img.png?width=1160&amp;amp;height=500&amp;amp;face=0_0_1160_500');&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;JAVA [백준] 1946번: 신입사원&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;자바 1946번 문제 언제나 최고만을 지향하는 굴지의 대기업 진영 주식회사가 신규 사원 채용을 실시한다. 인재 선발 시험은 1차 서류심사와 2차 면접시험으로 이루어진다. 최고만을 지향한다는&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;become-programmer.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-18%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.02.13 - [알고리즘/99클럽 코테스터디 5기] - 99클럽 코테 스터디 18일차 TIL (미들러)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1739706748070&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;99클럽 코테 스터디 18일차 TIL (미들러)&quot; data-og-description=&quot;문제: 17503번 맥주 축제import java.util.*;import java.io.*;public class Main {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static class Beer {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int favor, level;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public Beer(int favor, int level) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.favor = favor;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&quot; data-og-host=&quot;become-programmer.tistory.com&quot; data-og-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-18%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-18%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/x14vu/hyYf52OSkP/8PZgTihIH7mtGQK2aB9KYk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/qIpLZ/hyYf52OSln/lqo3n16GF2mPZ0DcfFfZA1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-18%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-18%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/x14vu/hyYf52OSkP/8PZgTihIH7mtGQK2aB9KYk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/qIpLZ/hyYf52OSln/lqo3n16GF2mPZ0DcfFfZA1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;99클럽 코테 스터디 18일차 TIL (미들러)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제: 17503번 맥주 축제import java.util.*;import java.io.*;public class Main {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static class Beer {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int favor, level;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public Beer(int favor, int level) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.favor = favor;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;become-programmer.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/99클럽 코테스터디 5기</category>
      <category>99클럽</category>
      <category>99클럽코테스터디</category>
      <category>til</category>
      <category>백준 19598번</category>
      <category>백준 최소 회의실 개수</category>
      <category>코테스터디 20일차</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/349</guid>
      <comments>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-20%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC#entry349comment</comments>
      <pubDate>Sat, 15 Feb 2025 00:59:42 +0900</pubDate>
    </item>
    <item>
      <title>99클럽 코테 스터디 18일차 TIL (미들러)</title>
      <link>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-18%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;문제: 17503번 맥주 축제&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;import java.util.*;
import java.io.*;

public class Main {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static class Beer {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int favor, level;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public Beer(int favor, int level) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.favor = favor;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.level = level;
&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;public static void main(String[] args) throws IOException {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StringTokenizer st = new StringTokenizer(br.readLine());

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int N = Integer.parseInt(st.nextToken()); // 마셔야 하는 맥주 개수
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int M = Integer.parseInt(st.nextToken()); // 선호도의 합
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int K = Integer.parseInt(st.nextToken()); // 맥주의 종류 수

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Beer[] beers = new Beer[K];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (int i = 0; i &amp;lt; K; i++) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;st = new StringTokenizer(br.readLine());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int favor = Integer.parseInt(st.nextToken());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int level = Integer.parseInt(st.nextToken());
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;beers[i] = new Beer(favor, level);
&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;// 1. 도수 레벨이 낮은 순서로 정렬
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Arrays.sort(beers, (a, b) -&amp;gt; a.level - b.level);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// 2. 최소 힙(우선순위 큐)을 사용하여 N개 선택
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PriorityQueue&amp;lt;Integer&amp;gt; pq = new PriorityQueue&amp;lt;&amp;gt;();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int sumFavor = 0; // 현재 선택한 맥주의 선호도 합
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int minLevel = -1; // 조건을 만족하는 최소 도수 레벨

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (Beer beer : beers) {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pq.offer(beer.favor);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sumFavor += beer.favor;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (pq.size() &amp;gt; N) { // N개 초과하면 가장 작은 선호도 제거
&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;sumFavor -= pq.poll();
&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;// 3. N개의 맥주를 선택했고, 선호도 합이 M 이상이면 최소 도수 업데이트
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (pq.size() == N &amp;amp;&amp;amp; sumFavor &amp;gt;= M) {
&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;minLevel = beer.level;
&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;break;
&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;// 4. 조건 만족 여부에 따라 출력
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(minLevel);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/99클럽 코테스터디 5기</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/348</guid>
      <comments>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-18%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC#entry348comment</comments>
      <pubDate>Thu, 13 Feb 2025 10:50:10 +0900</pubDate>
    </item>
    <item>
      <title>99클럽 코테 스터디 17일차 TIL (미들러)</title>
      <link>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-17%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제: 11399번 ATM&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-02-11 오후 11.36.38.png&quot; data-origin-width=&quot;2324&quot; data-origin-height=&quot;1222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d5kBpw/btsMfFOUYbM/CkBKX7AH6Xly7MGpbNEFiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d5kBpw/btsMfFOUYbM/CkBKX7AH6Xly7MGpbNEFiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d5kBpw/btsMfFOUYbM/CkBKX7AH6Xly7MGpbNEFiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd5kBpw%2FbtsMfFOUYbM%2FCkBKX7AH6Xly7MGpbNEFiK%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;2324&quot; height=&quot;1222&quot; data-filename=&quot;스크린샷 2025-02-11 오후 11.36.38.png&quot; data-origin-width=&quot;2324&quot; data-origin-height=&quot;1222&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739288244424&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Input
5
3 1 4 3 2

// Output
32&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이 문제는 돈을 인출하는 데 걸리는 최소 시간을 출력해야 하는 문제다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이 문제를 보자마자 최적의 값을 만들기 위해 그리디 알고리즘을 사용해야겠구나 생각이 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1739288406777&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());

        int[] nums = new int[n];
        StringTokenizer st = new StringTokenizer(br.readLine(), &quot; &quot;);
        for (int i = 0; i &amp;lt; n; i++) {
            nums[i] = Integer.parseInt(st.nextToken());
        }

        if (n == 1) {
            System.out.println(nums[0]);
            return;
        } else {
            Arrays.sort(nums);
            long result = nums[0];

            for (int i = 1; i &amp;lt; n; i++) {
                nums[i] += nums[i - 1];
                result += nums[i];
            }
            System.out.println(result);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;입력값 변수에 저장하기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;주어진 사람의 수와 각 사람이 돈을 인출하는 데 걸리는 시간을 n과 nums에 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;조건문&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;사람의 수는 한 명이 될 수도 있기에 이와 같은 경우는 바로 출력하도록 하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;2명 이상인 경우에는 정렬을 하여 최소 시간이 우선이 되도록 하였다. 반복문을 활용하여 현재 배열의 값에 이전 값을 더하여 저장하였고, 그 값을 출력 값에 더하여 마지막에 해당 값을 리턴하도록 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;코테스터디 TIL&lt;/b&gt;&lt;/h4&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;size14&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-16%EC%9D%BC%EC%B0%A8-%EB%B3%B4%EB%84%88%EC%8A%A4-%EB%AC%B8%EC%A0%9C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.02.11 - [알고리즘/99클럽 코테스터디 5기] - 99클럽 코테 스터디 16일차 보너스 문제&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1739288606764&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;99클럽 코테 스터디 16일차 보너스 문제&quot; data-og-description=&quot;문제: 프로그래머스 소수찾기문제 설명한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.각 종이 조각에 적힌 숫자가 적&quot; data-og-host=&quot;become-programmer.tistory.com&quot; data-og-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-16%EC%9D%BC%EC%B0%A8-%EB%B3%B4%EB%84%88%EC%8A%A4-%EB%AC%B8%EC%A0%9C&quot; data-og-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-16%EC%9D%BC%EC%B0%A8-%EB%B3%B4%EB%84%88%EC%8A%A4-%EB%AC%B8%EC%A0%9C&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bAM89u/hyYf423NFs/JkdnYCWRlGFRAfQH3jrHr0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/ceCLfl/hyYf4Wi5C8/F0uRFtQhouQLhukMdoojT1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-16%EC%9D%BC%EC%B0%A8-%EB%B3%B4%EB%84%88%EC%8A%A4-%EB%AC%B8%EC%A0%9C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-16%EC%9D%BC%EC%B0%A8-%EB%B3%B4%EB%84%88%EC%8A%A4-%EB%AC%B8%EC%A0%9C&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bAM89u/hyYf423NFs/JkdnYCWRlGFRAfQH3jrHr0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/ceCLfl/hyYf4Wi5C8/F0uRFtQhouQLhukMdoojT1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;99클럽 코테 스터디 16일차 보너스 문제&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제: 프로그래머스 소수찾기문제 설명한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.각 종이 조각에 적힌 숫자가 적&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;become-programmer.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-16%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.02.10 - [알고리즘/99클럽 코테스터디 5기] - 99클럽 코테 스터디 16일차 TIL (미들러)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1739288617208&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;99클럽 코테 스터디 16일차 TIL (미들러)&quot; data-og-description=&quot;문제: 27961번 고양이는 많을수록 좋다예제// Input16// Output14// Input22147483648// Output232&amp;nbsp;&amp;nbsp;풀이 방법이 문제는 주어진 N수에 만족하도록 고양이를 만들어야 하는 문제이다. 고양이를 생성하는 방법은 &quot; data-og-host=&quot;become-programmer.tistory.com&quot; data-og-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-16%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-16%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cLSs7J/hyYb5CAbRr/Kkg0ufELCHkKK6nbZEzrp0/img.png?width=800&amp;amp;height=374&amp;amp;face=0_0_800_374,https://scrap.kakaocdn.net/dn/lDgIr/hyYfZOeb5L/KDlPV7eHXK3fE7IWb0ylfK/img.png?width=800&amp;amp;height=374&amp;amp;face=0_0_800_374&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-16%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-16%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cLSs7J/hyYb5CAbRr/Kkg0ufELCHkKK6nbZEzrp0/img.png?width=800&amp;amp;height=374&amp;amp;face=0_0_800_374,https://scrap.kakaocdn.net/dn/lDgIr/hyYfZOeb5L/KDlPV7eHXK3fE7IWb0ylfK/img.png?width=800&amp;amp;height=374&amp;amp;face=0_0_800_374');&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;99클럽 코테 스터디 16일차 TIL (미들러)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제: 27961번 고양이는 많을수록 좋다예제// Input16// Output14// Input22147483648// Output232&amp;nbsp;&amp;nbsp;풀이 방법이 문제는 주어진 N수에 만족하도록 고양이를 만들어야 하는 문제이다. 고양이를 생성하는 방법은&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;become-programmer.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/99클럽 코테스터디 5기</category>
      <category>99클럽</category>
      <category>99클럽코테스터디</category>
      <category>til</category>
      <category>백준 11399번</category>
      <category>백준 ATM</category>
      <category>코테스터디 17일차</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/347</guid>
      <comments>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-17%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC#entry347comment</comments>
      <pubDate>Wed, 12 Feb 2025 00:45:09 +0900</pubDate>
    </item>
    <item>
      <title>99클럽 코테 스터디 16일차 보너스 문제</title>
      <link>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-16%EC%9D%BC%EC%B0%A8-%EB%B3%B4%EB%84%88%EC%8A%A4-%EB%AC%B8%EC%A0%9C</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제: 프로그래머스 소수찾기&lt;/b&gt;&lt;/h4&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;size14&quot;&gt;&lt;b&gt;문제 설명&lt;/b&gt;&lt;br /&gt;한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;제한사항&lt;/b&gt;&lt;br /&gt;numbers는 길이 1 이상 7 이하인 문자열입니다.&lt;br /&gt;numbers는 0~9까지 숫자만으로 이루어져 있습니다.&lt;br /&gt;&quot;013&quot;은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;입출력&lt;/b&gt;&lt;br /&gt;예제 #1&lt;br /&gt;numbers &quot;17&quot;&lt;br /&gt;#1[1, 7]으로는 소수 [7, 17, 71]를 만들 수 있습니다.&lt;br /&gt;&lt;br /&gt;예제 #2&lt;br /&gt;numbers &quot;011&quot;&lt;br /&gt;[0, 1, 1]으로는 소수 [11, 101]를 만들 수 있습니다.11과 011은 같은 숫자로 취급합니다.&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;size14&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;소수 찾기는 프로그래밍에서 꽤나 흔한 문제이다. 그러나 이 문제는 입력 값의 순열하여 소수를 찾아내야 하기에 일반적인 소수 찾기 예제보다 풀이가 까다롭다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;1. HashSet&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739234766247&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;HashSet&amp;lt;Integer&amp;gt; numberSet = new HashSet&amp;lt;&amp;gt;();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;조합할 수 있는 모든 수를 저장하기 위해 HashSet을 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;2. boolean[]&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739234820468&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;boolean[] visited = new boolean[numbers.length()];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;숫자의 모든 조합을 탐색하기 위해 입력 값의 길이 만큼 boolean[] 배열을 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;3. generateNumbers&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739234892512&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void generateNumbers(String cur, String numbers, boolean[] visited){
    if(!cur.equals(&quot;&quot;)){
        set.add(Integer.parseInt(cur));
    }

    for(int i = 0; i &amp;lt; numbers.length(); i++){
        if(!visited[i]){
            visited[i] = true;
            generateNumbers(cur + numbers.charAt(i), numbers, visited);
            visited[i] = false;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;순열을 이용하여 숫자를 조합하고 해당 수를 set에 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;4. isPrime&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739234966932&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;boolean isPrime(int num) {
    if (num &amp;lt; 2) return false;
    for (int i = 2; i &amp;lt;= Math.sqrt(num); i++) {
        if (num % i == 0) return false;
    }
    return true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;num의 제곱까지만 검사하여 변수의 값이 소수인지 아닌지 판별한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;전체코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739235056380&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.HashSet;

class Solution {
    static HashSet&amp;lt;Integer&amp;gt; numberSet = new HashSet&amp;lt;&amp;gt;();
    
    public int solution(String numbers) {
        // 1. 순열을 이용해 가능한 모든 숫자 조합 만들기
        boolean[] visited = new boolean[numbers.length()];
        generateNumbers(&quot;&quot;, numbers, visited);
        
        // 2. 소수인지 확인하고 개수 세기
        int count = 0;
        for (int num : numberSet) {
            if (isPrime(num)) count++;
        }
        
        return count;
    }

    // 모든 숫자 조합
    static void generateNumbers(String current, String numbers, boolean[] visited) {
        if (!current.equals(&quot;&quot;)) {
            numberSet.add(Integer.parseInt(current));
        }

        for (int i = 0; i &amp;lt; numbers.length(); i++) {
            if (!visited[i]) {
                visited[i] = true;
                generateNumbers(current + numbers.charAt(i), numbers, visited);
                visited[i] = false;
            }
        }
    }

    // 소수인지 아닌지 
    static boolean isPrime(int num) {
        if (num &amp;lt; 2) return false;
        for (int i = 2; i &amp;lt;= Math.sqrt(num); i++) {
            if (num % i == 0) return false;
        }
        return true;
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>알고리즘/99클럽 코테스터디 5기</category>
      <category>99클럽</category>
      <category>99클럽코테스터디</category>
      <category>til</category>
      <category>소수찾기 알고리즘</category>
      <category>프로그래머스 소수찾기</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/346</guid>
      <comments>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-16%EC%9D%BC%EC%B0%A8-%EB%B3%B4%EB%84%88%EC%8A%A4-%EB%AC%B8%EC%A0%9C#entry346comment</comments>
      <pubDate>Tue, 11 Feb 2025 09:53:08 +0900</pubDate>
    </item>
    <item>
      <title>99클럽 코테 스터디 16일차 TIL (미들러)</title>
      <link>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-16%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제: 27961번 고양이는 많을수록 좋다&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-02-10 오전 11.34.45.png&quot; data-origin-width=&quot;2336&quot; data-origin-height=&quot;1094&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tVmLO/btsMciAak20/q89lxN5TntKTPb7ngnD140/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tVmLO/btsMciAak20/q89lxN5TntKTPb7ngnD140/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tVmLO/btsMciAak20/q89lxN5TntKTPb7ngnD140/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtVmLO%2FbtsMciAak20%2Fq89lxN5TntKTPb7ngnD140%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;2336&quot; height=&quot;1094&quot; data-filename=&quot;스크린샷 2025-02-10 오전 11.34.45.png&quot; data-origin-width=&quot;2336&quot; data-origin-height=&quot;1094&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739154943209&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Input1
6

// Output1
4

// Input2
2147483648

// Output2
32&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이 문제는 주어진 N수에 만족하도록 고양이를 만들어야 하는 문제이다. 고양이를 생성하는 방법은 두 가지인데, 아래와 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;1.&amp;nbsp; 생성마법: 고양이 1마리 생성가능&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;2. 복제마법: 고양이 1 ~ 존재하는 고양이 마리 수까지 생성가능&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;만약 N = 6이라고 한다면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;1번 생성마법: 현재 고양이가 존재하지 않기에 1마리 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;2번 생성 || 복제 마법: 어떤 마법을 쓰든 1마리 생성가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;3번 복제마법: 현재 2마리로 +2마리까지 생성가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;4번 복제마법: 4마리에서 2마리만 복제하면 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;총 4번의 마법을 써야 N과 동일한 고양이를 만들 수 있고 8마리까지 만들 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;위의 예시를 보게 되면 처음에 고양이 한 마리를 생성하는 것 이외에는 거듭제곱을 통해 고양이 수를 늘려주는 게 최소 숫자가 최대 고양이를 만들 수 있다. 즉, 최적의 선택을 하기 위해 그리디 알고리즘을 이용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;주의해야 할 점은 N은 10의 12제곱까지 가능하기에 변수 타입을 long으로 설정해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1739155289238&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        long n = Long.parseLong(br.readLine());

        long catCount = 1;
        long magic = 1;

        if (n == 0) {
            System.out.println(0);
            return;
        } else {
            while (true) {
                if (catCount &amp;gt;= n) {
                    System.out.println(magic);
                    return;
                }
                catCount *= 2;
                magic++;
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;N이 0일 경우 바로 0을 출력하도록 하고, 그 이외의 경우에는 고양이 수를 현재 고양이 수 * 2를 해주고, 마법 횟수를 증가해준다. 만약 고양이의 수가 n과 동일하거나 크다면, 마법 사용 횟수를 출력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;코테스터디 TIL&lt;/b&gt;&lt;/h4&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;size14&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-14%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.02.07 - [알고리즘/99클럽 코테스터디 5기] - 99클럽 코테 스터디 14일차 TIL (미들러)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1739155557205&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;99클럽 코테 스터디 14일차 TIL (미들러)&quot; data-og-description=&quot;문제: 2615번 오목예제// input0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 1 2 0 0 2 2 2 1 0 0 0 0 0 0 0 0 0 00 0 1 2 0 0 0 0 1 0 0 0 0 0 0 0 0 0 00 0 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 1 2 2 0 0 0 0 0 0 0 0 0 0 0&quot; data-og-host=&quot;become-programmer.tistory.com&quot; data-og-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-14%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-14%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b49vDp/hyYfSae0Bn/MJc0kQ90CepwR6ThHAZzU0/img.png?width=800&amp;amp;height=402&amp;amp;face=0_0_800_402,https://scrap.kakaocdn.net/dn/kJSRg/hyYb6uuB5s/NveUvuhvWhKBTnuzkV673k/img.png?width=800&amp;amp;height=402&amp;amp;face=0_0_800_402,https://scrap.kakaocdn.net/dn/bRpeYh/hyYciuTOoL/0JfSE0NBfKYV7alffs4VJk/img.png?width=1452&amp;amp;height=730&amp;amp;face=0_0_1452_730&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-14%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-14%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b49vDp/hyYfSae0Bn/MJc0kQ90CepwR6ThHAZzU0/img.png?width=800&amp;amp;height=402&amp;amp;face=0_0_800_402,https://scrap.kakaocdn.net/dn/kJSRg/hyYb6uuB5s/NveUvuhvWhKBTnuzkV673k/img.png?width=800&amp;amp;height=402&amp;amp;face=0_0_800_402,https://scrap.kakaocdn.net/dn/bRpeYh/hyYciuTOoL/0JfSE0NBfKYV7alffs4VJk/img.png?width=1452&amp;amp;height=730&amp;amp;face=0_0_1452_730');&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;99클럽 코테 스터디 14일차 TIL (미들러)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제: 2615번 오목예제// input0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 1 2 0 0 2 2 2 1 0 0 0 0 0 0 0 0 0 00 0 1 2 0 0 0 0 1 0 0 0 0 0 0 0 0 0 00 0 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 1 2 2 0 0 0 0 0 0 0 0 0 0 0&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;become-programmer.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/99클럽 코테스터디 5기</category>
      <category>99클럽</category>
      <category>99클럽코테스터디</category>
      <category>til</category>
      <category>백준 27961번</category>
      <category>백준 고양이는 많을수록 좋다</category>
      <category>코테스터디 16일차</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/345</guid>
      <comments>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-16%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC#entry345comment</comments>
      <pubDate>Mon, 10 Feb 2025 11:49:30 +0900</pubDate>
    </item>
    <item>
      <title>99클럽 코테 스터디 14일차 TIL (미들러)</title>
      <link>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-14%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제: 2615번 오목&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1452&quot; data-origin-height=&quot;730&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pfYJr/btsL8YbwlPf/F90Btnslklktf5Em4BEU3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pfYJr/btsL8YbwlPf/F90Btnslklktf5Em4BEU3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pfYJr/btsL8YbwlPf/F90Btnslklktf5Em4BEU3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpfYJr%2FbtsL8YbwlPf%2FF90Btnslklktf5Em4BEU3K%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;1452&quot; height=&quot;730&quot; data-origin-width=&quot;1452&quot; data-origin-height=&quot;730&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738891542967&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// input
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 2 0 0 2 2 2 1 0 0 0 0 0 0 0 0 0 0
0 0 1 2 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
0 0 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 2 2 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

// output
1
3 2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이 문제를 접하고 DFS 알고리즘을 이용해 재귀적으로 탐색하면 될 것이라 생각하고 풀었는데, 계속 실패했다. 그 이유는 같은 방향으로 5개가 연속되었는지 확인해야 하기에 DFS보다 완전탐색이 적합했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;1. 완전 탐색&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738891716739&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for (int i = 0; i &amp;lt; 19; i++) {
    for (int j = 0; j &amp;lt; 19; j++) {
        if (board[i][j] != 0) {
            if (isFive(i, j)) {
                System.out.println(board[i][j]);
                System.out.println((i + 1) + &quot; &quot; + (j + 1));
                return;
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;모든 위치를 다 탐색하는데, 바둑돌이 있을 경우에만 isFive()라는 메서드를 실행한다. 실행 결과가 true라면 즉시 값을 출력하고 종료한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;2. isFive() 메서드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738891803689&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;static boolean isFive(int x, int y) {
    int color = board[x][y];

    for (int i = 0; i &amp;lt; 4; i++) {
        int cnt = 1;
        int r = x + dr[i];
        int c = y + dc[i];

        while (isValid(r, c) &amp;amp;&amp;amp; board[r][c] == color) {
            cnt++;
            r += dr[i];
            c += dc[i];
        }

        r = x - dr[i];
        c = y - dc[i];

        while (isValid(r, c) &amp;amp;&amp;amp; board[r][c] == color) {
            cnt++;
            r -= dr[i];
            c -= dc[i];
        }

        if (cnt == 5) {
            if (!isValid(x - dr[i], y - dc[i]) || board[x - dr[i]][y - dc[i]] != color) {
                return true;
            }
        }
    }
    return false;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이 문제에서의 조건은 연속된 바둑돌이 6개가 되면 안된다. 따라서 한 방향으로 탐색한 이후 반대 방향도 탐색하여 바둑돌의 개수가 정확히 5개인지 확인해야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;만약 시작점에서 반대 방향의 값이 범위를 벗어났거나 같은 색상의 바둑돌이 아니라면 연속된 바둑돌의 개수가 5개라는 뜻이기에 true를 리턴한다. 그게 아니라면 false를 리턴한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;전체코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738891998619&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    static int[][] board = new int[19][19];
    static int[] dr = { 0, 1, 1, -1 };
    static int[] dc = { 1, 0, 1, 1 };

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        for (int i = 0; i &amp;lt; 19; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine(), &quot; &quot;);
            for (int j = 0; j &amp;lt; 19; j++) {
                board[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        for (int i = 0; i &amp;lt; 19; i++) {
            for (int j = 0; j &amp;lt; 19; j++) {
                if (board[i][j] != 0) {
                    if (isFive(i, j)) {
                        System.out.println(board[i][j]);
                        System.out.println((i + 1) + &quot; &quot; + (j + 1));
                        return;
                    }
                }
            }
        }
        System.out.println(0);
    }

    static boolean isFive(int x, int y) {
        int color = board[x][y];

        for (int i = 0; i &amp;lt; 4; i++) {
            int cnt = 1;
            int r = x + dr[i];
            int c = y + dc[i];

            while (isValid(r, c) &amp;amp;&amp;amp; board[r][c] == color) {
                cnt++;
                r += dr[i];
                c += dc[i];
            }

            r = x - dr[i];
            c = y - dc[i];

            while (isValid(r, c) &amp;amp;&amp;amp; board[r][c] == color) {
                cnt++;
                r -= dr[i];
                c -= dc[i];
            }

            if (cnt == 5) {
                if (!isValid(x - dr[i], y - dc[i]) || board[x - dr[i]][y - dc[i]] != color) {
                    return true;
                }
            }
        }
        return false;
    }

    static boolean isValid(int x, int y) {
        return x &amp;gt;= 0 &amp;amp;&amp;amp; x &amp;lt; 19 &amp;amp;&amp;amp; y &amp;gt;= 0 &amp;amp;&amp;amp; y &amp;lt; 19;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;코테스터디 TIL&lt;/b&gt;&lt;/h4&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;size14&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-13%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.02.06 - [알고리즘/99클럽 코테스터디 5기] - 99클럽 코테 스터디 13일차 TIL (미들러)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1738892021193&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;99클럽 코테 스터디 13일차 TIL (미들러)&quot; data-og-description=&quot;문제: 2529번 부등호 문제예제// input9&amp;gt; &amp;gt; &amp;gt; &amp;nbsp;&amp;nbsp;풀이방법이 문제에서는 주어진 부등호 조건을 만족하는 숫자 조합 중 최댓값과 최솟값을 구하는 것이다. 단, 0 ~ 9 사이의 숫자는 한번씩만 사용이 가&quot; data-og-host=&quot;become-programmer.tistory.com&quot; data-og-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-13%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-13%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bByTt7/hyYcjNkfmK/1ZVioPY98L1Kx02ijL3ye0/img.png?width=800&amp;amp;height=419&amp;amp;face=0_0_800_419,https://scrap.kakaocdn.net/dn/e2HfF/hyYclRTgoO/d93DDtnD1Nu7P0YS0OZiQK/img.png?width=800&amp;amp;height=419&amp;amp;face=0_0_800_419,https://scrap.kakaocdn.net/dn/cFyxeL/hyYb6NX6Gy/ufDt0u4Sa4nwcq33zK9cFk/img.png?width=1442&amp;amp;height=757&amp;amp;face=0_0_1442_757&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-13%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-13%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bByTt7/hyYcjNkfmK/1ZVioPY98L1Kx02ijL3ye0/img.png?width=800&amp;amp;height=419&amp;amp;face=0_0_800_419,https://scrap.kakaocdn.net/dn/e2HfF/hyYclRTgoO/d93DDtnD1Nu7P0YS0OZiQK/img.png?width=800&amp;amp;height=419&amp;amp;face=0_0_800_419,https://scrap.kakaocdn.net/dn/cFyxeL/hyYb6NX6Gy/ufDt0u4Sa4nwcq33zK9cFk/img.png?width=1442&amp;amp;height=757&amp;amp;face=0_0_1442_757');&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;99클럽 코테 스터디 13일차 TIL (미들러)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제: 2529번 부등호 문제예제// input9&amp;gt; &amp;gt; &amp;gt; &amp;nbsp;&amp;nbsp;풀이방법이 문제에서는 주어진 부등호 조건을 만족하는 숫자 조합 중 최댓값과 최솟값을 구하는 것이다. 단, 0 ~ 9 사이의 숫자는 한번씩만 사용이 가&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;become-programmer.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-12%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.02.05 - [알고리즘/99클럽 코테스터디 5기] - 99클럽 코테 스터디 12일차 TIL (미들러)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1738892023690&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;99클럽 코테 스터디 12일차 TIL (미들러)&quot; data-og-description=&quot;문제: 1051번 숫자 정사각형예제// input3 5421012210022101// output9&amp;nbsp;&amp;nbsp;풀이방법11일차 문제를 풀어보니 이 문제는 완전탐색으로 풀어야 할 것 같았다. 왜냐하면 입력 값의 최대가 50으로 완전 탐색으로도 &quot; data-og-host=&quot;become-programmer.tistory.com&quot; data-og-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-12%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-12%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/FmCNi/hyYb7e10Vk/YvDQPelzxu7Yok6IMUggc1/img.png?width=800&amp;amp;height=421&amp;amp;face=0_0_800_421,https://scrap.kakaocdn.net/dn/CR5uH/hyYceytyEq/vMyVO3vo1f2Wr0i24wmYq0/img.png?width=800&amp;amp;height=421&amp;amp;face=0_0_800_421,https://scrap.kakaocdn.net/dn/XsCMX/hyYb9cQSCt/7hhAj0vxMfEHdEaqjEuI70/img.png?width=1497&amp;amp;height=788&amp;amp;face=0_0_1497_788&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-12%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-12%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/FmCNi/hyYb7e10Vk/YvDQPelzxu7Yok6IMUggc1/img.png?width=800&amp;amp;height=421&amp;amp;face=0_0_800_421,https://scrap.kakaocdn.net/dn/CR5uH/hyYceytyEq/vMyVO3vo1f2Wr0i24wmYq0/img.png?width=800&amp;amp;height=421&amp;amp;face=0_0_800_421,https://scrap.kakaocdn.net/dn/XsCMX/hyYb9cQSCt/7hhAj0vxMfEHdEaqjEuI70/img.png?width=1497&amp;amp;height=788&amp;amp;face=0_0_1497_788');&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;99클럽 코테 스터디 12일차 TIL (미들러)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제: 1051번 숫자 정사각형예제// input3 5421012210022101// output9&amp;nbsp;&amp;nbsp;풀이방법11일차 문제를 풀어보니 이 문제는 완전탐색으로 풀어야 할 것 같았다. 왜냐하면 입력 값의 최대가 50으로 완전 탐색으로도&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;become-programmer.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/99클럽 코테스터디 5기</category>
      <category>99클럽</category>
      <category>99클럽코테스터디</category>
      <category>til</category>
      <category>백준 2615번</category>
      <category>백준 오목</category>
      <category>코테스터디 14일차</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/344</guid>
      <comments>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-14%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC#entry344comment</comments>
      <pubDate>Fri, 7 Feb 2025 10:34:57 +0900</pubDate>
    </item>
    <item>
      <title>99클럽 코테 스터디 13일차 TIL (미들러)</title>
      <link>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-13%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제: 2529번 부등호 문제&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1442&quot; data-origin-height=&quot;757&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3gy2o/btsL8kyae27/XZjQQwtW3hNg5J46pjJBA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3gy2o/btsL8kyae27/XZjQQwtW3hNg5J46pjJBA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3gy2o/btsL8kyae27/XZjQQwtW3hNg5J46pjJBA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3gy2o%2FbtsL8kyae27%2FXZjQQwtW3hNg5J46pjJBA1%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;1442&quot; height=&quot;757&quot; data-origin-width=&quot;1442&quot; data-origin-height=&quot;757&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738802568394&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// input
9
&amp;gt; &amp;lt; &amp;lt; &amp;lt; &amp;gt; &amp;gt; &amp;gt; &amp;lt; &amp;lt;

// output
9567843012
1023765489&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이 문제에서는 주어진 부등호 조건을 만족하는 숫자 조합 중 최댓값과 최솟값을 구하는 것이다. 단, 0 ~ 9 사이의 숫자는 한번씩만 사용이 가능하다는 조건이 있다. 백트래킹(DFS) 알고리즘을 활용하면 가능한 모든 숫자의 조합을 탐색할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;1. 백트래킹&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738802722129&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;static void dfs(String num, int depth) {
    if (depth == k + 1) { // 숫자가 k+1개가 되면 종료
        results.add(num);
        return;
    }

    for (int i = 0; i &amp;lt; 10; i++) { // 0~9 숫자 중 선택
        if (!visited[i]) { // 사용하지 않은 숫자만 선택
            if (depth == 0 || check(num.charAt(depth - 1) - '0', i, signs[depth - 1])) {
                visited[i] = true; // 숫자 사용 체크
                dfs(num + i, depth + 1); // 재귀 호출 (다음 숫자 탐색)
                visited[i] = false; // 백트래킹 (원상 복구)
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;종료조건&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;숫자는 입력된 부등호의 수보다 하나 더 많아야 하므로 숫자가 k + 1개가 되면 해당 조합을 리스트에 추가하고 종료한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;반복문&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;0 ~ 9까지의 숫자를 선택할 수 있기에 반복문의 범위는 이렇게 설정한다. 또한 문제의 조건이 숫자는 한번씩만 사용 가능하기에 visited 배열을 활용하여 중복되어 사용되진 않는지 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;2. 부등호 조건 체크&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738802855664&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;static boolean check(int a, int b, char sign) {
    if (sign == '&amp;lt;') return a &amp;lt; b;
    else return a &amp;gt; b;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;선택된 숫자가 이전 숫자와 비교하여 부등호 조건에 만족하는지 확인한다. 만약 부등호가 '&amp;lt;' 라면 a(이전 숫자) &amp;lt; b(현재 숫자)여야 조건에 만족한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;전체 코드&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738802949847&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    static int k;
    static char[] signs;
    static boolean[] visited = new boolean[10];
    static List&amp;lt;String&amp;gt; results = new ArrayList&amp;lt;&amp;gt;();

    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        k = Integer.parseInt(br.readLine());

        signs = br.readLine().replace(&quot; &quot;, &quot;&quot;).toCharArray();

        dfs(&quot;&quot;, 0);

        Collections.sort(results);
        System.out.println(results.get(results.size() - 1)); // 최대값
        System.out.println(results.get(0)); // 최소값
    }

    static void dfs(String num, int depth) {
        if (depth == k + 1) {
            results.add(num);
            return;
        }

        for (int i = 0; i &amp;lt; 10; i++) {
            if (!visited[i]) {
                if (depth == 0 || check(num.charAt(depth - 1) - '0', i, signs[depth - 1])) {
                    visited[i] = true;
                    dfs(num + i, depth + 1);
                    visited[i] = false;
                }
            }
        }
    }

    static boolean check(int a, int b, char sign) {
        if (sign == '&amp;lt;')
            return a &amp;lt; b;
        else
            return a &amp;gt; b;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;코테스터디 TIL&lt;/b&gt;&lt;/h4&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;size14&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-12%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.02.05 - [알고리즘/99클럽 코테스터디 5기] - 99클럽 코테 스터디 12일차 TIL (미들러)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1738802974951&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;99클럽 코테 스터디 12일차 TIL (미들러)&quot; data-og-description=&quot;문제: 1051번 숫자 정사각형예제// input3 5421012210022101// output9&amp;nbsp;&amp;nbsp;풀이방법11일차 문제를 풀어보니 이 문제는 완전탐색으로 풀어야 할 것 같았다. 왜냐하면 입력 값의 최대가 50으로 완전 탐색으로도 &quot; data-og-host=&quot;become-programmer.tistory.com&quot; data-og-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-12%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-12%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bgXwDZ/hyYcdF4I7B/5CmMHjeXKKQEkks3Vmh9Yk/img.png?width=800&amp;amp;height=421&amp;amp;face=0_0_800_421,https://scrap.kakaocdn.net/dn/rhpI2/hyYcigkTqy/vo97gtBKFZ42T4BkaYIxrK/img.png?width=800&amp;amp;height=421&amp;amp;face=0_0_800_421,https://scrap.kakaocdn.net/dn/b6yqz8/hyX7TbpVTG/uTyrAJTTbrg7OsIFk7FVmk/img.png?width=1497&amp;amp;height=788&amp;amp;face=0_0_1497_788&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-12%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-12%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bgXwDZ/hyYcdF4I7B/5CmMHjeXKKQEkks3Vmh9Yk/img.png?width=800&amp;amp;height=421&amp;amp;face=0_0_800_421,https://scrap.kakaocdn.net/dn/rhpI2/hyYcigkTqy/vo97gtBKFZ42T4BkaYIxrK/img.png?width=800&amp;amp;height=421&amp;amp;face=0_0_800_421,https://scrap.kakaocdn.net/dn/b6yqz8/hyX7TbpVTG/uTyrAJTTbrg7OsIFk7FVmk/img.png?width=1497&amp;amp;height=788&amp;amp;face=0_0_1497_788');&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;99클럽 코테 스터디 12일차 TIL (미들러)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제: 1051번 숫자 정사각형예제// input3 5421012210022101// output9&amp;nbsp;&amp;nbsp;풀이방법11일차 문제를 풀어보니 이 문제는 완전탐색으로 풀어야 할 것 같았다. 왜냐하면 입력 값의 최대가 50으로 완전 탐색으로도&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;become-programmer.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-10%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC-1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.02.04 - [알고리즘/99클럽 코테스터디 5기] - 99클럽 코테 스터디 11일차 TIL (미들러)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1738802981016&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;99클럽 코테 스터디 11일차 TIL (미들러)&quot; data-og-description=&quot;문제: 1018번 체스판 다시 칠하기예제// input10 13BBBBBBBBWBWBWBBBBBBBBBWBWBBBBBBBBBWBWBWBBBBBBBBBWBWBBBBBBBBBWBWBWBBBBBBBBBWBWBBBBBBBBBWBWBWBBBBBBBBBWBWBWWWWWWWWWWBWBWWWWWWWWWWBWB// output12&amp;nbsp;&amp;nbsp;풀이방법이 문제를 풀 때 최적의 값을&quot; data-og-host=&quot;become-programmer.tistory.com&quot; data-og-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-10%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC-1&quot; data-og-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-10%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC-1&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/4RA3n/hyYb7FRbTV/tim8Senag7bp5JNKqWzqF1/img.png?width=800&amp;amp;height=353&amp;amp;face=0_0_800_353,https://scrap.kakaocdn.net/dn/boug6w/hyYcfcPwMT/dPXKwTvr4aGLzz8tChgoGk/img.png?width=800&amp;amp;height=353&amp;amp;face=0_0_800_353,https://scrap.kakaocdn.net/dn/boj3ut/hyYcerpUHg/XD3UxTUco01ngHyHrDtyxK/img.png?width=1546&amp;amp;height=684&amp;amp;face=0_0_1546_684&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-10%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC-1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-10%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC-1&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/4RA3n/hyYb7FRbTV/tim8Senag7bp5JNKqWzqF1/img.png?width=800&amp;amp;height=353&amp;amp;face=0_0_800_353,https://scrap.kakaocdn.net/dn/boug6w/hyYcfcPwMT/dPXKwTvr4aGLzz8tChgoGk/img.png?width=800&amp;amp;height=353&amp;amp;face=0_0_800_353,https://scrap.kakaocdn.net/dn/boj3ut/hyYcerpUHg/XD3UxTUco01ngHyHrDtyxK/img.png?width=1546&amp;amp;height=684&amp;amp;face=0_0_1546_684');&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;99클럽 코테 스터디 11일차 TIL (미들러)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제: 1018번 체스판 다시 칠하기예제// input10 13BBBBBBBBWBWBWBBBBBBBBBWBWBBBBBBBBBWBWBWBBBBBBBBBWBWBBBBBBBBBWBWBWBBBBBBBBBWBWBBBBBBBBBWBWBWBBBBBBBBBWBWBWWWWWWWWWWBWBWWWWWWWWWWBWB// output12&amp;nbsp;&amp;nbsp;풀이방법이 문제를 풀 때 최적의 값을&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;become-programmer.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/99클럽 코테스터디 5기</category>
      <category>99클럽</category>
      <category>99클럽코테스터디</category>
      <category>til</category>
      <category>백준 2529번</category>
      <category>백준 부등호</category>
      <category>코테스터디 13일차</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/343</guid>
      <comments>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-13%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC#entry343comment</comments>
      <pubDate>Thu, 6 Feb 2025 09:51:27 +0900</pubDate>
    </item>
    <item>
      <title>99클럽 코테 스터디 12일차 TIL (미들러)</title>
      <link>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-12%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제: 1051번 숫자 정사각형&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-02-05 092928.png&quot; data-origin-width=&quot;1497&quot; data-origin-height=&quot;788&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bADcNU/btsL74Vvyvf/99tozKacX26alKh2LQNMO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bADcNU/btsL74Vvyvf/99tozKacX26alKh2LQNMO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bADcNU/btsL74Vvyvf/99tozKacX26alKh2LQNMO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbADcNU%2FbtsL74Vvyvf%2F99tozKacX26alKh2LQNMO1%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;1497&quot; height=&quot;788&quot; data-filename=&quot;스크린샷 2025-02-05 092928.png&quot; data-origin-width=&quot;1497&quot; data-origin-height=&quot;788&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738715822771&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// input
3 5
42101
22100
22101

// output
9&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;11일차 문제를 풀어보니 이 문제는 완전탐색으로 풀어야 할 것 같았다. 왜냐하면 입력 값의 최대가 50으로 완전 탐색으로도 해결가능할 것이라 생각했고 모든 경우의 수를 다 탐색해야 하기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;1. 완전 탐색&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;2. 꼭짓점의 수가 동일한지 확인하기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;1. 완전 탐색&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738716178931&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for (int i = 0; i &amp;lt; n; i++) {
    for (int j = 0; j &amp;lt; m; j++) {
        checkSquare(i, j);
        if (max == n * m) {
            System.out.println(max);
            return;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;직사각형에서 시작점이 되는 곳을 모두 탐색한다. 만약 저장된 정사각형의 최대 크기보다 탐색하는 직사각형의 크기가 더 크다면, 반복문을 종료하고 값을 출력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt; 2. 꼭짓점의 수가 동일한지 확인하기 &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738716269965&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;static void checkSquare(int x, int y) {
    for (int i = 1; x + i &amp;lt; n &amp;amp;&amp;amp; y + i &amp;lt; m; i++) {
        if (rectangle[x][y] == rectangle[x + i][y]
                &amp;amp;&amp;amp; rectangle[x][y] == rectangle[x][y + i]
                &amp;amp;&amp;amp; rectangle[x][y] == rectangle[x + i][y + i]) {
            max = Math.max(max, (i + 1) * (i + 1));
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;반복문은 현재의 직사각형 범위를 넘어가면 종료된다. 조건문을 통하여 각 꼭짓점의 값을 비교하고 모든 꼭짓점의 크기가 동일하다면 해당 크기를 저장된 최대 크기와 비교하여 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;전체코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738716392129&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    static int n;
    static int m;
    static int[][] rectangle;
    static int max = 1;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String[] size = br.readLine().split(&quot; &quot;);
        n = Integer.parseInt(size[0]);
        m = Integer.parseInt(size[1]);

        rectangle = new int[n][m];

        for (int i = 0; i &amp;lt; n; i++) {
            String str = br.readLine();
            for (int j = 0; j &amp;lt; m; j++) {
                rectangle[i][j] = str.charAt(j) - '0';
            }
        }

        for (int i = 0; i &amp;lt; n; i++) {
            for (int j = 0; j &amp;lt; m; j++) {
                checkSquare(i, j);
                if (max == n * m) {
                    System.out.println(max);
                    return;
                }
            }
        }

        System.out.println(max);
    }

    static void checkSquare(int x, int y) {
        for (int i = 1; x + i &amp;lt; n &amp;amp;&amp;amp; y + i &amp;lt; m; i++) {
            if (rectangle[x][y] == rectangle[x + i][y]
                    &amp;amp;&amp;amp; rectangle[x][y] == rectangle[x][y + i]
                    &amp;amp;&amp;amp; rectangle[x][y] == rectangle[x + i][y + i]) {
                max = Math.max(max, (i + 1) * (i + 1));
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;코테스터디 TIL&lt;/b&gt;&lt;/h4&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;size14&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-10%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC-1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.02.04 - [알고리즘/99클럽 코테스터디 5기] - 99클럽 코테 스터디 11일차 TIL (미들러)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1738716411722&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;99클럽 코테 스터디 11일차 TIL (미들러)&quot; data-og-description=&quot;문제: 1018번 체스판 다시 칠하기예제// input10 13BBBBBBBBWBWBWBBBBBBBBBWBWBBBBBBBBBWBWBWBBBBBBBBBWBWBBBBBBBBBWBWBWBBBBBBBBBWBWBBBBBBBBBWBWBWBBBBBBBBBWBWBWWWWWWWWWWBWBWWWWWWWWWWBWB// output12&amp;nbsp;&amp;nbsp;풀이방법이 문제를 풀 때 최적의 값을&quot; data-og-host=&quot;become-programmer.tistory.com&quot; data-og-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-10%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC-1&quot; data-og-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-10%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC-1&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dbqNqU/hyYb6thmmo/0iAMeEUmKiJTYuOJu0HkR0/img.png?width=800&amp;amp;height=353&amp;amp;face=0_0_800_353,https://scrap.kakaocdn.net/dn/RaFUj/hyYceLB8ks/69eSdeAIOyVgt171G3JFO1/img.png?width=800&amp;amp;height=353&amp;amp;face=0_0_800_353,https://scrap.kakaocdn.net/dn/WmOe5/hyYcdspJ1n/WIjrfVkbVOuTBCkSoOXfmk/img.png?width=1546&amp;amp;height=684&amp;amp;face=0_0_1546_684&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-10%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC-1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-10%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC-1&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dbqNqU/hyYb6thmmo/0iAMeEUmKiJTYuOJu0HkR0/img.png?width=800&amp;amp;height=353&amp;amp;face=0_0_800_353,https://scrap.kakaocdn.net/dn/RaFUj/hyYceLB8ks/69eSdeAIOyVgt171G3JFO1/img.png?width=800&amp;amp;height=353&amp;amp;face=0_0_800_353,https://scrap.kakaocdn.net/dn/WmOe5/hyYcdspJ1n/WIjrfVkbVOuTBCkSoOXfmk/img.png?width=1546&amp;amp;height=684&amp;amp;face=0_0_1546_684');&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;99클럽 코테 스터디 11일차 TIL (미들러)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제: 1018번 체스판 다시 칠하기예제// input10 13BBBBBBBBWBWBWBBBBBBBBBWBWBBBBBBBBBWBWBWBBBBBBBBBWBWBBBBBBBBBWBWBWBBBBBBBBBWBWBBBBBBBBBWBWBWBBBBBBBBBWBWBWWWWWWWWWWBWBWWWWWWWWWWBWB// output12&amp;nbsp;&amp;nbsp;풀이방법이 문제를 풀 때 최적의 값을&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;become-programmer.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-10%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.01.30 - [알고리즘/99클럽 코테스터디 5기] - 99클럽 코테 스터디 10일차 TIL (미들러)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1738716417422&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;99클럽 코테 스터디 10일차 TIL (미들러)&quot; data-og-description=&quot;문제: 2573번 빙산예제// Input5 70 0 0 0 0 0 00 2 4 5 3 0 00 3 0 2 5 2 00 7 6 2 4 0 00 0 0 0 0 0 0// Output2&amp;nbsp;&amp;nbsp;풀이방법먼저 문제를 이해하기 위해 ChatGPT 도움을 받았다. 배열에서의 0은 바닷물을 뜻하고 다른 수는 &quot; data-og-host=&quot;become-programmer.tistory.com&quot; data-og-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-10%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-10%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/UEsP5/hyX7UuxhYU/PainynbyK6bJA99nrgFYxk/img.png?width=800&amp;amp;height=381&amp;amp;face=0_0_800_381,https://scrap.kakaocdn.net/dn/s2aOh/hyYcdeMUYB/9GWIDb8UEscn8cMCngL0cK/img.png?width=800&amp;amp;height=381&amp;amp;face=0_0_800_381,https://scrap.kakaocdn.net/dn/bG9rNk/hyYcaWJNkr/gUKFwAsRvN6dSvppfDv9Yk/img.png?width=1453&amp;amp;height=692&amp;amp;face=0_0_1453_692&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-10%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-10%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/UEsP5/hyX7UuxhYU/PainynbyK6bJA99nrgFYxk/img.png?width=800&amp;amp;height=381&amp;amp;face=0_0_800_381,https://scrap.kakaocdn.net/dn/s2aOh/hyYcdeMUYB/9GWIDb8UEscn8cMCngL0cK/img.png?width=800&amp;amp;height=381&amp;amp;face=0_0_800_381,https://scrap.kakaocdn.net/dn/bG9rNk/hyYcaWJNkr/gUKFwAsRvN6dSvppfDv9Yk/img.png?width=1453&amp;amp;height=692&amp;amp;face=0_0_1453_692');&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;99클럽 코테 스터디 10일차 TIL (미들러)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제: 2573번 빙산예제// Input5 70 0 0 0 0 0 00 2 4 5 3 0 00 3 0 2 5 2 00 7 6 2 4 0 00 0 0 0 0 0 0// Output2&amp;nbsp;&amp;nbsp;풀이방법먼저 문제를 이해하기 위해 ChatGPT 도움을 받았다. 배열에서의 0은 바닷물을 뜻하고 다른 수는&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;become-programmer.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/99클럽 코테스터디 5기</category>
      <category>99클럽</category>
      <category>99클럽코테스터디</category>
      <category>til</category>
      <category>백준 1051번</category>
      <category>백준 숫자 정사각형</category>
      <category>코테스터디 12일차</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/342</guid>
      <comments>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-12%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC#entry342comment</comments>
      <pubDate>Wed, 5 Feb 2025 09:48:29 +0900</pubDate>
    </item>
    <item>
      <title>99클럽 코테 스터디 11일차 TIL (미들러)</title>
      <link>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-10%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC-1</link>
      <description>&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제: 1018번 체스판 다시 칠하기&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1546&quot; data-origin-height=&quot;684&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bD54yY/btsL5QDNFlF/DzaMBiW9lIDXF6eJW6oX31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bD54yY/btsL5QDNFlF/DzaMBiW9lIDXF6eJW6oX31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bD54yY/btsL5QDNFlF/DzaMBiW9lIDXF6eJW6oX31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbD54yY%2FbtsL5QDNFlF%2FDzaMBiW9lIDXF6eJW6oX31%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;1546&quot; height=&quot;684&quot; data-origin-width=&quot;1546&quot; data-origin-height=&quot;684&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738631478434&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// input
10 13
BBBBBBBBWBWBW
BBBBBBBBBWBWB
BBBBBBBBWBWBW
BBBBBBBBBWBWB
BBBBBBBBWBWBW
BBBBBBBBBWBWB
BBBBBBBBWBWBW
BBBBBBBBBWBWB
WWWWWWWWWWBWB
WWWWWWWWWWBWB

// output
12&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이 문제를 풀 때 최적의 값을 출력하려면 두가지를 고려해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;1. 8 * 8 체스판 만들기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;2. 검은색으로 시작할지 흰색으로 시작할지 정하기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;1.&amp;nbsp; 8 * 8 체스판 만들기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;먼저 8 * 8 체스판을 만들 수 있는 모든 경우의 수를 다 계산해야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1738631676952&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for (int i = 0; i &amp;lt;= n - 8; i++) {
    for (int j = 0; j &amp;lt;= m - 8; j++) {
        checkBoard(i, j);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;8 * 8 체스판을 만들기 위해서 입력된 n, m에서 -8을 빼서 시작점을 알아내야 한다. 만약 입력된 n, m의 값이 8, 8 이라면, 시작점은 오직 0, 0 밖에 존재하지 않지만 입력 값이 n, m이 8,9라면 시작점은 [0,0], [0,1] 이 될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt; 2. 검은색으로 시작할지 흰색으로 시작할지 정하기 &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738631868160&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private static void checkBoard(int x, int y) {
    // 'W'로 시작하는 체스판과 비교할 때 다시 칠해야 하는 개수
    int repaintW = 0;
    // 'B'로 시작하는 체스판과 비교할 때 다시 칠해야 하는 개수
    int repaintB = 0;

    for (int i = 0; i &amp;lt; 8; i++) {
        for (int j = 0; j &amp;lt; 8; j++) {
            if ((i + j) % 2 == 0) {
                if (board[x + i][y + j] != 'W')
                    repaintW++;
                if (board[x + i][y + j] != 'B')
                    repaintB++;
            } else {
                if (board[x + i][y + j] != 'B')
                    repaintW++;
                if (board[x + i][y + j] != 'W')
                    repaintB++;
            }
        }
    }
    min = Math.min(min, Math.min(repaintW, repaintB));
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;시작점을 알아냈다면 어떤 값이 시작점에 존재하는 지에 따라 다시 칠해야 하는 정사각형의 개수가 달라진다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;repaintW, repaintB&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;해당 변수는 검은색으로 시작하는 체스판과 흰색으로 시작하는 체스판에서 다시 칠해야 하는 정사각형의 개수를 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;반복문&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;짝수 칸의 경우와 홀수 칸의 경우를 나누어 조건문을 설정한다. 즉, (i + j) % 2 == 0이면 기준 칸과 같은 색이어야 하고, !=이면 반대 색이어야 한다. 흰색으로 시작할 경우와 검은색으로 시작할 경우를 나누어 각각 다시 칠해야 하는 개수를 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;마지막에는 모든 체스판을 탐색한 후의 다시 칠해야 하는 정사각형의 최소개수 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;전체코드&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738632381767&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    static char[][] board;
    static int n, m;
    static int min = Integer.MAX_VALUE;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        StringTokenizer st = new StringTokenizer(br.readLine(), &quot; &quot;);
        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());
        board = new char[n][m];

        for (int i = 0; i &amp;lt; n; i++) {
            board[i] = br.readLine().toCharArray();
        }

        for (int i = 0; i &amp;lt;= n - 8; i++) {
            for (int j = 0; j &amp;lt;= m - 8; j++) {
                checkBoard(i, j);
            }
        }

        System.out.println(min);
    }

    private static void checkBoard(int x, int y) {
        int repaintW = 0;
        int repaintB = 0;

        for (int i = 0; i &amp;lt; 8; i++) {
            for (int j = 0; j &amp;lt; 8; j++) {
                if ((i + j) % 2 == 0) {
                    if (board[x + i][y + j] != 'W')
                        repaintW++;
                    if (board[x + i][y + j] != 'B')
                        repaintB++;
                } else {
                    if (board[x + i][y + j] != 'B')
                        repaintW++;
                    if (board[x + i][y + j] != 'W')
                        repaintB++;
                }
            }
        }
        min = Math.min(min, Math.min(repaintW, repaintB));
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;코테스터디 TIL&lt;/b&gt;&lt;/h4&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;size14&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-10%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.01.30 - [알고리즘/99클럽 코테스터디 5기] - 99클럽 코테 스터디 10일차 TIL (미들러)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1738632403483&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;99클럽 코테 스터디 10일차 TIL (미들러)&quot; data-og-description=&quot;문제: 2573번 빙산예제// Input5 70 0 0 0 0 0 00 2 4 5 3 0 00 3 0 2 5 2 00 7 6 2 4 0 00 0 0 0 0 0 0// Output2&amp;nbsp;&amp;nbsp;풀이방법먼저 문제를 이해하기 위해 ChatGPT 도움을 받았다. 배열에서의 0은 바닷물을 뜻하고 다른 수는 &quot; data-og-host=&quot;become-programmer.tistory.com&quot; data-og-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-10%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-10%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/PBj1G/hyX7Zh82gD/T0O4Ab68mlGJVKkkkLi4sk/img.png?width=800&amp;amp;height=381&amp;amp;face=0_0_800_381,https://scrap.kakaocdn.net/dn/tc4BG/hyYcexV3Vw/ZolI4xWogyjUqlO0hr3Bg1/img.png?width=800&amp;amp;height=381&amp;amp;face=0_0_800_381,https://scrap.kakaocdn.net/dn/vMXRZ/hyYcexV3Zx/fKB37YDtb2LNQIFH7ow0Kk/img.png?width=1453&amp;amp;height=692&amp;amp;face=0_0_1453_692&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-10%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-10%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/PBj1G/hyX7Zh82gD/T0O4Ab68mlGJVKkkkLi4sk/img.png?width=800&amp;amp;height=381&amp;amp;face=0_0_800_381,https://scrap.kakaocdn.net/dn/tc4BG/hyYcexV3Vw/ZolI4xWogyjUqlO0hr3Bg1/img.png?width=800&amp;amp;height=381&amp;amp;face=0_0_800_381,https://scrap.kakaocdn.net/dn/vMXRZ/hyYcexV3Zx/fKB37YDtb2LNQIFH7ow0Kk/img.png?width=1453&amp;amp;height=692&amp;amp;face=0_0_1453_692');&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;99클럽 코테 스터디 10일차 TIL (미들러)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제: 2573번 빙산예제// Input5 70 0 0 0 0 0 00 2 4 5 3 0 00 3 0 2 5 2 00 7 6 2 4 0 00 0 0 0 0 0 0// Output2&amp;nbsp;&amp;nbsp;풀이방법먼저 문제를 이해하기 위해 ChatGPT 도움을 받았다. 배열에서의 0은 바닷물을 뜻하고 다른 수는&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;become-programmer.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-9%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.01.23 - [알고리즘/99클럽 코테스터디 5기] - 99클럽 코테 스터디 9일차 TIL (미들러)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1738632412099&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;99클럽 코테 스터디 9일차 TIL (미들러)&quot; data-og-description=&quot;문제: 백준 1707번 이분 그래프예제// Input23 21 32 34 41 22 33 44 2// OutputYESNO&amp;nbsp;&amp;nbsp;풀이방법문제를 읽어보니 이해가 되지 않아 ChatGPT에게 초등학생도 이해하기 쉽게 설명해 달라고 했다. GPT는 노드를 집, &quot; data-og-host=&quot;become-programmer.tistory.com&quot; data-og-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-9%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-9%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/XmhC0/hyX7PzPJac/JUqWN1xJuQj8firJ5nSu9K/img.png?width=800&amp;amp;height=440&amp;amp;face=0_0_800_440,https://scrap.kakaocdn.net/dn/b9WNrc/hyYcgJhrg3/cdSArrNEAqPwJYEeewEcK0/img.png?width=800&amp;amp;height=440&amp;amp;face=0_0_800_440,https://scrap.kakaocdn.net/dn/cGAPJl/hyYckEUN3y/jtoGnBsXcvX83cLp0DWly1/img.png?width=1466&amp;amp;height=807&amp;amp;face=0_0_1466_807&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-9%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-9%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/XmhC0/hyX7PzPJac/JUqWN1xJuQj8firJ5nSu9K/img.png?width=800&amp;amp;height=440&amp;amp;face=0_0_800_440,https://scrap.kakaocdn.net/dn/b9WNrc/hyYcgJhrg3/cdSArrNEAqPwJYEeewEcK0/img.png?width=800&amp;amp;height=440&amp;amp;face=0_0_800_440,https://scrap.kakaocdn.net/dn/cGAPJl/hyYckEUN3y/jtoGnBsXcvX83cLp0DWly1/img.png?width=1466&amp;amp;height=807&amp;amp;face=0_0_1466_807');&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;99클럽 코테 스터디 9일차 TIL (미들러)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제: 백준 1707번 이분 그래프예제// Input23 21 32 34 41 22 33 44 2// OutputYESNO&amp;nbsp;&amp;nbsp;풀이방법문제를 읽어보니 이해가 되지 않아 ChatGPT에게 초등학생도 이해하기 쉽게 설명해 달라고 했다. GPT는 노드를 집,&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;become-programmer.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/99클럽 코테스터디 5기</category>
      <category>99클럽</category>
      <category>99클럽코테스터디</category>
      <category>til</category>
      <category>백준 1018번</category>
      <category>백준 체스판 다시 칠하기</category>
      <category>코테스터디 11일차</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/341</guid>
      <comments>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-10%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC-1#entry341comment</comments>
      <pubDate>Tue, 4 Feb 2025 10:28:09 +0900</pubDate>
    </item>
    <item>
      <title>99클럽 코테 스터디 10일차 TIL (미들러)</title>
      <link>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-10%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제: 2573번 빙산&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1453&quot; data-origin-height=&quot;692&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/64u93/btsL24orpzI/NvL70f8GvkYPQ2lxhgK020/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/64u93/btsL24orpzI/NvL70f8GvkYPQ2lxhgK020/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/64u93/btsL24orpzI/NvL70f8GvkYPQ2lxhgK020/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F64u93%2FbtsL24orpzI%2FNvL70f8GvkYPQ2lxhgK020%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;1453&quot; height=&quot;692&quot; data-origin-width=&quot;1453&quot; data-origin-height=&quot;692&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738210374372&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Input
5 7
0 0 0 0 0 0 0
0 2 4 5 3 0 0
0 3 0 2 5 2 0
0 7 6 2 4 0 0
0 0 0 0 0 0 0

// Output
2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;먼저 문제를 이해하기 위해 ChatGPT 도움을 받았다. 배열에서의 0은 바닷물을 뜻하고 다른 수는 빙산의 높이를 뜻한다. 해마다 빙산의 크기는 상하좌우의 바닷물 개수마다 줄어드는데, 이때 우리가 구할 것은 빙산이 두 덩이로 나누어지는 년도를 구해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;문제를 이해하고 풀 때에는 DFS/BFS로 구현해서 변경된 빙산의 높이를 구하면 될 것이라 생각했다. 하지만 거듭해서 실패를 맛보고 막막함이 몰려왔다. 따라서 난 또 ChatGPT에게 도움을 구했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이 문제는 단순히 그래프 알고리즘으로 풀고 끝나는 것이 아니라 고려 해야 할 상황이 더 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;letter-spacing: 0px; color: #ee2323;&quot;&gt;1. 빙산을 녹이기 이전에 빙산 덩어리 개수를 구하기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;2. 빙산을 녹일 때 한번에 변경된 값을 적용하기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt; 1. 빙산을 녹이기 이전에 빙산 덩어리 개수를 구하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738210964399&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private static int countIcebergs() {
    boolean[][] visited = new boolean[n][m];
    int count = 0;

    for (int i = 0; i &amp;lt; n; i++) {
        for (int j = 0; j &amp;lt; m; j++) {
            if (ice[i][j] &amp;gt; 0 &amp;amp;&amp;amp; !visited[i][j]) {
                bfs(i, j, visited);
                count++;
            }
        }
    }
    return count;
}

private static void bfs(int i, int j, boolean[][] visited) {
    Queue&amp;lt;int[]&amp;gt; q = new LinkedList&amp;lt;&amp;gt;();
    q.offer(new int[] { i, j });
    visited[i][j] = true;

    while (!q.isEmpty()) {
        int[] cur = q.poll();

        for (int f = 0; f &amp;lt; 4; f++) {
            int r = cur[0] + dr[f];
            int c = cur[1] + dc[f];

            if (r &amp;gt;= 0 &amp;amp;&amp;amp; r &amp;lt; n &amp;amp;&amp;amp; c &amp;gt;= 0 &amp;amp;&amp;amp; c &amp;lt; m &amp;amp;&amp;amp; !visited[r][c] &amp;amp;&amp;amp; ice[r][c] &amp;gt; 0) {
                q.offer(new int[] { r, c });
                visited[r][c] = true;
            }
        }

    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;빙산을 녹이기 이전에 빙산의 개수가 몇 개인지 확인이 필요하다. 이를 위해서는 그래프 알고리즘인 DFS/BFS를 활용할 수 있다. 왜냐하면 bfs() 메서드는 상하좌우로 연결된 빙산을 모두 확인하기에 count가 2번 이상 돌게 될 경우 빙산이 두 덩이 이상이라는 것을 알 수 있기 때문이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;bfs()메서드에서는 상하좌우를 모두 탐색해야 하기 때문에 해당 배열의 값(r, c)이 배열 범위 내에 있는지 확인해야 하며 이미 방문하지 않았는지, 배열의 값이 0보다 큰지를 확인해야 한다. 만약 조건에 만족한다면 Queue에 해당 배열의 위치 값을 저장하고 방문 여부를 true로 변경해준다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;2. 빙산을 녹일 때 한번에 변경된 값을 적용하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738211313378&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private static void meltIce() {
    int[][] temp = new int[n][m];

    for (int i = 0; i &amp;lt; n; i++) {
        for (int j = 0; j &amp;lt; m; j++) {
            if (ice[i][j] &amp;gt; 0) {
                int waterCount = 0;

                for (int f = 0; f &amp;lt; 4; f++) {
                    int r = i + dr[f];
                    int c = j + dc[f];

                    if (r &amp;gt;= 0 &amp;amp;&amp;amp; r &amp;lt; n &amp;amp;&amp;amp; c &amp;gt;= 0 &amp;amp;&amp;amp; c &amp;lt; m &amp;amp;&amp;amp; ice[r][c] == 0) {
                        waterCount++;
                    }
                }
                temp[i][j] = Math.max(0, ice[i][j] - waterCount);
            }
        }
    }

    for (int i = 0; i &amp;lt; n; i++) {
        System.arraycopy(temp[i], 0, ice[i], 0, m);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;처음 이 코드를 접했을 때는 왜 임시배열을 만들어 한번에 변경된 빙산의 높이를 적용하는 건지 이해를 하지 못했다. 바로 적용하면 되는데 왜 쓸데없이 메모리 공간을 차지하는 거지라는 생각이었다. 하지만 코드를 이렇게 작성하는 건 이유가 있었다. 만약 변경된 빙산 높이의 값을 즉시 적용해버리면 아직 방문하지 않은 빙산의 높이가 올바르지 않게 변경될 수 있기 때문이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;예시를 들어 아래와 같은 배열이 있다고 가정하자&lt;/p&gt;
&lt;pre id=&quot;code_1738211685248&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;0 0 0 0 0
1 1 2 1 0
0 4 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;size14&quot;&gt;반복문을 돌아 i = 1, j = 1이 되었다. 현재 ice[1][1]의 값 1 이지만 ice[0][1]가 0(바닷물)이기에 빙산을 높이를 바로 적용하면 ice[1][1]의 값은 0이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이후 i = 1, j = 2일 때 변경된 빙산의 높이는 1 (상단에 바닷물 하나)이어야 하지만, ice[1][2]의 값은 ice[1][1]이 즉시 적용되었기 때문에 0이 돼버린다. 이러한 오류를 범하고자 임시배열을 만들어 한번에 적용해야 하는 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;전체코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738212005116&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    static int n, m;
    static int[][] ice;
    static int[] dr = { -1, 1, 0, 0 };
    static int[] dc = { 0, 0, -1, 1 };

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String[] input = br.readLine().split(&quot; &quot;);
        n = Integer.parseInt(input[0]);
        m = Integer.parseInt(input[1]);

        ice = new int[n][m];

        StringTokenizer st;
        for (int i = 0; i &amp;lt; n; i++) {
            st = new StringTokenizer(br.readLine(), &quot; &quot;);
            for (int j = 0; j &amp;lt; m; j++) {
                ice[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        int year = 0;

        while (true) {
            int count = countIcebergs();

            if (count &amp;gt;= 2) {
                System.out.println(year);
                break;
            } else if (count == 0) {
                System.out.println(0);
                break;
            }

            meltIce();
            year++;

        }
    }

    private static int countIcebergs() {
        boolean[][] visited = new boolean[n][m];
        int count = 0;

        for (int i = 0; i &amp;lt; n; i++) {
            for (int j = 0; j &amp;lt; m; j++) {
                if (ice[i][j] &amp;gt; 0 &amp;amp;&amp;amp; !visited[i][j]) {
                    bfs(i, j, visited);
                    count++;
                }
            }
        }
        return count;
    }

    private static void bfs(int i, int j, boolean[][] visited) {
        Queue&amp;lt;int[]&amp;gt; q = new LinkedList&amp;lt;&amp;gt;();
        q.offer(new int[] { i, j });
        visited[i][j] = true;

        while (!q.isEmpty()) {
            int[] cur = q.poll();

            for (int f = 0; f &amp;lt; 4; f++) {
                int r = cur[0] + dr[f];
                int c = cur[1] + dc[f];

                if (r &amp;gt;= 0 &amp;amp;&amp;amp; r &amp;lt; n &amp;amp;&amp;amp; c &amp;gt;= 0 &amp;amp;&amp;amp; c &amp;lt; m &amp;amp;&amp;amp; !visited[r][c] &amp;amp;&amp;amp; ice[r][c] &amp;gt; 0) {
                    q.offer(new int[] { r, c });
                    visited[r][c] = true;
                }
            }

        }
    }

    private static void meltIce() {
        int[][] temp = new int[n][m];

        for (int i = 0; i &amp;lt; n; i++) {
            for (int j = 0; j &amp;lt; m; j++) {
                if (ice[i][j] &amp;gt; 0) {
                    int waterCount = 0;

                    for (int f = 0; f &amp;lt; 4; f++) {
                        int r = i + dr[f];
                        int c = j + dc[f];

                        if (r &amp;gt;= 0 &amp;amp;&amp;amp; r &amp;lt; n &amp;amp;&amp;amp; c &amp;gt;= 0 &amp;amp;&amp;amp; c &amp;lt; m &amp;amp;&amp;amp; ice[r][c] == 0) {
                            waterCount++;
                        }
                    }
                    temp[i][j] = Math.max(0, ice[i][j] - waterCount);
                }
            }
        }

        for (int i = 0; i &amp;lt; n; i++) {
            System.arraycopy(temp[i], 0, ice[i], 0, m);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;코테스터디 TIL&lt;/b&gt;&lt;/h4&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;size14&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-9%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.01.23 - [알고리즘/99클럽 코테스터디 5기] - 99클럽 코테 스터디 9일차 TIL (미들러)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1738212049169&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;99클럽 코테 스터디 9일차 TIL (미들러)&quot; data-og-description=&quot;문제: 백준 1707번 이분 그래프예제// Input23 21 32 34 41 22 33 44 2// OutputYESNO&amp;nbsp;&amp;nbsp;풀이방법문제를 읽어보니 이해가 되지 않아 ChatGPT에게 초등학생도 이해하기 쉽게 설명해 달라고 했다. GPT는 노드를 집, &quot; data-og-host=&quot;become-programmer.tistory.com&quot; data-og-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-9%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-9%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/migdF/hyX7T2fgzz/bl2wjXkfHH4AvR2ztqIkt0/img.png?width=800&amp;amp;height=440&amp;amp;face=0_0_800_440,https://scrap.kakaocdn.net/dn/bzscaB/hyX7078joH/yBDYlabehb9GkT14b6c6O0/img.png?width=800&amp;amp;height=440&amp;amp;face=0_0_800_440,https://scrap.kakaocdn.net/dn/cdIpLG/hyX7XKkw5M/fzqOg9cvQRtMP8NcCbZPf1/img.png?width=1466&amp;amp;height=807&amp;amp;face=0_0_1466_807&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-9%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-9%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/migdF/hyX7T2fgzz/bl2wjXkfHH4AvR2ztqIkt0/img.png?width=800&amp;amp;height=440&amp;amp;face=0_0_800_440,https://scrap.kakaocdn.net/dn/bzscaB/hyX7078joH/yBDYlabehb9GkT14b6c6O0/img.png?width=800&amp;amp;height=440&amp;amp;face=0_0_800_440,https://scrap.kakaocdn.net/dn/cdIpLG/hyX7XKkw5M/fzqOg9cvQRtMP8NcCbZPf1/img.png?width=1466&amp;amp;height=807&amp;amp;face=0_0_1466_807');&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;99클럽 코테 스터디 9일차 TIL (미들러)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제: 백준 1707번 이분 그래프예제// Input23 21 32 34 41 22 33 44 2// OutputYESNO&amp;nbsp;&amp;nbsp;풀이방법문제를 읽어보니 이해가 되지 않아 ChatGPT에게 초등학생도 이해하기 쉽게 설명해 달라고 했다. GPT는 노드를 집,&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;become-programmer.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-8%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.01.23 - [알고리즘/99클럽 코테스터디 5기] - 99클럽 코테 스터디 8일차 TIL (미들러)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1738212056109&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;99클럽 코테 스터디 8일차 TIL (미들러)&quot; data-og-description=&quot;문제: 백준 2667번 단지번호 붙이기&amp;nbsp;예제// Input70110100011010111101010000111010000001111100111000// Output3789&amp;nbsp;&amp;nbsp;풀이방법이 문제에서는 다른 알고리즘보다는 DFS가 문제를 풀기에 적합해보였다. DFS는 깊이를 우&quot; data-og-host=&quot;become-programmer.tistory.com&quot; data-og-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-8%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-8%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ez9i4m/hyX7VlslY5/xJ84uUkhXl1jRFPgzcrAjK/img.png?width=800&amp;amp;height=402&amp;amp;face=0_0_800_402,https://scrap.kakaocdn.net/dn/V474W/hyX7TOGiEc/So8phe48Kmx039LZJi6Ut0/img.png?width=800&amp;amp;height=402&amp;amp;face=0_0_800_402,https://scrap.kakaocdn.net/dn/bMyJYI/hyX7VyZwvg/0rPdbHxsbh64ghVDkBvS6k/img.png?width=1448&amp;amp;height=729&amp;amp;face=0_0_1448_729&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-8%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-8%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ez9i4m/hyX7VlslY5/xJ84uUkhXl1jRFPgzcrAjK/img.png?width=800&amp;amp;height=402&amp;amp;face=0_0_800_402,https://scrap.kakaocdn.net/dn/V474W/hyX7TOGiEc/So8phe48Kmx039LZJi6Ut0/img.png?width=800&amp;amp;height=402&amp;amp;face=0_0_800_402,https://scrap.kakaocdn.net/dn/bMyJYI/hyX7VyZwvg/0rPdbHxsbh64ghVDkBvS6k/img.png?width=1448&amp;amp;height=729&amp;amp;face=0_0_1448_729');&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;99클럽 코테 스터디 8일차 TIL (미들러)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제: 백준 2667번 단지번호 붙이기&amp;nbsp;예제// Input70110100011010111101010000111010000001111100111000// Output3789&amp;nbsp;&amp;nbsp;풀이방법이 문제에서는 다른 알고리즘보다는 DFS가 문제를 풀기에 적합해보였다. DFS는 깊이를 우&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;become-programmer.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/99클럽 코테스터디 5기</category>
      <category>99클럽</category>
      <category>99클럽코테스터디</category>
      <category>til</category>
      <category>백준 2573번</category>
      <category>백준 빙산</category>
      <category>코테스터디 10일차</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/340</guid>
      <comments>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-10%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC#entry340comment</comments>
      <pubDate>Thu, 30 Jan 2025 13:44:01 +0900</pubDate>
    </item>
    <item>
      <title>백준 32953번 회상</title>
      <link>https://become-programmer.tistory.com/entry/%EB%B0%B1%EC%A4%80-32953%EB%B2%88-%ED%9A%8C%EC%83%81</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1450&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhFtOj/btsL2AGFb3H/Q5xBgJIhsidkREzcKbZUNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhFtOj/btsL2AGFb3H/Q5xBgJIhsidkREzcKbZUNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhFtOj/btsL2AGFb3H/Q5xBgJIhsidkREzcKbZUNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhFtOj%2FbtsL2AGFb3H%2FQ5xBgJIhsidkREzcKbZUNk%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;1450&quot; height=&quot;720&quot; data-origin-width=&quot;1450&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;노교수의 수업을 들었던 학생들 중 M개 이상 들은 학생이 몇 명인지 알아내는 문제이다. 이 문제를 보자마자 Map 자료 구조가 떠올랐고 배열은 어려울 것 같다는 생각이 들었다. 배열로 구성하게 되면 학번의 숫자가 8개이기 때문에 자료 범위가 엄청 큰 배열을 생성해야 하는데, 그렇게 되면 성능이 좋지 못할 것이라 생각이 들었기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1737758334476&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String[] input = br.readLine().split(&quot; &quot;);
        int n = Integer.parseInt(input[0]);
        int m = Integer.parseInt(input[1]);

        Map&amp;lt;Integer, Integer&amp;gt; map = new HashMap&amp;lt;&amp;gt;();
        while(n-- &amp;gt; 0){
            int k = Integer.parseInt(br.readLine());
            
            StringTokenizer st = new StringTokenizer(br.readLine(), &quot; &quot;);
            for(int i = 0; i &amp;lt; k; i++){
                int num = Integer.parseInt(st.nextToken());
                map.put(num, map.getOrDefault(num, 0) + 1);
            }
        }

        int count = 0;
        for(int val: map.values()){
            if(val &amp;gt;= m) count++;
        }
        System.out.println(count);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;소스 코드는 비교적 간단하다. 입력 값을 각 변수에 저장하고 모든 수업을 들은 학생들 학번을 map의 Key로 저장한다. Value 값은 해당 학생이 다른 수업을 들을 경우에는 1씩 증가하도록 하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;while문이 종료된 후 map의 value가 주어진 m보다 크거나 같다면 count를 증가시키고 해당 값을 출력하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crU6ZE/btsL1rYr1gM/ND0bftNxwhr7bk0PBa8Syk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crU6ZE/btsL1rYr1gM/ND0bftNxwhr7bk0PBa8Syk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crU6ZE/btsL1rYr1gM/ND0bftNxwhr7bk0PBa8Syk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrU6ZE%2FbtsL1rYr1gM%2FND0bftNxwhr7bk0PBa8Syk%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;1001&quot; height=&quot;88&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/백준</category>
      <category>백준</category>
      <category>백준 32953번</category>
      <category>백준 회상</category>
      <category>자바 32953번</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/339</guid>
      <comments>https://become-programmer.tistory.com/entry/%EB%B0%B1%EC%A4%80-32953%EB%B2%88-%ED%9A%8C%EC%83%81#entry339comment</comments>
      <pubDate>Sat, 25 Jan 2025 07:42:57 +0900</pubDate>
    </item>
    <item>
      <title>99클럽 코테 스터디 9일차 TIL (미들러)</title>
      <link>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-9%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제: 백준 1707번 이분 그래프&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1466&quot; data-origin-height=&quot;807&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjueeS/btsLYE3SDme/8Ux9R3reMtzDjp9FKZQqzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjueeS/btsLYE3SDme/8Ux9R3reMtzDjp9FKZQqzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjueeS/btsLYE3SDme/8Ux9R3reMtzDjp9FKZQqzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjueeS%2FbtsLYE3SDme%2F8Ux9R3reMtzDjp9FKZQqzK%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;1466&quot; height=&quot;807&quot; data-origin-width=&quot;1466&quot; data-origin-height=&quot;807&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737612019047&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Input
2
3 2
1 3
2 3
4 4
1 2
2 3
3 4
4 2

// Output
YES
NO&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;문제를 읽어보니 이해가 되지 않아 ChatGPT에게 초등학생도 이해하기 쉽게 설명해 달라고 했다. GPT는 노드를 집, 엣지를 길에 비유하였고 연결된 집이 같은 색으로 칠해지지 않을 경우 이분 그래프라고 하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;예를 들자면&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- 1번 집(파란색), 2번 집(빨간색)이 순서대로 연결되었다면? 이분 그래프&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- 1번 집(파란색), 2번 집(빨간색), 3번집(파란색)이 순서대로 연결되었다면? 이분그래프&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- 1번 집(파란색), 2번 집(파란색), 3번집(빨간색)이 순서대로 연결되었다면? 이분그래프가 아님!&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;문제를 이해하고 나서 이 문제를 보니 최단 경로를 찾는 문제도 아니고 경로 탐색이 중요한 문제가 아니라서 DFS나 BFS 중 아무 알고리즘이나 가능할 것 같다는 생각이 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;코드를 작성하기 전에 n, v, e을 제외하고 어떤 변수가 있어야 할까 고민을 해봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- ArrayList&amp;lt;Integer&amp;gt;[]: 입력된 그래프 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- color[]: 방문 여부(-1이라면 미방문 상태를 나타나며 초기값으로 ) 및 색상 구분(0은 빨강, 1은 파랑)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- isBiPartite: 이분 그래프 여부(초기값 true)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;1. 입력 값 셋팅 및 초기값 설정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737612854217&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine()); // 테스트 케이스 수

while (t-- &amp;gt; 0) {
    String[] input = br.readLine().split(&quot; &quot;);
    int v = Integer.parseInt(input[0]); // 노드 수
    int e = Integer.parseInt(input[1]); // 간선 수

    // 그래프 초기화
    ArrayList&amp;lt;Integer&amp;gt;[] graph = new ArrayList[v + 1];
    for (int i = 1; i &amp;lt;= v; i++) {
        graph[i] = new ArrayList&amp;lt;&amp;gt;();
    }

    // 간선 입력
    for (int i = 0; i &amp;lt; e; i++) {
        String[] edge = br.readLine().split(&quot; &quot;);
        int u = Integer.parseInt(edge[0]);
        int vNode = Integer.parseInt(edge[1]);
        graph[u].add(vNode);
        graph[vNode].add(u);
    }

    // 색깔 배열 초기화 (-1: 미방문, 0: 빨강, 1: 파랑)
    int[] color = new int[v + 1];
    Arrays.fill(color, -1);
...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;입력 값 저장 및 그래프 초기화&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;테스트 케이스 값을 입력받고 그 수만큼 반복문을 실행한다. 반복문 내에서 노드와 간선 수를 입력받아 저장한 뒤, 그래프를 초기화한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;노드 값 그래프 저장&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;입력받은 간선을 그래프에 저장하는데, 양방향 연결이 되도록 앞 뒤 노드 값 모두에 연결된 노드 값을 add()한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;색깔 배열 초기화&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;방문 여부 및 이분 그래프 판별을 위한 배열을 초기화해준다. 초기값은 -1로 하여 미방문 상태를 나타내었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;2. 그래프 노드 탐색&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737613239248&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 이분 그래프 여부 판단 변수
boolean isBipartite = true;

// 모든 노드 탐색
for(int i = 1; i &amp;lt;= v; i++){
    if(color[i] == -1) {
        if(!search(i, nums, color)){
            isBipartite = false;
            break; // 이분 그래프 아니라면 종료
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323; text-align: start;&quot;&gt; isBipartite&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이분 그래프 여부를 판단하는 isBipartite 변수를 선언하고 초기값을 true로 설정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;모든 노드 탐색&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;연결되어 있지 않은 그래프도 포함하고 있기에 반복문을 사용해서 모든 노드를 탐색한다. 만약 해당 노드가 미방문 상태라면 search() 함수를 실행하는데, 해당 함수는 이분 그래프 여부를 판단하는 값을 리턴한다. 이 리턴 값이 false라면&amp;nbsp; isBipartite도 false로 설정하고 즉시 해당 반복문을 종료한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;3. search() 함수: DFS&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737613450099&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private static boolean search(int idx, ArrayList&amp;lt;Integer&amp;gt;[] nums, int[] color){
    Stack&amp;lt;Integer&amp;gt; stack = new Stack&amp;lt;&amp;gt;();
    stack.push(idx);
    color[idx] = 0;

    while(!stack.isEmpty()){
        int cur = stack.pop();

        for(int next:nums[cur]){
            if(color[next] == -1){
                color[next] = 1 - color[cur];
                stack.push(next);
            }else if(color[next] == color[cur]){
                return false;
            }
        }
    }
    return true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Stack&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;DFS로 구현하였기 때문에 Stack를 생성하여 초기값을 push 하였다. 그리고 해당 color 값은 0으로 지정하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;while문&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;stack에 들어있는 값을 꺼내주고 해당 노드와 연결되는 모든 노드를 탐색한다. 노드 중 방문하지 않은 노드가 있다면, color의 값을 현재 값과 다른 값으로 변경해 주고 stack에 push 해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이미 방문한 노드라면 현재 노드의 color와 연결된 노드의 color가 동일한지 확인한다. 만약 동일하다면 이분 그래프가 아니므로 false를 리턴한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;4. BFS로 구현할 경우&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737613676897&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private static boolean bfs(int start, ArrayList&amp;lt;Integer&amp;gt;[] graph, int[] color) {
    Queue&amp;lt;Integer&amp;gt; queue = new LinkedList&amp;lt;&amp;gt;();
    queue.offer(start);
    color[start] = 0; 

    while (!queue.isEmpty()) {
        int cur = queue.poll();

        for (int next : graph[cur]) {
            if (color[next] == -1) { 
                color[next] = 1 - color[cur]; 
                queue.offer(next);
            } else if (color[next] == color[cur]) {
                return false;
            }
        }
    }
    return true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;DFS랑 다른 부분은 queue로 구현했다는 점이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;전체 코드&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737613734962&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int t = Integer.parseInt(br.readLine());

        StringBuilder sb = new StringBuilder();

        while(t-- &amp;gt; 0){
            String[] input = br.readLine().split(&quot; &quot;);
            int v = Integer.parseInt(input[0]);
            int e = Integer.parseInt(input[1]);
            ArrayList&amp;lt;Integer&amp;gt;[] nums = new ArrayList[v+1];

            for(int i = 1; i &amp;lt;= v; i++){
                nums[i] = new ArrayList&amp;lt;&amp;gt;();
            }

            int[] color = new int[v + 1];
            Arrays.fill(color, -1);

            for(int i = 0; i &amp;lt; e; i++){
                String[] nodes = br.readLine().split(&quot; &quot;);
                int one = Integer.parseInt(nodes[0]);
                int two = Integer.parseInt(nodes[1]);

                nums[one].add(two);
                nums[two].add(one);
            }

            boolean isBipartite = true;

            for(int i = 1; i &amp;lt;= v; i++){
                if(color[i] == -1) {
                    if(!search(i, nums, color)){
                        isBipartite = false;
                        break;
                    }
                }
            }
            sb.append(isBipartite ? &quot;YES&quot;:&quot;NO&quot;).append(&quot;\n&quot;);
        }
        System.out.println(sb);
    }

    private static boolean search(int idx, ArrayList&amp;lt;Integer&amp;gt;[] nums, int[] color){
        Stack&amp;lt;Integer&amp;gt; stack = new Stack&amp;lt;&amp;gt;();
        stack.push(idx);
        color[idx] = 0;

        while(!stack.isEmpty()){
            int cur = stack.pop();

            for(int next:nums[cur]){
                if(color[next] == -1){
                    color[next] = 1 - color[cur];
                    stack.push(next);
                }else if(color[next] == color[cur]){
                    return false;
                }
            }
        }
        return true;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;코드를 짤 때 어려웠던 부분은 while문 내에서 조건문을 올바르게 작성하지 않아 이분 그래프를 판단하는 부분이 어려웠다. 그리고 연결된 노드의 색상을 어떻게 다르게 칠할 것인지에 대해 고민을 했다. 여러 도움으로 구분할 수 있는 방법을 알게 되었는데 color[next] = 1 - color[cur] 라는 코드가 너무 간단해 허탈하기도 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;나날이 어려운 문제를 풀이하면서 생각의 깊이가 달라지는 것 같고 사람이 가진 생각을 코드로 구현하는 것은 단순하지 않다는 걸 알게 되었다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;123&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GJhcZ/btsLW2ES82N/rPYCUdQKLBZUGTsanKxE8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GJhcZ/btsLW2ES82N/rPYCUdQKLBZUGTsanKxE8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GJhcZ/btsLW2ES82N/rPYCUdQKLBZUGTsanKxE8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGJhcZ%2FbtsLW2ES82N%2FrPYCUdQKLBZUGTsanKxE8k%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;1018&quot; height=&quot;123&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;123&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;코테스터디 TIL&lt;/b&gt;&lt;/h4&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;size14&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-8%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.01.23 - [알고리즘/99클럽 코테스터디 5기] - 99클럽 코테 스터디 8일차 TIL (미들러)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1737614144428&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;99클럽 코테 스터디 8일차 TIL (미들러)&quot; data-og-description=&quot;문제: 백준 2667번 단지번호 붙이기&amp;nbsp;예제// Input70110100011010111101010000111010000001111100111000// Output3789&amp;nbsp;&amp;nbsp;풀이방법이 문제에서는 다른 알고리즘보다는 DFS가 문제를 풀기에 적합해보였다. DFS는 깊이를 우&quot; data-og-host=&quot;become-programmer.tistory.com&quot; data-og-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-8%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-8%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/h1lsM/hyX4p8FIjs/tk5JxHmEUAAtHZkX2nC1Rk/img.png?width=800&amp;amp;height=402&amp;amp;face=0_0_800_402,https://scrap.kakaocdn.net/dn/byphQG/hyX4niIfTy/a6mlaNW1UkKIDbjfshUgR1/img.png?width=800&amp;amp;height=402&amp;amp;face=0_0_800_402,https://scrap.kakaocdn.net/dn/ct7cl5/hyX4xr7wLR/IoGTOxmeV58O1E82x4Hwt1/img.png?width=1448&amp;amp;height=729&amp;amp;face=0_0_1448_729&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-8%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-8%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/h1lsM/hyX4p8FIjs/tk5JxHmEUAAtHZkX2nC1Rk/img.png?width=800&amp;amp;height=402&amp;amp;face=0_0_800_402,https://scrap.kakaocdn.net/dn/byphQG/hyX4niIfTy/a6mlaNW1UkKIDbjfshUgR1/img.png?width=800&amp;amp;height=402&amp;amp;face=0_0_800_402,https://scrap.kakaocdn.net/dn/ct7cl5/hyX4xr7wLR/IoGTOxmeV58O1E82x4Hwt1/img.png?width=1448&amp;amp;height=729&amp;amp;face=0_0_1448_729');&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;99클럽 코테 스터디 8일차 TIL (미들러)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제: 백준 2667번 단지번호 붙이기&amp;nbsp;예제// Input70110100011010111101010000111010000001111100111000// Output3789&amp;nbsp;&amp;nbsp;풀이방법이 문제에서는 다른 알고리즘보다는 DFS가 문제를 풀기에 적합해보였다. DFS는 깊이를 우&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;become-programmer.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-7%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.01.21 - [알고리즘/99클럽 코테스터디 5기] - 99클럽 코테 스터디 7일차 TIL (미들러)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1737614146466&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;99클럽 코테 스터디 7일차 TIL (미들러)&quot; data-og-description=&quot;문제:&amp;nbsp;백준&amp;nbsp;1697번&amp;nbsp;숨박꼭질&amp;nbsp;&amp;nbsp;풀이 방법1. 이진 탐색(실패)2.&amp;nbsp;BFS&amp;nbsp;1. 이진탐색(실패)어떤&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;만&quot; data-og-host=&quot;become-programmer.tistory.com&quot; data-og-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-7%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-7%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bAn1n5/hyX4vAVPYL/Gpkv1YMqnkTAaWF10MrPs1/img.png?width=800&amp;amp;height=375&amp;amp;face=0_0_800_375,https://scrap.kakaocdn.net/dn/dtkoKk/hyX4uhKxTm/l3RdArzPgIXp6VeRnNFRoK/img.png?width=800&amp;amp;height=375&amp;amp;face=0_0_800_375,https://scrap.kakaocdn.net/dn/HQ4C4/hyX4yYLMKM/kinihlFKc26jRS0cb8Vrz1/img.png?width=1443&amp;amp;height=678&amp;amp;face=0_0_1443_678&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-7%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-7%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bAn1n5/hyX4vAVPYL/Gpkv1YMqnkTAaWF10MrPs1/img.png?width=800&amp;amp;height=375&amp;amp;face=0_0_800_375,https://scrap.kakaocdn.net/dn/dtkoKk/hyX4uhKxTm/l3RdArzPgIXp6VeRnNFRoK/img.png?width=800&amp;amp;height=375&amp;amp;face=0_0_800_375,https://scrap.kakaocdn.net/dn/HQ4C4/hyX4yYLMKM/kinihlFKc26jRS0cb8Vrz1/img.png?width=1443&amp;amp;height=678&amp;amp;face=0_0_1443_678');&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;99클럽 코테 스터디 7일차 TIL (미들러)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제:&amp;nbsp;백준&amp;nbsp;1697번&amp;nbsp;숨박꼭질&amp;nbsp;&amp;nbsp;풀이 방법1. 이진 탐색(실패)2.&amp;nbsp;BFS&amp;nbsp;1. 이진탐색(실패)어떤&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;만&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;become-programmer.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>알고리즘/99클럽 코테스터디 5기</category>
      <category>99클럽</category>
      <category>99클럽코테스터디</category>
      <category>til</category>
      <category>백준 1707번</category>
      <category>백준 이분 그래프</category>
      <category>코테스터디 9일차</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/338</guid>
      <comments>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-9%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC#entry338comment</comments>
      <pubDate>Thu, 23 Jan 2025 15:38:27 +0900</pubDate>
    </item>
    <item>
      <title>React란?</title>
      <link>https://become-programmer.tistory.com/entry/React%EB%9E%80</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;1068&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ce75Ck/btsLW5Vvx9n/XSO5ddKbORHkdHq0YiTOEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ce75Ck/btsLW5Vvx9n/XSO5ddKbORHkdHq0YiTOEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ce75Ck/btsLW5Vvx9n/XSO5ddKbORHkdHq0YiTOEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fce75Ck%2FbtsLW5Vvx9n%2FXSO5ddKbORHkdHq0YiTOEK%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;257&quot; height=&quot;229&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;1068&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;br /&gt;React가 무엇인가?&lt;/b&gt;&lt;/h4&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;size14&quot;&gt;&lt;b&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;사용자 인터페이스를 만들기 위한&lt;/span&gt;&lt;span&gt; Javascript &lt;/span&gt;&lt;span&gt;라이브러리&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;프레임워크는 개발을 위한 기본 틀 및 뼈대 라면&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;라이브러리란 개발에 필요한 도구 또한 그 집합을 의미한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;- SPA(Single Page Application)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;클라이언트&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;브라우저&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;에서 화면을 그리는 방식으로&lt;/span&gt;&lt;span&gt; JavaScript&lt;/span&gt;&lt;span&gt;를 통해&lt;/span&gt;&lt;span&gt; HTMl &lt;/span&gt;&lt;span&gt;작성한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;React &lt;/span&gt;&lt;span&gt;외에&lt;/span&gt;&lt;span&gt; Vue, Angular &lt;/span&gt;&lt;span&gt;등이 존재한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;왜 배워야 하는가?&lt;/b&gt;&lt;/h4&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;size14&quot;&gt;&lt;b&gt;&lt;span&gt;1. &lt;/span&gt;&lt;span&gt;트렌드&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;수요가 많고 방대한 생태계를 가지고 있다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span&gt;2. &lt;/span&gt;&lt;span&gt;편리함&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;유용한 라이브러리가 많이 존재한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;- SPA: &lt;/span&gt;&lt;span&gt;싱글 페이지 어플리케이션으로 서버에 부하가 적다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;화면을 여러 단위로 쪼개고&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;재사용하는 식으로 코드 관리가 용이하다는 장점을 가진다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;React 특징&lt;/b&gt;&lt;/h4&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;size14&quot;&gt;&lt;b&gt;&lt;span&gt;1. &lt;/span&gt;&lt;span&gt;컴포넌트 기반 설계&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;스스로 상태를 관리하는 캡슐화된 코드 조각으로 의미단위로 컴포넌트를 구성하는 것이다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;span&gt;이 방법은 재사용성과 유지보수성이 좋다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;컴포넌트는 부모&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;자식 관계를 가진다는 특징을 갖고 있다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span&gt;2. Virtual DOM(&lt;/span&gt;&lt;span&gt;가상돔&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;실제&lt;/span&gt;&lt;span&gt; DOM&lt;/span&gt;&lt;span&gt;의 복사본으로&lt;/span&gt;&lt;span&gt; SPA&lt;/span&gt;&lt;span&gt;에서의 동적인 변화를 효율적으로 관리하기 위해 사용한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;- DOM&lt;/span&gt;&lt;span&gt;을 직접 변경하여 발생하는 비효율을 해결할 수 있다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;3. CSR(Client Side Rendering)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;- SPA &lt;/span&gt;&lt;span&gt;방식이기에 자바스트립트를 통해 서버가 아닌 클라이언트 브라우저에서 화면을 렌더링 하게 된다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span&gt;4. &lt;/span&gt;&lt;span&gt;풍부한 생태계&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;단순 웹 개발뿐만 아니라&lt;/span&gt;&lt;span&gt; React Native&lt;/span&gt;&lt;span&gt;와 같은 앱 개발을 위한 라이브러리도 존재한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;</description>
      <category>React</category>
      <category>react</category>
      <category>react기초</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/337</guid>
      <comments>https://become-programmer.tistory.com/entry/React%EB%9E%80#entry337comment</comments>
      <pubDate>Thu, 23 Jan 2025 13:32:30 +0900</pubDate>
    </item>
    <item>
      <title>99클럽 코테 스터디 8일차 TIL (미들러)</title>
      <link>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-8%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제: 백준 2667번 단지번호 붙이기&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;729&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bC4cuO/btsLWSBLh7Y/bUu0Dchb3eLueNQd8xSO60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bC4cuO/btsLWSBLh7Y/bUu0Dchb3eLueNQd8xSO60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bC4cuO/btsLWSBLh7Y/bUu0Dchb3eLueNQd8xSO60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbC4cuO%2FbtsLWSBLh7Y%2FbUu0Dchb3eLueNQd8xSO60%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;1448&quot; height=&quot;729&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;729&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737589808194&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Input
7
0110100
0110101
1110101
0000111
0100000
0111110
0111000

// Output
3
7
8
9&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이 문제에서는 다른 알고리즘보다는 DFS가 문제를 풀기에 적합해보였다. DFS는 깊이를 우선으로 탐색하며, 한 경로를 끝까지 진행한 뒤 다시 돌아가서 다른 경로를 탐색하기 때문에 연결된 모든 집의 개수를 구할 수 있다고 생각했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;1. 첫번째 시도(실패)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;2. 두번째 시도(성공)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;1. 첫번째 시도(실패)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737590175216&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package codingstudy.day8;

import java.io.BufferedReader;
public class Main {
    static int[][] map;
    static boolean[][] visited;
    static List&amp;lt;Integer&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();
    
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());

        map = new int[n][n];

        for(int i = 0; i &amp;lt; n; i++){
            String s = br.readLine();
            for(int j = 0; j &amp;lt; n; j++){
                map[i][j] = s.charAt(j) - '0';
            }
        }

        StringBuilder sb = new StringBuilder();

        visited = new boolean[n][n];
        int[] dr = {-1, +1, 0, 0};
        int[] dc = {0, 0, -1, +1};


        for(int i = 0; i &amp;lt; n; i++){
            for(int j = 0; j &amp;lt; n; j++){
                if(!visited[i][j])dfs(i, j, n, dr, dc);
            }
        }

        Collections.sort(list);
        sb.append(list.size()).append(&quot;\n&quot;);
        for(int i : list){
            sb.append(i).append(&quot;\n&quot;);
        }
        System.out.println(sb);
        
    }

    private static void dfs(int row, int col, int n, int[] dr, int[] dc){
        Stack&amp;lt;int[]&amp;gt; stack = new Stack&amp;lt;&amp;gt;();

        stack.push(new int[]{row,col});
        visited[row][col] = true;
        int count = 0;

        while(!stack.isEmpty()){
            int[] cur = stack.pop();
            int first = cur[0];
            int second = cur[1];
            for(int i = 0; i &amp;lt; 4; i++){
                int f = first + dr[i];
                int s = second + dc[i];
                if(f &amp;gt;= 0 &amp;amp;&amp;amp; f &amp;lt; n &amp;amp;&amp;amp; s &amp;gt;= 0 &amp;amp;&amp;amp; s &amp;lt; n &amp;amp;&amp;amp; map[f][s] == 1 &amp;amp;&amp;amp; !visited[f][s]){
                    count++;
                    stack.push(new int[]{f, s});
                    visited[f][s] = true;
                }
            }
        }
        
        if(count != 0) list.add(count);

    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;모든 수를 map[][] 배열에 저장하고 4방향(위, 아래, 좌, 우)를 탐색하기 위하여 dr, dc 배열을 만들었다.&amp;nbsp; 반복문을 활용하여 모든 경우를 다 탐색하기로 하였고 DFS를 구현하기 위해 Stack를 사용하였다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;Stack이 비어 있을 때까지 탐색을 이어나가고 한 단지를 다 탐색했다면, count 값을 List에 저장하도록 하였다. 반복문이 종료되면 List를 오름차순으로 정렬하고 List의 사이즈 값과 단지마다 집의 개수를 출력하도록 했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;예제 Output과 동일한 값이 출력되길래 제대로 코드를 구현한 줄 알았지만, 실패했다는 메세지가 떴다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;2. 두번째 시도(성공)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;위의 코드가 실패한 원인이 뭔지 찾아보았다. 문제는 두 가지였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;- 반복문으로 모든 경우의 수를 탐색할 때 해당 배열의 값이 1인지 확인하지 않는 것&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737590979845&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for(int i = 0; i &amp;lt; n; i++){
    for(int j = 0; j &amp;lt; n; j++){
        if(!visited[i][j] &amp;amp;&amp;amp; map[i][j] == 1)dfs(i, j, n, dr, dc);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;모든 경우의 수를 탐색할 때는 방문 여부 뿐만 아니라 해당 위치의 값이 1(집)인지 아닌지 확인 후 DFS() 메서드를 호출해야 했었다. 하지만 위의 코드에서는 오직 방문 여부만 판단하고 DFS()를 호출했기 떄문에 오류가 발생했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;- 스택에서 시작노드의 개수를 count에 포함시키지 않은 것&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737591007203&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private static void dfs(int row, int col, int n, int[] dr, int[] dc){
    Stack&amp;lt;int[]&amp;gt; stack = new Stack&amp;lt;&amp;gt;();

    stack.push(new int[]{row,col});
    visited[row][col] = true;
    int count = 1;

    while(!stack.isEmpty()){
        int[] cur = stack.pop();
        int first = cur[0];
        int second = cur[1];
        for(int i = 0; i &amp;lt; 4; i++){
            int f = first + dr[i];
            int s = second + dc[i];
            if(f &amp;gt;= 0 &amp;amp;&amp;amp; f &amp;lt; n &amp;amp;&amp;amp; s &amp;gt;= 0 &amp;amp;&amp;amp; s &amp;lt; n &amp;amp;&amp;amp; map[f][s] == 1 &amp;amp;&amp;amp; !visited[f][s]){
                count++;
                stack.push(new int[]{f, s});
                visited[f][s] = true;
            }
        }
    }
    if(count &amp;gt; 0) list.add(count);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;Stack를 생성하고 시작노드를 제외하고 이웃노드만 count를 하였다. 이렇게 되면 다른 테스트 코드에서 집의 개수가 잘못 출력되었을 것이다. 이에 따라 count의 초기값을 1로 설정하여 시작노드를 포함하도록 하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;전체코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737591245277&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Main {
    static int[][] map;
    static boolean[][] visited;
    static List&amp;lt;Integer&amp;gt; list = new ArrayList&amp;lt;&amp;gt;();
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());

        map = new int[n][n];

        for(int i = 0; i &amp;lt; n; i++){
            String s = br.readLine();
            for(int j = 0; j &amp;lt; n; j++){
                map[i][j] = s.charAt(j) - '0';
            }
        }

        StringBuilder sb = new StringBuilder();

        visited = new boolean[n][n];
        int[] dr = {-1, +1, 0, 0};
        int[] dc = {0, 0, -1, +1};


        for(int i = 0; i &amp;lt; n; i++){
            for(int j = 0; j &amp;lt; n; j++){
                if(!visited[i][j] &amp;amp;&amp;amp; map[i][j] == 1)dfs(i, j, n, dr, dc);
            }
        }

        Collections.sort(list);
        sb.append(list.size()).append(&quot;\n&quot;);
        for(int i : list){
            sb.append(i).append(&quot;\n&quot;);
        }
        System.out.println(sb);
        
    }

    private static void dfs(int row, int col, int n, int[] dr, int[] dc){
        Stack&amp;lt;int[]&amp;gt; stack = new Stack&amp;lt;&amp;gt;();

        stack.push(new int[]{row,col});
        visited[row][col] = true;
        int count = 1;

        while(!stack.isEmpty()){
            int[] cur = stack.pop();
            int first = cur[0];
            int second = cur[1];
            for(int i = 0; i &amp;lt; 4; i++){
                int f = first + dr[i];
                int s = second + dc[i];
                if(f &amp;gt;= 0 &amp;amp;&amp;amp; f &amp;lt; n &amp;amp;&amp;amp; s &amp;gt;= 0 &amp;amp;&amp;amp; s &amp;lt; n &amp;amp;&amp;amp; map[f][s] == 1 &amp;amp;&amp;amp; !visited[f][s]){
                    count++;
                    stack.push(new int[]{f, s});
                    visited[f][s] = true;
                }
            }
        }
        
        if(count &amp;gt; 0) list.add(count);

    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1025&quot; data-origin-height=&quot;131&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TLaPf/btsLWOTBzgc/dZI5yEm9F7z9eZlKEkWFX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TLaPf/btsLWOTBzgc/dZI5yEm9F7z9eZlKEkWFX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TLaPf/btsLWOTBzgc/dZI5yEm9F7z9eZlKEkWFX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTLaPf%2FbtsLWOTBzgc%2FdZI5yEm9F7z9eZlKEkWFX1%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;1025&quot; height=&quot;131&quot; data-origin-width=&quot;1025&quot; data-origin-height=&quot;131&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;문제의 조건을 꼼꼼히 분석하고 정리하는 습관이 필요할 것 같다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;코테스터디 TIL&lt;/h4&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;size14&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-7%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.01.21 - [알고리즘/99클럽 코테스터디 5기] - 99클럽 코테 스터디 7일차 TIL (미들러)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1737591606906&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;99클럽 코테 스터디 7일차 TIL (미들러)&quot; data-og-description=&quot;문제:&amp;nbsp;백준&amp;nbsp;1697번&amp;nbsp;숨박꼭질&amp;nbsp;&amp;nbsp;풀이 방법1. 이진 탐색(실패)2.&amp;nbsp;BFS&amp;nbsp;1. 이진탐색(실패)어떤&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;만&quot; data-og-host=&quot;become-programmer.tistory.com&quot; data-og-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-7%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-7%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bAn1n5/hyX4vAVPYL/Gpkv1YMqnkTAaWF10MrPs1/img.png?width=800&amp;amp;height=375&amp;amp;face=0_0_800_375,https://scrap.kakaocdn.net/dn/dtkoKk/hyX4uhKxTm/l3RdArzPgIXp6VeRnNFRoK/img.png?width=800&amp;amp;height=375&amp;amp;face=0_0_800_375,https://scrap.kakaocdn.net/dn/HQ4C4/hyX4yYLMKM/kinihlFKc26jRS0cb8Vrz1/img.png?width=1443&amp;amp;height=678&amp;amp;face=0_0_1443_678&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-7%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-7%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bAn1n5/hyX4vAVPYL/Gpkv1YMqnkTAaWF10MrPs1/img.png?width=800&amp;amp;height=375&amp;amp;face=0_0_800_375,https://scrap.kakaocdn.net/dn/dtkoKk/hyX4uhKxTm/l3RdArzPgIXp6VeRnNFRoK/img.png?width=800&amp;amp;height=375&amp;amp;face=0_0_800_375,https://scrap.kakaocdn.net/dn/HQ4C4/hyX4yYLMKM/kinihlFKc26jRS0cb8Vrz1/img.png?width=1443&amp;amp;height=678&amp;amp;face=0_0_1443_678');&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;99클럽 코테 스터디 7일차 TIL (미들러)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제:&amp;nbsp;백준&amp;nbsp;1697번&amp;nbsp;숨박꼭질&amp;nbsp;&amp;nbsp;풀이 방법1. 이진 탐색(실패)2.&amp;nbsp;BFS&amp;nbsp;1. 이진탐색(실패)어떤&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;만&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;become-programmer.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.01.20 - [알고리즘/99클럽 코테스터디 5기] - 99클럽 코테 스터디 6일차 TIL (미들러)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1737591612745&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;99클럽 코테 스터디 6일차 TIL (미들러)&quot; data-og-description=&quot;문제: 백준 1260번 DFS와 BFS예제// Input5 5 35 45 21 23 43 1// Output3 1 2 5 43 1 4 2 5&amp;nbsp;&amp;nbsp;풀이 방법DFS, BFS를 구현할 줄 알면 어려운 문제는 아니다.문제 풀이할 때 주의할 점이라고 하면, 방문할 수 있는 정점이&quot; data-og-host=&quot;become-programmer.tistory.com&quot; data-og-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cKaAiA/hyX4rFkrRd/E3C4zusJwroJidYd4cgTh0/img.png?width=800&amp;amp;height=460&amp;amp;face=0_0_800_460,https://scrap.kakaocdn.net/dn/p8wor/hyX4m44Gj4/4rEhU8PuLAJirXZUo8mj50/img.png?width=800&amp;amp;height=460&amp;amp;face=0_0_800_460,https://scrap.kakaocdn.net/dn/Wqq6P/hyX4uhKxWd/qGXZdFm3aPpk8TUsNPoVs1/img.png?width=1153&amp;amp;height=664&amp;amp;face=0_0_1153_664&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cKaAiA/hyX4rFkrRd/E3C4zusJwroJidYd4cgTh0/img.png?width=800&amp;amp;height=460&amp;amp;face=0_0_800_460,https://scrap.kakaocdn.net/dn/p8wor/hyX4m44Gj4/4rEhU8PuLAJirXZUo8mj50/img.png?width=800&amp;amp;height=460&amp;amp;face=0_0_800_460,https://scrap.kakaocdn.net/dn/Wqq6P/hyX4uhKxWd/qGXZdFm3aPpk8TUsNPoVs1/img.png?width=1153&amp;amp;height=664&amp;amp;face=0_0_1153_664');&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;99클럽 코테 스터디 6일차 TIL (미들러)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제: 백준 1260번 DFS와 BFS예제// Input5 5 35 45 21 23 43 1// Output3 1 2 5 43 1 4 2 5&amp;nbsp;&amp;nbsp;풀이 방법DFS, BFS를 구현할 줄 알면 어려운 문제는 아니다.문제 풀이할 때 주의할 점이라고 하면, 방문할 수 있는 정점이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;become-programmer.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>알고리즘/99클럽 코테스터디 5기</category>
      <category>99클럽</category>
      <category>99클럽코테스터디</category>
      <category>til</category>
      <category>백준 2667번</category>
      <category>백준 단지 붙이기</category>
      <category>코테스터디 8일차</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/336</guid>
      <comments>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-8%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC#entry336comment</comments>
      <pubDate>Thu, 23 Jan 2025 09:22:03 +0900</pubDate>
    </item>
    <item>
      <title>99클럽 코테 스터디 7일차 TIL (미들러)</title>
      <link>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-7%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제:&amp;nbsp;백준&amp;nbsp;1697번&amp;nbsp;숨박꼭질&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-01-21 162230.png&quot; data-origin-width=&quot;1443&quot; data-origin-height=&quot;678&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Aqxn3/btsLVlDD59b/1jwvxMwGK7fkEDVTYfkpkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Aqxn3/btsLVlDD59b/1jwvxMwGK7fkEDVTYfkpkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Aqxn3/btsLVlDD59b/1jwvxMwGK7fkEDVTYfkpkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAqxn3%2FbtsLVlDD59b%2F1jwvxMwGK7fkEDVTYfkpkk%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;1443&quot; height=&quot;678&quot; data-filename=&quot;스크린샷 2025-01-21 162230.png&quot; data-origin-width=&quot;1443&quot; data-origin-height=&quot;678&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;1. 이진 탐색(실패)&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;2.&amp;nbsp;BFS&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;1. 이진탐색(실패)&lt;/span&gt;&lt;br /&gt;어떤&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;경로가&amp;nbsp;총&amp;nbsp;세가지(&amp;nbsp;+1,&amp;nbsp;-1,&amp;nbsp;*2)경우이기&amp;nbsp;때문에&amp;nbsp;이동&amp;nbsp;시간을&amp;nbsp;계산하기&amp;nbsp;어렵기&amp;nbsp;때문이다. &lt;br /&gt;&lt;br /&gt;즉, 이진 탐색은 특정 시간인 mid 값 내에서 n -&amp;gt; k 에서 갈 수 있는지 판단해야 하는데 이렇게 되면 결국 모든 이동 경로를 탐색해야 하는 상황이 된다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;2. BFS&lt;/span&gt;&lt;br /&gt;이 문제는 수빈이가 동생을 찾을 수 있는 가장 빠른 시간을 구해야 한다. 즉, 빠른 경로를 찾아나서는 것이다. 모든 경로를 탐색하여 가장 빠르게 도달할 수 있는 시간을 구해야 하기 때문에 BFS 알고리즘으로 구현하기로 하였다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;BFS&amp;nbsp;알고리즘은&amp;nbsp;큐로&amp;nbsp;구현하는데&amp;nbsp;이러한&amp;nbsp;이유는&amp;nbsp;BFS&amp;nbsp;동작&amp;nbsp;원리와&amp;nbsp;큐의&amp;nbsp;자료&amp;nbsp;구조&amp;nbsp;특성이&amp;nbsp;맞기&amp;nbsp;때문이다.&amp;nbsp;무슨&amp;nbsp;말이냐면&amp;nbsp;BFS는&amp;nbsp;같은&amp;nbsp;depth의&amp;nbsp;노드들을&amp;nbsp;모두&amp;nbsp;탐색한&amp;nbsp;후&amp;nbsp;그&amp;nbsp;다음&amp;nbsp;depth의&amp;nbsp;노드들을&amp;nbsp;탐색한다.&amp;nbsp;큐의&amp;nbsp;경우&amp;nbsp;FIFO&amp;nbsp;특성으로&amp;nbsp;우선&amp;nbsp;삽입된&amp;nbsp;노드를&amp;nbsp;먼저&amp;nbsp;탐색하여&amp;nbsp;순서대로&amp;nbsp;노드를&amp;nbsp;처리한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이와 같이 BFS 탐색 방식과 큐의 탐색 방식(먼저 들어오는 노드대로 처리하기)이 동일하기 때문에 큐로 알고리즘을 구현하기로 하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1737445896525&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private static int bfs(int start, int target){
    int[] visited = new int[100001];
    Arrays.fill(visited, -1);

    Queue&amp;lt;Integer&amp;gt; q = new LinkedList&amp;lt;&amp;gt;();
    q.offer(start);
    visited[start] = 0;

    while(!q.isEmpty()){
        int cur = q.poll();

        if(cur == target){
            return visited[cur];
        }

        for(int next: new int[]{cur - 1, cur + 1, cur * 2}){
            if(next &amp;gt;= 0 &amp;amp;&amp;amp; next &amp;lt;= 100000 &amp;amp;&amp;amp; visited[next] == -1){
                visited[next] = visited[cur] + 1;
                q.offer(next);
            }
        }
    }
    return -1;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;int[] visited&lt;/span&gt;&lt;br /&gt;해당 배열은 이동 시간을 저장하여 방문 여부를 확인하기 위해서다. 초기값을 -1로 준 이유는 아직 해당 노드에 방문하지 않았음을 나타내기 위함이다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Queue&amp;lt;Integer&amp;gt; q = new LinkedList&amp;lt;&amp;gt;()&lt;/span&gt;&lt;br /&gt;방문할 노드를 Queue에 저장한다. 수빈이의 위치는 시작 값으로써 Queue에 넣어놓는다. 그리고 visited[start] 값을 0으로 설정함으로써 시작 노드의 이동 시간(0초)을 저장한다. &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;while문&lt;/span&gt;&lt;br /&gt;Queue에서&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;visited[cur]&amp;nbsp;값을&amp;nbsp;출력한다.&amp;nbsp;그렇지&amp;nbsp;않다면,&amp;nbsp;for문을&amp;nbsp;실행한다. &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;for(int next: new int[]{cur - 1, cur + 1, cur * 2})&lt;/span&gt;&lt;br /&gt;for문에서는 세가지 이동경로(+1, -1, *2)를 반복한다. 반복문 내에서는 해당 위치가 경로를 벗어나지 않고 방문하지 않았다면 visited[(cur-1 || cur+1 || cur *2)] 값을 현재 cur 이동 시간 + 1초를 더해주고 큐에 삽입한다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;return -1&lt;/span&gt;&lt;br /&gt;문제에서는&amp;nbsp;항상&amp;nbsp;목적지에&amp;nbsp;도달할&amp;nbsp;수&amp;nbsp;있기&amp;nbsp;때문에&amp;nbsp;-1이&amp;nbsp;출력되는&amp;nbsp;상황은&amp;nbsp;없지만,&amp;nbsp;어떤&amp;nbsp;값이든&amp;nbsp;리턴해야&amp;nbsp;하는&amp;nbsp;함수&amp;nbsp;특성상&amp;nbsp;-1를&amp;nbsp;리턴하도록&amp;nbsp;하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;전체 코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737445920708&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 br = new BufferedReader(new InputStreamReader(System.in));

        String[] s = br.readLine().split(&quot; &quot;);
        int n = Integer.parseInt(s[0]);
        int k = Integer.parseInt(s[1]);

        System.out.println(bfs(n, k));
    }

    private static int bfs(int start, int target){
        int[] visited = new int[100001];
        Arrays.fill(visited, -1);

        Queue&amp;lt;Integer&amp;gt; q = new LinkedList&amp;lt;&amp;gt;();
        q.offer(start);
        visited[start] = 0;

        while(!q.isEmpty()){
            int cur = q.poll();

            if(cur == target){
                return visited[cur];
            }

            for(int next: new int[]{cur - 1, cur + 1, cur * 2}){
                if(next &amp;gt;= 0 &amp;amp;&amp;amp; next &amp;lt;= 100000 &amp;amp;&amp;amp; visited[next] == -1){
                    visited[next] = visited[cur] + 1;
                    q.offer(next);
                }
            }
        }
        return -1;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1011&quot; data-origin-height=&quot;82&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pdiam/btsLT17saVA/7FAsmqdZTdelHzzbZZC4kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pdiam/btsLT17saVA/7FAsmqdZTdelHzzbZZC4kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pdiam/btsLT17saVA/7FAsmqdZTdelHzzbZZC4kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpdiam%2FbtsLT17saVA%2F7FAsmqdZTdelHzzbZZC4kk%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;1011&quot; height=&quot;82&quot; data-origin-width=&quot;1011&quot; data-origin-height=&quot;82&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;코테스터디 TIL&lt;/b&gt;&lt;/h4&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;size14&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.01.20 - [알고리즘/99클럽 코테스터디 5기] - 99클럽 코테 스터디 6일차 TIL (미들러)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1737445973964&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;99클럽 코테 스터디 6일차 TIL (미들러)&quot; data-og-description=&quot;문제: 백준 1260번 DFS와 BFS예제// Input5 5 35 45 21 23 43 1// Output3 1 2 5 43 1 4 2 5&amp;nbsp;&amp;nbsp;풀이 방법DFS, BFS를 구현할 줄 알면 어려운 문제는 아니다.문제 풀이할 때 주의할 점이라고 하면, 방문할 수 있는 정점이&quot; data-og-host=&quot;become-programmer.tistory.com&quot; data-og-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/rNgN3/hyX4xSAuZT/uqdkutceLgKN7zcK1YL4hk/img.png?width=800&amp;amp;height=460&amp;amp;face=0_0_800_460,https://scrap.kakaocdn.net/dn/uQzUB/hyX4w0uzAn/6PmdiaWM4WuIv0TBvQQ9Ik/img.png?width=800&amp;amp;height=460&amp;amp;face=0_0_800_460,https://scrap.kakaocdn.net/dn/GTbh2/hyX4mp1PaV/0yLvZG3sHhvPpcRZZq19HK/img.png?width=1153&amp;amp;height=664&amp;amp;face=0_0_1153_664&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/rNgN3/hyX4xSAuZT/uqdkutceLgKN7zcK1YL4hk/img.png?width=800&amp;amp;height=460&amp;amp;face=0_0_800_460,https://scrap.kakaocdn.net/dn/uQzUB/hyX4w0uzAn/6PmdiaWM4WuIv0TBvQQ9Ik/img.png?width=800&amp;amp;height=460&amp;amp;face=0_0_800_460,https://scrap.kakaocdn.net/dn/GTbh2/hyX4mp1PaV/0yLvZG3sHhvPpcRZZq19HK/img.png?width=1153&amp;amp;height=664&amp;amp;face=0_0_1153_664');&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;99클럽 코테 스터디 6일차 TIL (미들러)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제: 백준 1260번 DFS와 BFS예제// Input5 5 35 45 21 23 43 1// Output3 1 2 5 43 1 4 2 5&amp;nbsp;&amp;nbsp;풀이 방법DFS, BFS를 구현할 줄 알면 어려운 문제는 아니다.문제 풀이할 때 주의할 점이라고 하면, 방문할 수 있는 정점이&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;become-programmer.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-5%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.01.18 - [알고리즘/99클럽 코테스터디 5기] - 99클럽 코테 스터디 5일차 TIL (미들러)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1737445981134&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;99클럽 코테 스터디 5일차 TIL (미들러)&quot; data-og-description=&quot;문제: 백준 2470번 두 용액예제// Input5-2 4 -99 -1 98// Output-99 98&amp;nbsp;&amp;nbsp;풀이 방법입력되는 수의 범위가 크고, 시간제한이 있어 완전 탐색을 하게 되면 비효율적이다. 여기서는 음수와 양수의 합이 0에 가&quot; data-og-host=&quot;become-programmer.tistory.com&quot; data-og-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-5%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-5%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/vLvlR/hyX4vtJJnF/5Am0Zc8lYaiC2rs86Y40R1/img.png?width=800&amp;amp;height=482&amp;amp;face=0_0_800_482,https://scrap.kakaocdn.net/dn/bNUnlr/hyX4uuQyUt/D3ZubDGxA7qvIBhIUwsoUk/img.png?width=800&amp;amp;height=482&amp;amp;face=0_0_800_482,https://scrap.kakaocdn.net/dn/dMasbf/hyX4un3KFV/Xa6RKW1oOv0lmVUfwncOM0/img.png?width=2345&amp;amp;height=1414&amp;amp;face=0_0_2345_1414&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-5%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-5%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/vLvlR/hyX4vtJJnF/5Am0Zc8lYaiC2rs86Y40R1/img.png?width=800&amp;amp;height=482&amp;amp;face=0_0_800_482,https://scrap.kakaocdn.net/dn/bNUnlr/hyX4uuQyUt/D3ZubDGxA7qvIBhIUwsoUk/img.png?width=800&amp;amp;height=482&amp;amp;face=0_0_800_482,https://scrap.kakaocdn.net/dn/dMasbf/hyX4un3KFV/Xa6RKW1oOv0lmVUfwncOM0/img.png?width=2345&amp;amp;height=1414&amp;amp;face=0_0_2345_1414');&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;99클럽 코테 스터디 5일차 TIL (미들러)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제: 백준 2470번 두 용액예제// Input5-2 4 -99 -1 98// Output-99 98&amp;nbsp;&amp;nbsp;풀이 방법입력되는 수의 범위가 크고, 시간제한이 있어 완전 탐색을 하게 되면 비효율적이다. 여기서는 음수와 양수의 합이 0에 가&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;become-programmer.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>알고리즘/99클럽 코테스터디 5기</category>
      <category>99클럽</category>
      <category>99클럽코테스터디</category>
      <category>til</category>
      <category>백준 1697번</category>
      <category>백준 숨박꼭질</category>
      <category>코테스터디 7일차</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/335</guid>
      <comments>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-7%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC#entry335comment</comments>
      <pubDate>Tue, 21 Jan 2025 16:55:42 +0900</pubDate>
    </item>
    <item>
      <title>99클럽 코테 스터디 6일차 TIL (미들러)</title>
      <link>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제: 백준 1260번 DFS와 BFS&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-01-20 오후 9.27.21.png&quot; data-origin-width=&quot;1153&quot; data-origin-height=&quot;664&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/doIsgc/btsLS3jwM9G/OEkSwcLMbFa958B4mQv7f1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/doIsgc/btsLS3jwM9G/OEkSwcLMbFa958B4mQv7f1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/doIsgc/btsLS3jwM9G/OEkSwcLMbFa958B4mQv7f1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdoIsgc%2FbtsLS3jwM9G%2FOEkSwcLMbFa958B4mQv7f1%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;1153&quot; height=&quot;664&quot; data-filename=&quot;스크린샷 2025-01-20 오후 9.27.21.png&quot; data-origin-width=&quot;1153&quot; data-origin-height=&quot;664&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737376092624&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Input
5 5 3
5 4
5 2
1 2
3 4
3 1

// Output
3 1 2 5 4
3 1 4 2 5&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;DFS, BFS를 구현할 줄 알면 어려운 문제는 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;문제 풀이할 때 주의할 점이라고 하면, 방문할 수 있는 정점이 여러 개라면 작은 수 먼저 방문해야 한다는 것이다. 이점을 고려하여 정렬만 해준다면 문제없이 풀 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;1. DFS&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737376339952&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private static void dfs(int v){
    visited_dfs[v] = true;
    sb.append(v + &quot; &quot;);

    for (int i : graph[v]) {
        if(!visited_dfs[i]) dfs(i);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;파라미터 값&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;시작 정점 값&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;시작노드의 방문 여부를 true로 설정해 주고, 방문한 배열을 sb에 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;반복문에서는 해당 정점 값에서 방문할 수 있는 정점을 모두 탐색한다. 만약 방문하려는 정점을 방문하지 않았다면, dfs() 함수를 실행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;2. BFS&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737376608639&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private static void bfs(int v){
    Queue&amp;lt;Integer&amp;gt; q = new LinkedList&amp;lt;&amp;gt;();
    q.offer(v);
    visited_bfs[v] = true;

    while(!q.isEmpty()){
        int cur = q.poll();
        sb.append(cur + &quot; &quot;);
        for(int i : graph[cur]){
            if(!visited_bfs[i]){
                q.offer(i);
                visited_bfs[i] = true;
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Queue&amp;lt;Integer&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;큐는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;FIFO 형식으로&amp;nbsp;&lt;/span&gt;BFS를 구현하기에 적합한 자료구조이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;파라미터&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;파라미터 값으로 시작 정점을 받아 해당 값 q에 저장하고 방문 여부를 true로 설정해 준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;while 반복문&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;q의 값이 없을 때 종료하도록 조건을 작성하고, q에 넣은 값을 하나씩 꺼내 출력 값에 저장한다. 내부에 있는 for문은 해당 정점이 방문할 수 있는 정점을 탐색하고 방문하지 않는 노드를 q에 저장하고 방문 여부를 true로 설정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;전체 코드&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737377060264&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 {
    private static ArrayList&amp;lt;Integer&amp;gt;[] graph;
    private static boolean[] visited_dfs;
    private static boolean[] visited_bfs;
    private static StringBuilder sb;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        StringTokenizer st = new StringTokenizer(br.readLine(), &quot; &quot;);
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        int v = Integer.parseInt(st.nextToken());

        graph = new ArrayList[n+1];
        visited_dfs = new boolean[n+1];
        visited_bfs = new boolean[n+1];
        sb = new StringBuilder();

        for(int i = 1; i &amp;lt;= n; i++){
            graph[i] = new ArrayList&amp;lt;&amp;gt;();
        }

        for(int i = 0; i &amp;lt; m; i++){
            String[] input = br.readLine().split(&quot; &quot;);
            int from = Integer.parseInt(input[0]);
            int to = Integer.parseInt(input[1]);

            graph[from].add(to);
            graph[to].add(from);
        }

        for (int i = 1; i &amp;lt;= n; i++) {
            Collections.sort(graph[i]);
        }

        dfs(v);
        sb.append(&quot;\n&quot;);
        bfs(v);
        System.out.println(sb);
    }

    private static void dfs(int v){
        visited_dfs[v] = true;
        sb.append(v + &quot; &quot;);

        for (int i : graph[v]) {
            if(!visited_dfs[i]) dfs(i);
        }
    }

    private static void bfs(int v){
        Queue&amp;lt;Integer&amp;gt; q = new LinkedList&amp;lt;&amp;gt;();
        q.offer(v);
        visited_bfs[v] = true;

        while(!q.isEmpty()){
            int cur = q.poll();
            sb.append(cur + &quot; &quot;);
            for(int i : graph[cur]){
                if(!visited_bfs[i]){
                    q.offer(i);
                    visited_bfs[i] = true;
                }
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;ArrayList&amp;lt;Integer&amp;gt;[]&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;입력 값 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;boolean[] visited&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;배열로 방문 여부 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Collections.sort()&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;방문할 수 있는 정점을 오름차순으로 정렬하는 메서드&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-01-20 오후 9.51.03.png&quot; data-origin-width=&quot;807&quot; data-origin-height=&quot;68&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQkIjO/btsLT16xFIY/X2nkoQxaTK3xsFtDwkXyX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQkIjO/btsLT16xFIY/X2nkoQxaTK3xsFtDwkXyX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQkIjO/btsLT16xFIY/X2nkoQxaTK3xsFtDwkXyX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQkIjO%2FbtsLT16xFIY%2FX2nkoQxaTK3xsFtDwkXyX1%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;807&quot; height=&quot;68&quot; data-filename=&quot;스크린샷 2025-01-20 오후 9.51.03.png&quot; data-origin-width=&quot;807&quot; data-origin-height=&quot;68&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;코테스터디 TIL&lt;/b&gt;&lt;/h4&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;size14&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-5%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.01.18 - [알고리즘/99클럽 코테스터디 5기] - 99클럽 코테 스터디 5일차 TIL (미들러)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1737377529109&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;99클럽 코테 스터디 5일차 TIL (미들러)&quot; data-og-description=&quot;문제: 백준 2470번 두 용액예제// Input5-2 4 -99 -1 98// Output-99 98&amp;nbsp;&amp;nbsp;풀이 방법입력되는 수의 범위가 크고, 시간제한이 있어 완전 탐색을 하게 되면 비효율적이다. 여기서는 음수와 양수의 합이 0에 가&quot; data-og-host=&quot;become-programmer.tistory.com&quot; data-og-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-5%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-5%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/fj8JT/hyX4kFzAUv/Wwp4obZIGIUcQsEeubzxuK/img.png?width=800&amp;amp;height=482&amp;amp;face=0_0_800_482,https://scrap.kakaocdn.net/dn/bCs7PH/hyX4pUnhJd/ZnDHD7NVswnchfU9t8GkC1/img.png?width=800&amp;amp;height=482&amp;amp;face=0_0_800_482,https://scrap.kakaocdn.net/dn/b4ZmHn/hyX4lRW3Mt/tOiTkP6U1RLh1whKDneiok/img.png?width=2345&amp;amp;height=1414&amp;amp;face=0_0_2345_1414&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-5%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-5%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/fj8JT/hyX4kFzAUv/Wwp4obZIGIUcQsEeubzxuK/img.png?width=800&amp;amp;height=482&amp;amp;face=0_0_800_482,https://scrap.kakaocdn.net/dn/bCs7PH/hyX4pUnhJd/ZnDHD7NVswnchfU9t8GkC1/img.png?width=800&amp;amp;height=482&amp;amp;face=0_0_800_482,https://scrap.kakaocdn.net/dn/b4ZmHn/hyX4lRW3Mt/tOiTkP6U1RLh1whKDneiok/img.png?width=2345&amp;amp;height=1414&amp;amp;face=0_0_2345_1414');&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;99클럽 코테 스터디 5일차 TIL (미들러)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제: 백준 2470번 두 용액예제// Input5-2 4 -99 -1 98// Output-99 98&amp;nbsp;&amp;nbsp;풀이 방법입력되는 수의 범위가 크고, 시간제한이 있어 완전 탐색을 하게 되면 비효율적이다. 여기서는 음수와 양수의 합이 0에 가&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;become-programmer.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-4%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.01.17 - [알고리즘/99클럽 코테스터디 5기] - 99클럽 코테 스터디 4일차 TIL (미들러)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1737377548394&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;99클럽 코테 스터디 4일차 TIL (미들러)&quot; data-og-description=&quot;문제: 백준 2343번 기타 레슨예제// Input9 31 2 3 4 5 6 7 8 9// Output17&amp;nbsp;&amp;nbsp;풀이방법이 문제는 최적의 블루레이 크기를 찾아야 한다. 가능한 블루레이 크기를 순차적으로 탐색하게 되면 비효율적이기도 하&quot; data-og-host=&quot;become-programmer.tistory.com&quot; data-og-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-4%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-4%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cC3X8H/hyX4sDyRgp/NGZczO3jnCAYqZQ8Bx6sQ0/img.png?width=800&amp;amp;height=365&amp;amp;face=0_0_800_365,https://scrap.kakaocdn.net/dn/bg4QYg/hyX4sKlKA8/MuRDYDUvVPCNrzk7pIvIN0/img.png?width=800&amp;amp;height=365&amp;amp;face=0_0_800_365,https://scrap.kakaocdn.net/dn/dwapRY/hyX4oVtKFk/wsmiCknVBBEVq4KZf0LHQ1/img.png?width=1470&amp;amp;height=671&amp;amp;face=0_0_1470_671&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-4%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-4%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cC3X8H/hyX4sDyRgp/NGZczO3jnCAYqZQ8Bx6sQ0/img.png?width=800&amp;amp;height=365&amp;amp;face=0_0_800_365,https://scrap.kakaocdn.net/dn/bg4QYg/hyX4sKlKA8/MuRDYDUvVPCNrzk7pIvIN0/img.png?width=800&amp;amp;height=365&amp;amp;face=0_0_800_365,https://scrap.kakaocdn.net/dn/dwapRY/hyX4oVtKFk/wsmiCknVBBEVq4KZf0LHQ1/img.png?width=1470&amp;amp;height=671&amp;amp;face=0_0_1470_671');&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;99클럽 코테 스터디 4일차 TIL (미들러)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제: 백준 2343번 기타 레슨예제// Input9 31 2 3 4 5 6 7 8 9// Output17&amp;nbsp;&amp;nbsp;풀이방법이 문제는 최적의 블루레이 크기를 찾아야 한다. 가능한 블루레이 크기를 순차적으로 탐색하게 되면 비효율적이기도 하&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;become-programmer.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>알고리즘/99클럽 코테스터디 5기</category>
      <category>99클럽</category>
      <category>99클럽코테스터디</category>
      <category>til</category>
      <category>백준 1260번</category>
      <category>백준 dfs와 bfs</category>
      <category>코테스터디 6일차</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/334</guid>
      <comments>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-6%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC#entry334comment</comments>
      <pubDate>Mon, 20 Jan 2025 21:53:57 +0900</pubDate>
    </item>
    <item>
      <title>99클럽 코테 스터디 5일차 TIL (미들러)</title>
      <link>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-5%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제: 백준 2470번 두 용액&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2345&quot; data-origin-height=&quot;1414&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WE48m/btsLRC7baaW/08CS3t6ndm3Y0yErU4jdTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WE48m/btsLRC7baaW/08CS3t6ndm3Y0yErU4jdTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WE48m/btsLRC7baaW/08CS3t6ndm3Y0yErU4jdTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWE48m%2FbtsLRC7baaW%2F08CS3t6ndm3Y0yErU4jdTk%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;2345&quot; height=&quot;1414&quot; data-origin-width=&quot;2345&quot; data-origin-height=&quot;1414&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737155214957&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Input
5
-2 4 -99 -1 98

// Output
-99 98&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;입력되는 수의 범위가 크고, 시간제한이 있어 완전 탐색을 하게 되면 비효율적이다. 여기서는 음수와 양수의 합이 0에 가까운 수를 찾아야 하기 때문에 정렬 후 투포인터 알고리즘을 사용하는 게 적절하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;1. 값 입력 받고 배열 정렬하기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737155429697&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int n = Integer.parseInt(br.readLine());

StringTokenizer st = new StringTokenizer(br.readLine(), &quot; &quot;);
int[] nums = new int[n];
for(int i = 0; i &amp;lt; n; i++){
    nums[i] = Integer.parseInt(st.nextToken());
}

Arrays.sort(nums);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;2. 변수 생성하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;int i, j:&lt;/b&gt; 투 포인터 양 끝 점을 변수로 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;int min:&lt;/b&gt; 0에 가까운 수를 저장하기 위한 변수로 초기값은 Integer 타입의 최댓값으로 지정&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;int[] result:&lt;/b&gt; 0에 가까운 두 용액을 저장하기 위한 배열&lt;/p&gt;
&lt;pre id=&quot;code_1737155590860&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int i = 0, j = nums.length - 1;
int min = Integer.MAX_VALUE;
int[] result = new int[2];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;3. 조건 생성&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;while문:&lt;/b&gt; 양 끝에서 시작하는 i, j가 서로 겹치지 않을 때까지 반복&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;int sum:&lt;/b&gt; 두 용액의 합을 저장한 변수&lt;/p&gt;
&lt;pre id=&quot;code_1737155926184&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; while(i &amp;lt; j){
    int sum = nums[i] + nums[j];
    if(Math.abs(sum) &amp;lt; min){
        min = Math.abs(sum);
        result[0] = nums[i];
        result[1] = nums[j];
    }
    if(sum == 0) break;
    if(sum &amp;gt; 0) j--;
    else i++;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;Math.abs()를 이용하여 음수인 sum 값을 절댓값으로 만들어 주어 현재까지의 최솟값인 min과 비교한다. min보다 절댓값(sum)이 작다면 min 값을 수정하고 result 배열에 해당 값들을 저장한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;만약 sum이 0 이라면 반복문을 바로 종료하게 되고 sum이 0보다 크다면 합이 더 작아져야 하니 j 변수의 값을 줄이고 0보다 작다면 합이 커져야 하니 i 변수의 값을 증가시켜 준다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;전체 코드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737155379835&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 NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());

        StringTokenizer st = new StringTokenizer(br.readLine(), &quot; &quot;);
        int[] nums = new int[n];
        for(int i = 0; i &amp;lt; n; i++){
            nums[i] = Integer.parseInt(st.nextToken());
        }

        Arrays.sort(nums);

        int i = 0, j = nums.length - 1;
        int min = Integer.MAX_VALUE;
        int[] result = new int[2];

        while(i &amp;lt; j){
            int sum = nums[i] + nums[j];
            if(Math.abs(sum) &amp;lt; min){
                min = Math.abs(sum);
                result[0] = nums[i];
                result[1] = nums[j];
            }
            if(sum == 0) break;
            if(sum &amp;gt; 0) j--;
            else i++;
        }

        System.out.println(result[0] + &quot; &quot; + result[1]);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-01-18 오전 8.19.08.png&quot; data-origin-width=&quot;1624&quot; data-origin-height=&quot;128&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cG8FJU/btsLREw82hq/surIJGrrmNF66BDShsBeEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cG8FJU/btsLREw82hq/surIJGrrmNF66BDShsBeEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cG8FJU/btsLREw82hq/surIJGrrmNF66BDShsBeEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcG8FJU%2FbtsLREw82hq%2FsurIJGrrmNF66BDShsBeEK%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;1624&quot; height=&quot;128&quot; data-filename=&quot;스크린샷 2025-01-18 오전 8.19.08.png&quot; data-origin-width=&quot;1624&quot; data-origin-height=&quot;128&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;코테스터디 TIL&lt;/b&gt;&lt;/h4&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;size14&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-4%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.01.17 - [알고리즘/99클럽 코테스터디 5기] - 99클럽 코테 스터디 4일차 TIL (미들러)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1737156013530&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;99클럽 코테 스터디 4일차 TIL (미들러)&quot; data-og-description=&quot;문제: 백준 2343번 기타 레슨예제// Input9 31 2 3 4 5 6 7 8 9// Output17&amp;nbsp;&amp;nbsp;풀이방법이 문제는 최적의 블루레이 크기를 찾아야 한다. 가능한 블루레이 크기를 순차적으로 탐색하게 되면 비효율적이기도 하&quot; data-og-host=&quot;become-programmer.tistory.com&quot; data-og-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-4%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-4%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bKBcuH/hyX0vnZL0u/6juMhBfPc5YhhKMok104x1/img.png?width=800&amp;amp;height=365&amp;amp;face=0_0_800_365,https://scrap.kakaocdn.net/dn/lqWtI/hyX0w8hrCZ/Ce64kmgyzAb21IR4ciHBt0/img.png?width=800&amp;amp;height=365&amp;amp;face=0_0_800_365,https://scrap.kakaocdn.net/dn/uarfG/hyX0ydWVdQ/QKRV65nxxueNye3ddAvqVk/img.png?width=1470&amp;amp;height=671&amp;amp;face=0_0_1470_671&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-4%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-4%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bKBcuH/hyX0vnZL0u/6juMhBfPc5YhhKMok104x1/img.png?width=800&amp;amp;height=365&amp;amp;face=0_0_800_365,https://scrap.kakaocdn.net/dn/lqWtI/hyX0w8hrCZ/Ce64kmgyzAb21IR4ciHBt0/img.png?width=800&amp;amp;height=365&amp;amp;face=0_0_800_365,https://scrap.kakaocdn.net/dn/uarfG/hyX0ydWVdQ/QKRV65nxxueNye3ddAvqVk/img.png?width=1470&amp;amp;height=671&amp;amp;face=0_0_1470_671');&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;99클럽 코테 스터디 4일차 TIL (미들러)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제: 백준 2343번 기타 레슨예제// Input9 31 2 3 4 5 6 7 8 9// Output17&amp;nbsp;&amp;nbsp;풀이방법이 문제는 최적의 블루레이 크기를 찾아야 한다. 가능한 블루레이 크기를 순차적으로 탐색하게 되면 비효율적이기도 하&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;become-programmer.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/99클럽 코테스터디 5기</category>
      <category>99클럽</category>
      <category>99클럽코테스터디</category>
      <category>til</category>
      <category>백준 2470번</category>
      <category>백준 두 용액</category>
      <category>코테스터디 5일차</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/333</guid>
      <comments>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-5%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC#entry333comment</comments>
      <pubDate>Sat, 18 Jan 2025 08:22:26 +0900</pubDate>
    </item>
    <item>
      <title>99클럽 코테 스터디 4일차 TIL (미들러)</title>
      <link>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-4%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제: 백준 2343번 기타 레슨&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1470&quot; data-origin-height=&quot;671&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbpXB7/btsLP34IoBF/oZnoFZFOgs0OBKn0PHeUGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbpXB7/btsLP34IoBF/oZnoFZFOgs0OBKn0PHeUGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbpXB7/btsLP34IoBF/oZnoFZFOgs0OBKn0PHeUGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbpXB7%2FbtsLP34IoBF%2FoZnoFZFOgs0OBKn0PHeUGk%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;1470&quot; height=&quot;671&quot; data-origin-width=&quot;1470&quot; data-origin-height=&quot;671&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737073549976&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Input
9 3
1 2 3 4 5 6 7 8 9

// Output
17&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이 문제는 최적의 블루레이 크기를 찾아야 한다. 가능한 블루레이 크기를 순차적으로 탐색하게 되면 비효율적이기도 하고 입력된 강의 길이의 범위가 연속적이고 정렬하기 때문에 이분 탐색을 이용해 풀이한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;1. 이분 탐색 범위&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;코드를 짜며 가장 고민했던 부분은 이분 탐색의 범위였던 것 같다. 이분 탐색의 타겟 값이 블루레이 최대 크기라고 한다면, 최소값의 경우 강의 중에서 가장 긴 길이가 될 것이고, 최대값의 경우 모든 강의 길의의 합이 된다. 즉, 이분탐색의 범위는 max(lessons) ~ sum(lessons) 인 것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1737074183295&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int sum = 0;
int max = 0;
int[] lessons = new int[n];
StringTokenizer st = new StringTokenizer(br.readLine(), &quot; &quot;);
for(int i = 0; i &amp;lt; n; i++){
    lessons[i] = Integer.parseInt(st.nextToken());
    max = Math.max(max, lessons[i]);
    sum += lessons[i];
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;2. 블루레이 크기 검증&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이분 탐색의 범위를 지정하고 탐색에 들어간다면, 블루레이 개수가 m보다 작은지 확인해야 한다. 반복문을 활용해 중간값 길이로 블루레이를 나누었을 때, 블루레이 크기가 m를 초과 여부를 먼저 확인하고 이에 따라 최소값을 변경할지, 최대값을 변경할지 결정한다.&lt;/p&gt;
&lt;pre id=&quot;code_1737074213519&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; private static int minBluelay(int[] lessons, int max, int sum, int m){
    int low = max;
    int high = sum;

    while(low &amp;lt;= high){
        int mid = low + (high - low) / 2;

        if(isValid(lessons, mid, m)) high = mid - 1;
        else low = mid + 1;
    }

    return low;
}

private static boolean isValid(int[] lessons, int mid, int m){
    int count = 1;
    int total = 0;

    for(int i = 0; i &amp;lt; lessons.length; i++){
        if(total + lessons[i] &amp;gt; mid){
            count++;
            total = lessons[i];
            if(count &amp;gt; m) return false;
        }else{
            total += lessons[i];
        }
    }

    return true;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;전체 코드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737073808012&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.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String[] input = br.readLine().split(&quot; &quot;);
        int n = Integer.parseInt(input[0]);
        int m = Integer.parseInt(input[1]);

        int sum = 0;
        int max = 0;
        int[] lessons = new int[n];
        StringTokenizer st = new StringTokenizer(br.readLine(), &quot; &quot;);
        for(int i = 0; i &amp;lt; n; i++){
            lessons[i] = Integer.parseInt(st.nextToken());
            max = Math.max(max, lessons[i]);
            sum += lessons[i];
        }

        System.out.println(minBluelay(lessons, max, sum, m));
    }

    private static int minBluelay(int[] lessons, int max, int sum, int m){
        int low = max;
        int high = sum;
        
        while(low &amp;lt;= high){
            int mid = low + (high - low) / 2;

            if(isValid(lessons, mid, m)) high = mid - 1;
            else low = mid + 1;
        }

        return low;
    }

    private static boolean isValid(int[] lessons, int mid, int m){
        int count = 1; // 최소 1개의 블루레이는 필요
        int total = 0;
        
        for(int i = 0; i &amp;lt; lessons.length; i++){
            if(total + lessons[i] &amp;gt; mid){
                count++;
                total = lessons[i];
                if(count &amp;gt; m) return false; // 개수 초과 시 false 리턴
            }else{
                total += lessons[i];
            }
        }

        return true;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;minBluelay(): 최적의 블루레이 크기를 찾는 이분탐색 메서드&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;최소값(low)는 max로 설정하고, 최대값(high)는 sum으로 설정한다. 이는 블루레이의 크기가 max 이상이어야 모든 강의를 담을 수 있고, sum 이하이어야 모든 강의를 한 개의 블루레이에 담을 수 있기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;중간값(mid)를 계산한 뒤, 해당 블루레이 크기로 주어진 블루레이 개수(m)를 만족할 수 있는지 isValid() 메서드를 호출하여 검증한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;조건을 만족한다면(isValid()가 true) 더 작은 블루레이 크기에서도 가능할 수 있으므로 최대값(high)를 줄여야 하고, 조건을 만족하지 않는다면(isValid()가 false) 더 큰 블루레이 크기가 필요하므로 최소값(low)를 늘려야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이 과정을 반복하여 탐색 범위를 좁혀가면 최적의 블루레이 크기를 찾을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;isValid(): 파라미터로 넘겨받은 블루레이 크기가 유효한지 검증하는 메서드&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;count 변수는 블루레이 개수를 세고 total 변수는 블루레이의 합을 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;반복문을 생성하고 만약 저장된 강의 길이의 합과 현재 강의 길이 합이 블루레이 크기보다 크다면 count를 증가하고 total 값은 현재 강의 길이로 변경해준다. 만약 count 즉, 블루레이 개수가 m이라는 주어진 조건에 부합하지 않는 경우 false를 리턴한다. else 문에 부합할 경우 total 값에 현재 강의 길이를 더해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1019&quot; data-origin-height=&quot;83&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Aixw5/btsLPEc6btJ/84KUPJsHmbM6Ryy7dYMFEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Aixw5/btsLPEc6btJ/84KUPJsHmbM6Ryy7dYMFEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Aixw5/btsLPEc6btJ/84KUPJsHmbM6Ryy7dYMFEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAixw5%2FbtsLPEc6btJ%2F84KUPJsHmbM6Ryy7dYMFEk%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;1019&quot; height=&quot;83&quot; data-origin-width=&quot;1019&quot; data-origin-height=&quot;83&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;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;코테스터디 TIL&lt;/b&gt;&lt;/h4&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;size16&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-3%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.01.16 - [알고리즘/99클럽 코테스터디 5기] - 99클럽 코테 스터디 3일차 TIL (미들러)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1737075188430&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;99클럽 코테 스터디 3일차 TIL (미들러)&quot; data-og-description=&quot;문제: 백준 11663번 선분 위의 점&amp;nbsp;예제// Input5 51 3 10 20 301 1020 603 302 154 8// Output32420&amp;nbsp;&amp;nbsp;풀이방법이 문제는 각 선분 위에 주어진 점이 몇 개가 있는지 출력해야 한다.점과 선분은 1 ~100,000개가 주어지&quot; data-og-host=&quot;become-programmer.tistory.com&quot; data-og-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-3%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-3%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cjtFNM/hyX0vnScP8/Gxqu2fHWQPqb58NmMxmZpK/img.png?width=800&amp;amp;height=460&amp;amp;face=0_0_800_460,https://scrap.kakaocdn.net/dn/cqQ8He/hyX4wyEZVH/yzLOgmATUvjwYBlPPgWQKk/img.png?width=800&amp;amp;height=460&amp;amp;face=0_0_800_460,https://scrap.kakaocdn.net/dn/bZnnu9/hyX0ks97Tf/oRk5jjJ7DISgmfyKUqFVKk/img.png?width=1450&amp;amp;height=835&amp;amp;face=0_0_1450_835&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-3%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-3%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cjtFNM/hyX0vnScP8/Gxqu2fHWQPqb58NmMxmZpK/img.png?width=800&amp;amp;height=460&amp;amp;face=0_0_800_460,https://scrap.kakaocdn.net/dn/cqQ8He/hyX4wyEZVH/yzLOgmATUvjwYBlPPgWQKk/img.png?width=800&amp;amp;height=460&amp;amp;face=0_0_800_460,https://scrap.kakaocdn.net/dn/bZnnu9/hyX0ks97Tf/oRk5jjJ7DISgmfyKUqFVKk/img.png?width=1450&amp;amp;height=835&amp;amp;face=0_0_1450_835');&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;99클럽 코테 스터디 3일차 TIL (미들러)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제: 백준 11663번 선분 위의 점&amp;nbsp;예제// Input5 51 3 10 20 301 1020 603 302 154 8// Output32420&amp;nbsp;&amp;nbsp;풀이방법이 문제는 각 선분 위에 주어진 점이 몇 개가 있는지 출력해야 한다.점과 선분은 1 ~100,000개가 주어지&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;become-programmer.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-2%EC%9D%BC%EC%B0%A8-TIL&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.01.14 - [알고리즘/99클럽 코테스터디 5기] - 99클럽 코테 스터디 2일차 TIL (미들러)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1737075195616&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;99클럽 코테 스터디 2일차 TIL (미들러)&quot; data-og-description=&quot;문제: 백준 1654번 랜선 자르기&amp;nbsp;예제// Input4 11802743457539// Output200&amp;nbsp;&amp;nbsp;알고리즘 풀이 방법랜선의 길이를 자르는 최적의 길이를 찾기 위해 다음 두 가지 방법을 시도했습니다.&amp;nbsp;1. 반복문 탐색(실패)2. &quot; data-og-host=&quot;become-programmer.tistory.com&quot; data-og-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-2%EC%9D%BC%EC%B0%A8-TIL&quot; data-og-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-2%EC%9D%BC%EC%B0%A8-TIL&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/XDxRV/hyX4mphvxP/gDYUWUU8OtTxWP2iugKNf1/img.png?width=800&amp;amp;height=370&amp;amp;face=0_0_800_370,https://scrap.kakaocdn.net/dn/qkglB/hyX4rD8DuL/dUkkTIRRlWL9GcH6xGA3T1/img.png?width=800&amp;amp;height=370&amp;amp;face=0_0_800_370,https://scrap.kakaocdn.net/dn/u3NSo/hyX4oHpAdw/U1dsPPE2dvfEsUeqcSEq3K/img.png?width=1437&amp;amp;height=666&amp;amp;face=0_0_1437_666&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-2%EC%9D%BC%EC%B0%A8-TIL&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-2%EC%9D%BC%EC%B0%A8-TIL&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/XDxRV/hyX4mphvxP/gDYUWUU8OtTxWP2iugKNf1/img.png?width=800&amp;amp;height=370&amp;amp;face=0_0_800_370,https://scrap.kakaocdn.net/dn/qkglB/hyX4rD8DuL/dUkkTIRRlWL9GcH6xGA3T1/img.png?width=800&amp;amp;height=370&amp;amp;face=0_0_800_370,https://scrap.kakaocdn.net/dn/u3NSo/hyX4oHpAdw/U1dsPPE2dvfEsUeqcSEq3K/img.png?width=1437&amp;amp;height=666&amp;amp;face=0_0_1437_666');&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;99클럽 코테 스터디 2일차 TIL (미들러)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제: 백준 1654번 랜선 자르기&amp;nbsp;예제// Input4 11802743457539// Output200&amp;nbsp;&amp;nbsp;알고리즘 풀이 방법랜선의 길이를 자르는 최적의 길이를 찾기 위해 다음 두 가지 방법을 시도했습니다.&amp;nbsp;1. 반복문 탐색(실패)2.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;become-programmer.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-1%EC%9D%BC%EC%B0%A8-TIL&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.01.13 - [알고리즘/99클럽 코테스터디 5기] - 99클럽 코테 스터디 1일차 TIL (미들러)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1737075202283&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;99클럽 코테 스터디 1일차 TIL (미들러)&quot; data-og-description=&quot;문제: 백준 2776번 암기왕&amp;nbsp;예제// Input 1154 1 5 2 351 3 7 9 5// Output 111001&amp;nbsp;&amp;nbsp;알고리즘 풀이 방법1. Binary Search(반복문, 재귀)2. Hash Set&amp;nbsp;수첩 1에 적힌 정수의 입력을 오름차순으로 정렬한 뒤, 이분 탐색을 &quot; data-og-host=&quot;become-programmer.tistory.com&quot; data-og-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-1%EC%9D%BC%EC%B0%A8-TIL&quot; data-og-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-1%EC%9D%BC%EC%B0%A8-TIL&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Ytiuh/hyX0twO3Uz/7fW4GKRum2kL4yWF9QRYY1/img.png?width=800&amp;amp;height=477&amp;amp;face=0_0_800_477,https://scrap.kakaocdn.net/dn/bPNucV/hyX4nIuARQ/Rvj3EsnnEn02KS2nlhFzc1/img.png?width=800&amp;amp;height=477&amp;amp;face=0_0_800_477,https://scrap.kakaocdn.net/dn/bx9rwi/hyX4spuVRY/G7jZmrj8JrkWMz7IUKM0Sk/img.png?width=2336&amp;amp;height=1394&amp;amp;face=0_0_2336_1394&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-1%EC%9D%BC%EC%B0%A8-TIL&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-1%EC%9D%BC%EC%B0%A8-TIL&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Ytiuh/hyX0twO3Uz/7fW4GKRum2kL4yWF9QRYY1/img.png?width=800&amp;amp;height=477&amp;amp;face=0_0_800_477,https://scrap.kakaocdn.net/dn/bPNucV/hyX4nIuARQ/Rvj3EsnnEn02KS2nlhFzc1/img.png?width=800&amp;amp;height=477&amp;amp;face=0_0_800_477,https://scrap.kakaocdn.net/dn/bx9rwi/hyX4spuVRY/G7jZmrj8JrkWMz7IUKM0Sk/img.png?width=2336&amp;amp;height=1394&amp;amp;face=0_0_2336_1394');&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;99클럽 코테 스터디 1일차 TIL (미들러)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제: 백준 2776번 암기왕&amp;nbsp;예제// Input 1154 1 5 2 351 3 7 9 5// Output 111001&amp;nbsp;&amp;nbsp;알고리즘 풀이 방법1. Binary Search(반복문, 재귀)2. Hash Set&amp;nbsp;수첩 1에 적힌 정수의 입력을 오름차순으로 정렬한 뒤, 이분 탐색을&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;become-programmer.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>알고리즘/99클럽 코테스터디 5기</category>
      <category>99클럽</category>
      <category>99클럽코테스터디</category>
      <category>til</category>
      <category>백준 2343번</category>
      <category>백준 기타 레슨</category>
      <category>코테스터디 4일차</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/332</guid>
      <comments>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-4%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC#entry332comment</comments>
      <pubDate>Fri, 17 Jan 2025 09:54:15 +0900</pubDate>
    </item>
    <item>
      <title>99클럽 코테 스터디 3일차 TIL (미들러)</title>
      <link>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-3%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제: 백준 11663번 선분 위의 점&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1450&quot; data-origin-height=&quot;835&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dn6tz0/btsLOYPBEHe/1lV6SRHXwb5y1IGJtqtLfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dn6tz0/btsLOYPBEHe/1lV6SRHXwb5y1IGJtqtLfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dn6tz0/btsLOYPBEHe/1lV6SRHXwb5y1IGJtqtLfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdn6tz0%2FbtsLOYPBEHe%2F1lV6SRHXwb5y1IGJtqtLfk%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;1450&quot; height=&quot;835&quot; data-origin-width=&quot;1450&quot; data-origin-height=&quot;835&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1736985753617&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Input
5 5
1 3 10 20 30
1 10
20 60
3 30
2 15
4 8

// Output
3
2
4
2
0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이 문제는 각 선분 위에 주어진 점이 몇 개가 있는지 출력해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;점과 선분은 1 ~100,000개가 주어지기 때문에 일반적인 탐색을 하게 되면 시간초과가 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;여기서는 이분 탐색을 활용해 해당 문제를 풀어보려고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;1. 이분탐색&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;먼저 주어진 점의 좌표 값이 [1,3,10,20,30]이라고 가정하고 선분의 시작과 종료가 3과 30이라고 했을 때 모든 점의 좌표를 비교하려고 하면 시간초과가 발생한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;모든 수를 비교하지 않고 탐색할 수 있는 방안을 생각해보면 좌표 값이 정렬되어 있다는 가정하에 3보다 크거나 같은 점의 인덱스와 30보다 작거나 같은 인덱스를 찾아 큰 인덱스에서 작은 인덱스를 빼준다면 모든 값을 일일이 비교하지 않아도 된다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;여기서 주의해야 하는 것은 선분의 시작이나 종료 값이 점의 좌표와 완전히 동일하지 않다는 것이다. 따라서 시작인덱스와 종료인덱스를 찾는 각각의 함수를 생성하여야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1736985918856&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 br = new BufferedReader(new InputStreamReader(System.in));

        String[] input = br.readLine().split(&quot; &quot;);
        int n = Integer.parseInt(input[0]);
        int m = Integer.parseInt(input[1]);

        int[] nums = new int[n];
        StringTokenizer st = new StringTokenizer(br.readLine(), &quot; &quot;);
        for(int i = 0; i &amp;lt; n; i++){
            nums[i] = Integer.parseInt(st.nextToken());
        }

        Arrays.sort(nums);

        StringBuilder sb = new StringBuilder();
        while(m-- &amp;gt; 0){
            String[] line = br.readLine().split(&quot; &quot;);
            int start = Integer.parseInt(line[0]);
            int end = Integer.parseInt(line[1]);

            int count = endDots(nums, end) - startDots(nums, start);
            sb.append(count).append(&quot;\n&quot;);
            
        }

        System.out.println(sb);
    }

    private static int startDots(int[] nums, int target){
        int s = 0;
        int e = nums.length;

        while(s &amp;lt; e){
            int mid = s + (e - s) / 2;
            if(nums[mid] &amp;gt;= target) e = mid;
            else s = mid + 1;
        }
        return s;
    }

    private static int endDots(int[] nums, int target){
        int s = 0;
        int e = nums.length;

        while(s &amp;lt; e){
            int mid = s + (e - s) / 2;
            if(nums[mid] &amp;gt; target) e = mid;
            else s = mid + 1;
        }
        return s;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;nums[]:&lt;/b&gt; 해당 배열은 입력된 점의 좌표를 저장하는 배열이다. 이분 탐색을 하려면 값이 정렬되어 있어야 하기 때문에 Arrays.sort(nums) 메서드를 활용해 오름차순으로 정렬하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;StringBuilder:&lt;/b&gt; 여러 개의 선분이 주어지고, 각 선분마다 입력된 점을 출력해야 한다. 각 선분마다 값을 출력해도 되지만, 성능이 좋지 않기 때문에 StringBuilder를 활용해 Output을 저장하고 출력하도록 하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;startDots(int[] a, int target):&lt;/b&gt; 점의 좌표가 target 값보다 크거나 같은 인덱스를 찾는 이분 탐색 로직이다. 파라미터 값으로는 점의 좌표가 저장된 배열과 선분의 시작 값을 넘겨준다. 내부 로직을 보게 되면 배열의 시작(s)과 끝(e)을 탐색의 범위로 지정하고 중간 값을 mid라는 변수에 저장한다. 만약 배열의 중간 값이 타겟보다 크거나 같다면 e를 mid설정하고 작다면 s를 mid + 1로 설정하여 탐색 범위를 줄인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;예를 들어 [1,3,10,20,30]이라는 점의 좌표가 존재하고 선분의 시작과 끝이 [3,30]이라고 하였다면,&lt;/p&gt;
&lt;pre id=&quot;code_1736987010149&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1번째: s = 1, e = 30, mid = 10
타겟인 3보다 mid가 크기 때문에 e = 10으로 설정
2번째: s = 1, e = 10, mid = 3
타겟인 3과 동일하기 때문에 e = 3
3번째: s = 1, e = 3, mid = 1
타겟보다 작기 때문에 s = 3
s와 e가 동일하기 때문에 반복문 종료 후 s 인덱스를 리턴&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;endDots(int[] a, int target):&lt;/b&gt; 선분의 종료 값보다 작거나 같은 인덱스를 찾는 이분 탐색 로직이다. startDots() 메서드와 다른 점은 조건문에 있다. a[mid] 보다 target이 큰 수 일 때, e를 mid로 설정하고 작거나 같다면 s = mid + 1로 지정한다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1736987471978&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1번째: s = 1, e = 30, mid = 10
타겟인 30보다 mid가 작기 때문에 s = 20으로 설정
2번째: s = 20, e = 30, mid = 20
타겟인 30보다 mid가 작기 때문에 s = 30
s와 e가 동일하기 때문에 반복문 종료 후 s 인덱스를 리턴&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;count:&lt;/b&gt; 메서드를 통해 시작 인덱스와 종료 인덱스를 찾았다면 큰 값 즉, 종료인덱스에서 작은 값인 시작인덱스를 빼주면 선분 위에 입력된 점이 몇 개인지 알 수 있다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1147&quot; data-origin-height=&quot;79&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cr93Tv/btsLP15E66T/wfLoxhzV4pPGuv41s4klik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cr93Tv/btsLP15E66T/wfLoxhzV4pPGuv41s4klik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cr93Tv/btsLP15E66T/wfLoxhzV4pPGuv41s4klik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcr93Tv%2FbtsLP15E66T%2FwfLoxhzV4pPGuv41s4klik%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;1147&quot; height=&quot;79&quot; data-origin-width=&quot;1147&quot; data-origin-height=&quot;79&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;2일 차와 동일하게 이분탐색을 진행했다. 이 문제는 완전히 동일한 수를 찾는 탐색이 아니었기 때문에 코드를 짤 때 조금 복잡했던 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;코테스터디 TIL&lt;/b&gt;&lt;/h4&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;size16&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-2%EC%9D%BC%EC%B0%A8-TIL&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.01.14 - [알고리즘] - 99클럽 코테 스터디 2일차 TIL (미들러)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1736987762598&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;99클럽 코테 스터디 2일차 TIL (미들러)&quot; data-og-description=&quot;문제: 백준 1654번 랜선 자르기&amp;nbsp;예제// Input4 11802743457539// Output200&amp;nbsp;&amp;nbsp;알고리즘 풀이 방법랜선의 길이를 자르는 최적의 길이를 찾기 위해 다음 두 가지 방법을 시도했습니다.&amp;nbsp;1. 반복문 탐색(실패)2. &quot; data-og-host=&quot;become-programmer.tistory.com&quot; data-og-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-2%EC%9D%BC%EC%B0%A8-TIL&quot; data-og-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-2%EC%9D%BC%EC%B0%A8-TIL&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bQGUpR/hyX0uWENzT/BwMcTjVotASfJiCIS2k8L0/img.png?width=800&amp;amp;height=370&amp;amp;face=0_0_800_370,https://scrap.kakaocdn.net/dn/ci5kOh/hyX4krj0PV/QkPDsXUHaSQOipi9NiEe2k/img.png?width=800&amp;amp;height=370&amp;amp;face=0_0_800_370,https://scrap.kakaocdn.net/dn/bHMbB9/hyX4nhhr5r/BxtVHvbTrS4dWQVpVz9InK/img.png?width=1437&amp;amp;height=666&amp;amp;face=0_0_1437_666&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-2%EC%9D%BC%EC%B0%A8-TIL&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-2%EC%9D%BC%EC%B0%A8-TIL&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bQGUpR/hyX0uWENzT/BwMcTjVotASfJiCIS2k8L0/img.png?width=800&amp;amp;height=370&amp;amp;face=0_0_800_370,https://scrap.kakaocdn.net/dn/ci5kOh/hyX4krj0PV/QkPDsXUHaSQOipi9NiEe2k/img.png?width=800&amp;amp;height=370&amp;amp;face=0_0_800_370,https://scrap.kakaocdn.net/dn/bHMbB9/hyX4nhhr5r/BxtVHvbTrS4dWQVpVz9InK/img.png?width=1437&amp;amp;height=666&amp;amp;face=0_0_1437_666');&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;99클럽 코테 스터디 2일차 TIL (미들러)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제: 백준 1654번 랜선 자르기&amp;nbsp;예제// Input4 11802743457539// Output200&amp;nbsp;&amp;nbsp;알고리즘 풀이 방법랜선의 길이를 자르는 최적의 길이를 찾기 위해 다음 두 가지 방법을 시도했습니다.&amp;nbsp;1. 반복문 탐색(실패)2.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;become-programmer.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-1%EC%9D%BC%EC%B0%A8-TIL&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.01.13 - [알고리즘] - 99클럽 코테 스터디 1일차 TIL (미들러)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1736987768879&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;99클럽 코테 스터디 1일차 TIL (미들러)&quot; data-og-description=&quot;문제: 백준 2776번 암기왕&amp;nbsp;예제// Input 1154 1 5 2 351 3 7 9 5// Output 111001&amp;nbsp;&amp;nbsp;알고리즘 풀이 방법1. Binary Search(반복문, 재귀)2. Hash Set&amp;nbsp;수첩 1에 적힌 정수의 입력을 오름차순으로 정렬한 뒤, 이분 탐색을 &quot; data-og-host=&quot;become-programmer.tistory.com&quot; data-og-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-1%EC%9D%BC%EC%B0%A8-TIL&quot; data-og-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-1%EC%9D%BC%EC%B0%A8-TIL&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/beBqge/hyX4wrK6Xu/bMyghCaTacPEcyrLnfA4xk/img.png?width=800&amp;amp;height=477&amp;amp;face=0_0_800_477,https://scrap.kakaocdn.net/dn/wGrjN/hyX4vfjFE0/dPQMCHkCCC3kPnkiZ9ZgP1/img.png?width=800&amp;amp;height=477&amp;amp;face=0_0_800_477,https://scrap.kakaocdn.net/dn/b0WB3V/hyX0sYRoog/01LH0aE54WZ4sjKjOwnmD1/img.png?width=2336&amp;amp;height=1394&amp;amp;face=0_0_2336_1394&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-1%EC%9D%BC%EC%B0%A8-TIL&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-1%EC%9D%BC%EC%B0%A8-TIL&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/beBqge/hyX4wrK6Xu/bMyghCaTacPEcyrLnfA4xk/img.png?width=800&amp;amp;height=477&amp;amp;face=0_0_800_477,https://scrap.kakaocdn.net/dn/wGrjN/hyX4vfjFE0/dPQMCHkCCC3kPnkiZ9ZgP1/img.png?width=800&amp;amp;height=477&amp;amp;face=0_0_800_477,https://scrap.kakaocdn.net/dn/b0WB3V/hyX0sYRoog/01LH0aE54WZ4sjKjOwnmD1/img.png?width=2336&amp;amp;height=1394&amp;amp;face=0_0_2336_1394');&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;99클럽 코테 스터디 1일차 TIL (미들러)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제: 백준 2776번 암기왕&amp;nbsp;예제// Input 1154 1 5 2 351 3 7 9 5// Output 111001&amp;nbsp;&amp;nbsp;알고리즘 풀이 방법1. Binary Search(반복문, 재귀)2. Hash Set&amp;nbsp;수첩 1에 적힌 정수의 입력을 오름차순으로 정렬한 뒤, 이분 탐색을&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;become-programmer.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>알고리즘/99클럽 코테스터디 5기</category>
      <category>99클럽</category>
      <category>99클럽코테스터디</category>
      <category>til</category>
      <category>백준 선분 위의 점 자바</category>
      <category>백준11663번</category>
      <category>코테스터디 3일차</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/331</guid>
      <comments>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-3%EC%9D%BC%EC%B0%A8-TIL-%EB%AF%B8%EB%93%A4%EB%9F%AC#entry331comment</comments>
      <pubDate>Thu, 16 Jan 2025 09:41:10 +0900</pubDate>
    </item>
    <item>
      <title>99클럽 코테 스터디 2일차 TIL (미들러)</title>
      <link>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-2%EC%9D%BC%EC%B0%A8-TIL</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제: 백준 1654번 랜선 자르기&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1437&quot; data-origin-height=&quot;666&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lFSQN/btsLM8YGW1p/k7fj3n8cfHtxAPnttam021/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lFSQN/btsLM8YGW1p/k7fj3n8cfHtxAPnttam021/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lFSQN/btsLM8YGW1p/k7fj3n8cfHtxAPnttam021/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlFSQN%2FbtsLM8YGW1p%2Fk7fj3n8cfHtxAPnttam021%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;1437&quot; height=&quot;666&quot; data-origin-width=&quot;1437&quot; data-origin-height=&quot;666&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1736832443055&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Input
4 11
802
743
457
539

// Output
200&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;랜선의 길이를 자르는 최적의 길이를 찾기 위해 다음 두 가지 방법을 시도했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;1. 반복문 탐색(실패)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;2. 이분탐색(성공)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;1. 반복문 탐색(실패)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;먼저 모든 K랜선의 길이를 더하여 N으로 나눈 값부터 하나씩 줄여나가도록 반복문을 작성하였다. 이렇게 한 이유는 K랜선의 길이를 모두 합하여 나눈 길이보다 더 큰 수가 나올 수 없기 때문이다. 그리고 K 랜선을 자른 개수보다 크거나 같으면 값을 출력할 수 있도록 하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1736832650541&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String[] input = br.readLine().split(&quot; &quot;);
        int k = Integer.parseInt(input[0]);
        int n = Integer.parseInt(input[1]);

        int[] kArr = new int[k];
        int total = 0;
        for(int i = 0; i &amp;lt; kArr.length; i++){
            kArr[i] = Integer.parseInt(br.readLine());
            total += kArr[i];
        }

        for(int i = total / n; i &amp;gt;= 0; i--){
            if(n &amp;lt;= lan(kArr, i, n)){
                System.out.println(i);
                return;
            }
        }
        
    }

    private static int lan(int[] arr, int x, int n){
        int cnt = 0;
        for(int i = 0; i &amp;lt; arr.length; i++){
            cnt += arr[i] / x;
        }
        return cnt;
    }
    
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;하지만 입력되는 K 랜선의 길이는 1 이상 10,000 이하이기에 연산량이 많아 시간 초과가 발생하였고, 이 방법은 랜선 길이를 하나씩 줄여가며 확인하기 때문에, 입력 크기가 커질수록 비효율적이라는 것을 알게 되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;2. 이분 탐색 활용하기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이분 탐색을 활용하면 지정한 범위에서 조건에 맞지 않다면 랜선 길이의 범위를 반씩 줄여나가기 때문에 반복문보다 빠르게 최적값을 찾을 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1736832895955&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String[] input = br.readLine().split(&quot; &quot;);
        int k = Integer.parseInt(input[0]);
        int n = Integer.parseInt(input[1]);

        int[] kArr = new int[k];
        long max = 0;
        for(int i = 0; i &amp;lt; k; i++){
            kArr[i] = Integer.parseInt(br.readLine());
            if(kArr[i] &amp;gt; max) max = kArr[i];
        }

        long left = 1;
        long right = max;
        long result = 0;

        while(left &amp;lt;= right){
            long mid = left + (right - left) / 2;
            if(isPossible(kArr, mid, n)){
                result = mid;
                left = mid + 1;
            }else{
                right = mid - 1;
            }
        }
        System.out.println(result);
    }

    private static boolean isPossible(int[] arr, long mid, int n){
        long count = 0;
        for(int length : arr){
            count += length / mid;
        }
        return count &amp;gt;= n;
    }
    
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;이분 탐색 범위&lt;/b&gt;: 랜선의 최대 길이를 max라는 변수에 저장한 다음 이분탐색을 시작한다. 이분 탐색의 범위는 랜선의 최소 길이인 1부터 최대 길이인 max로 설정한다. mid 값은 혹시 모를 오버플로우를 대비하여 left + (right-right) / 2로 구한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;isPossible 함수:&lt;/b&gt;&amp;nbsp;랜선을 mid 길이로 자를 때, 만들어지는 랜선의 개수를 계산한다. count라는 변수를 두어 만들어진 총 랜선 길이를 계산하고 count가 n보다 크거나 같다면 true, 작다면 false를 리턴하도록 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;조건문: &lt;/b&gt;길이가 리턴 값이 true라면 최소 길이를 mid + 1로 설정하여 더 긴 길이를 탐색하도록 하고, false라면 더 짧은 길이를 탐색할 수 있도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;출력: &lt;/b&gt;이분 탐색의 종료 조건에 충족하면 반복문을 빠져나와 최댓값 result를 출력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;157&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uFq4u/btsLMXQS8EB/eI1Lqa4JD7c5pA888bju8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uFq4u/btsLMXQS8EB/eI1Lqa4JD7c5pA888bju8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uFq4u/btsLMXQS8EB/eI1Lqa4JD7c5pA888bju8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuFq4u%2FbtsLMXQS8EB%2FeI1Lqa4JD7c5pA888bju8K%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;1159&quot; height=&quot;157&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;157&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;회고&lt;/b&gt;&lt;/h4&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;size14&quot;&gt;이분 탐색을 활용하는 것이 더 빠르고 효율적으로 값을 탐색할 수 있다는 것을 다시 한번 경험한 문제였다. 반복문이 아닌 재귀 형식으로 탐색 범위를 좁여 나가는 방법도 익혀서 이분 탐색에 대한 이해도를 높여야겠다는 생각이 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;코테스터디 TIL&lt;/b&gt;&lt;/h4&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;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1736834003418&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;99클럽 코테 스터디 1일차 TIL (미들러)&quot; data-og-description=&quot;문제: 백준 2776번 암기왕&amp;nbsp;예제// Input 1154 1 5 2 351 3 7 9 5// Output 111001&amp;nbsp;&amp;nbsp;알고리즘 풀이 방법1. Binary Search(반복문, 재귀)2. Hash Set&amp;nbsp;수첩 1에 적힌 정수의 입력을 오름차순으로 정렬한 뒤, 이분 탐색을 &quot; data-og-host=&quot;become-programmer.tistory.com&quot; data-og-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-1%EC%9D%BC%EC%B0%A8-TIL&quot; data-og-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-1%EC%9D%BC%EC%B0%A8-TIL&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/49eId/hyX0s5hxC1/o0V6b3fjBuRxMar8uFLsc1/img.png?width=800&amp;amp;height=477&amp;amp;face=0_0_800_477,https://scrap.kakaocdn.net/dn/sshuM/hyX0nW9Zi8/C0rRFjekJbsOh4CraQAJ7K/img.png?width=800&amp;amp;height=477&amp;amp;face=0_0_800_477,https://scrap.kakaocdn.net/dn/cMcMDJ/hyX0ql3Nid/njQaxJ0vTU9rcLW18uSnXk/img.png?width=2336&amp;amp;height=1394&amp;amp;face=0_0_2336_1394&quot;&gt;&lt;a href=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-1%EC%9D%BC%EC%B0%A8-TIL&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-1%EC%9D%BC%EC%B0%A8-TIL&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/49eId/hyX0s5hxC1/o0V6b3fjBuRxMar8uFLsc1/img.png?width=800&amp;amp;height=477&amp;amp;face=0_0_800_477,https://scrap.kakaocdn.net/dn/sshuM/hyX0nW9Zi8/C0rRFjekJbsOh4CraQAJ7K/img.png?width=800&amp;amp;height=477&amp;amp;face=0_0_800_477,https://scrap.kakaocdn.net/dn/cMcMDJ/hyX0ql3Nid/njQaxJ0vTU9rcLW18uSnXk/img.png?width=2336&amp;amp;height=1394&amp;amp;face=0_0_2336_1394');&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;99클럽 코테 스터디 1일차 TIL (미들러)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제: 백준 2776번 암기왕&amp;nbsp;예제// Input 1154 1 5 2 351 3 7 9 5// Output 111001&amp;nbsp;&amp;nbsp;알고리즘 풀이 방법1. Binary Search(반복문, 재귀)2. Hash Set&amp;nbsp;수첩 1에 적힌 정수의 입력을 오름차순으로 정렬한 뒤, 이분 탐색을&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;become-programmer.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>알고리즘/99클럽 코테스터디 5기</category>
      <category>99클럽</category>
      <category>99클럽코테스터디</category>
      <category>til</category>
      <category>백준 랜선자르기 자바</category>
      <category>백준1654번</category>
      <category>코테스터디 2일차</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/330</guid>
      <comments>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-2%EC%9D%BC%EC%B0%A8-TIL#entry330comment</comments>
      <pubDate>Tue, 14 Jan 2025 14:51:54 +0900</pubDate>
    </item>
    <item>
      <title>99클럽 코테 스터디 1일차 TIL (미들러)</title>
      <link>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-1%EC%9D%BC%EC%B0%A8-TIL</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제: 백준 2776번 암기왕&lt;/b&gt;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-01-13 오후 9.36.02.png&quot; data-origin-width=&quot;2336&quot; data-origin-height=&quot;1394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9CMV4/btsLMbn2P7C/UxZuB3nPJkuN0BhNdQePoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9CMV4/btsLMbn2P7C/UxZuB3nPJkuN0BhNdQePoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9CMV4/btsLMbn2P7C/UxZuB3nPJkuN0BhNdQePoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9CMV4%2FbtsLMbn2P7C%2FUxZuB3nPJkuN0BhNdQePoK%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;2336&quot; height=&quot;1394&quot; data-filename=&quot;스크린샷 2025-01-13 오후 9.36.02.png&quot; data-origin-width=&quot;2336&quot; data-origin-height=&quot;1394&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1736771905841&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Input 1
1
5
4 1 5 2 3
5
1 3 7 9 5

// Output 1
1
1
0
0
1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;1. Binary Search(반복문, 재귀)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;2. Hash Set&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;수첩 1에 적힌 정수의 입력을 오름차순으로 정렬한 뒤, 이분 탐색을 이용해 푸는 방법과, 유니크한 키만 가질 수 있다는 특성을 활용하여 HashSet 혹은 HashMap으로 풀어 보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;1. Binary Search&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;수첩 2에 적힌 수가 수첩 1에 포함되어 있는 가를 확인하는 문제이기 때문에 이분탐색을 이용해서 풀 수 있겠다는 생각이 들었다. 이분 탐색을 진행하려면 우선 정렬이 되어 있어야 하기 때문에, Arrays.sort() 메서드를 활용해서 오름차순 정렬을 시켰다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;1-1 재귀형식&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1736772681363&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 NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        StringBuilder sb = new StringBuilder(); 
        int t = Integer.parseInt(br.readLine());

        while(t-- &amp;gt; 0){
            int n = Integer.parseInt(br.readLine());

            int[] nArr = new int[n];
            
            StringTokenizer st = new StringTokenizer(br.readLine(), &quot; &quot;);
            for(int i = 0; i &amp;lt; n; i++){
                nArr[i] = Integer.parseInt(st.nextToken());
            }

            Arrays.sort(nArr);

            int m = Integer.parseInt(br.readLine());

            st = new StringTokenizer(br.readLine(), &quot; &quot;);
            for(int i = 0; i &amp;lt; m; i++){
                int num = Integer.parseInt(st.nextToken());
                int result = binarySearch(num, nArr);
                sb.append(result).append(&quot;\n&quot;);
            }
            
        }

        System.out.println(sb);
    }

    private static int binarySearch(int target, int[] nArr){
        int start = 0; 
        int end = nArr.length - 1;

        while(start &amp;lt;= end){
            int mid = start + (end - start) / 2;

            if(nArr[mid] == target) return 1;
            else if(nArr[mid] &amp;lt; target) start = mid + 1;
            else end = mid - 1;
        }

        return 0;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;이후에는 반복문을 이용하여 이분 탐색을 할 수 있는 메서드를 호출했다. 처음 시도에는 재귀 형식으로 구현했다. 재귀 형식은 간결하다는 특징이 있지만 오버플로우의 위험이나 가독성이 좋지 않기에 반복문을 이용해서도 구현해 보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;1-2 반복문 활용&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1736772710837&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 NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        StringBuilder sb = new StringBuilder();
        int t = Integer.parseInt(br.readLine());

        while(t-- &amp;gt; 0){
            int n = Integer.parseInt(br.readLine());

            int[] nArr = new int[n];
            
            StringTokenizer st = new StringTokenizer(br.readLine(), &quot; &quot;);
            for(int i = 0; i &amp;lt; n; i++){
                nArr[i] = Integer.parseInt(st.nextToken());
            }

            Arrays.sort(nArr);

            int m = Integer.parseInt(br.readLine());

            st = new StringTokenizer(br.readLine(), &quot; &quot;);
            for(int i = 0; i &amp;lt; m; i++){
                int num = Integer.parseInt(st.nextToken());
                int result = binarySearch(num, 0, nArr.length - 1, nArr);
                sb.append(result).append(&quot;\n&quot;);
            }
            
        }

        System.out.println(sb);
    }

    private static int binarySearch(int num, int start, int end, int[] nArr){
        if(start &amp;gt; end) return 0;

        int mid = start + (end - start) /2;

        if(num == nArr[mid]) return 1;
        else if(num &amp;lt; nArr[mid]) return binarySearch(num, start, mid - 1, nArr);
        else return binarySearch(num, mid + 1, end, nArr);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;2. HashSet&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;Set이라는 자료구조는 중복 값을 저장하지 않는다는 특징을 가지고 있다. 또한 HashSet은 해쉬 알고리즘으로 동작해 총 시간 복잡도가 O(n + m)으로 탐색 속도가 빠르다. 이때에 HashSet이 아닌 HashMap을 사용해도 된다. 하지만 불필요하게 메모리를 더 차지하게 되기에 HashSet을 사용하여 구현하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1736772726978&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 NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        StringBuilder sb = new StringBuilder();
        int t = Integer.parseInt(br.readLine());

        Set&amp;lt;Integer&amp;gt; set;
        while(t-- &amp;gt; 0){
            int n = Integer.parseInt(br.readLine());

            set = new HashSet&amp;lt;&amp;gt;();
            
            StringTokenizer st = new StringTokenizer(br.readLine(), &quot; &quot;);
            for(int i = 0; i &amp;lt; n; i++){
                set.add(Integer.parseInt(st.nextToken()));
            }

            int m = Integer.parseInt(br.readLine());

            st = new StringTokenizer(br.readLine(), &quot; &quot;);
            for(int i = 0; i &amp;lt; m; i++){
                int token = Integer.parseInt(st.nextToken());
                if(set.contains(token)){
                    sb.append(1);
                }else{
                    sb.append(0);
                }
                sb.append(&quot;\n&quot;);
            }
        }

        System.out.println(sb);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;여러 가지 방향으로 풀어보니 자료구조의 특징이나, 어떤 방식이 더 효율적인지 알게 된 것 같다. 코테 스터디 첫 날인만큼 집중해서 풀었는데 이러한 마음가짐이 마지막까지 지속되었으면 좋을 것 같다.&lt;/p&gt;</description>
      <category>알고리즘/99클럽 코테스터디 5기</category>
      <category>99클럽</category>
      <category>99클럽코테스터디</category>
      <category>til</category>
      <category>백준 암기왕 자바</category>
      <category>백준2776번</category>
      <category>코테스터디 1일차</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/329</guid>
      <comments>https://become-programmer.tistory.com/entry/99%ED%81%B4%EB%9F%BD-%EC%BD%94%ED%85%8C-%EC%8A%A4%ED%84%B0%EB%94%94-1%EC%9D%BC%EC%B0%A8-TIL#entry329comment</comments>
      <pubDate>Mon, 13 Jan 2025 21:56:02 +0900</pubDate>
    </item>
    <item>
      <title>Spring boot + Docker + Jenkins + GCP SSL 인증서 적용하기(HTTPS)</title>
      <link>https://become-programmer.tistory.com/entry/Spring-boot-Docker-Jenkins-GCP-SSL-%EC%9D%B8%EC%A6%9D%EC%84%9C-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0HTTPS</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;API 개발을 다 끝내고 마무리 하는 타이밍에 vercel로 배포하려면 Https 요청만 가능하다고 프론트 개발자 분께서 이야기 하셨다.&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;1. 도메인 발급(내도메인.한국)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. CerBot을 통해서 인증서 발급(GCP)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. PEM 인증서를 PKCS12 형태로 변환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Spring boot에 인증서 적용하기(Putty, 파일질라)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 재배포하기(Docker, Jenkins)&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;h3 data-ke-size=&quot;size23&quot;&gt;1. 도메인 발급&lt;/h3&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;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1734062413053&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;내도메인.한국 - 한글 무료 도메인 등록센터&quot; data-og-description=&quot;한글 무료 도메인 내도메인.한국, 웹포워딩, DNS 등 무료 도메인 기능 제공&quot; data-og-host=&quot;xn--220b31d95hq8o.xn--3e0b707e&quot; data-og-source-url=&quot;https://xn--220b31d95hq8o.xn--3e0b707e/&quot; data-og-url=&quot;https://xn--220b31d95hq8o.xn--3e0b707e/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://xn--220b31d95hq8o.xn--3e0b707e/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://xn--220b31d95hq8o.xn--3e0b707e/&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;내도메인.한국 - 한글 무료 도메인 등록센터&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;한글 무료 도메인 내도메인.한국, 웹포워딩, DNS 등 무료 도메인 기능 제공&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;xn--220b31d95hq8o.xn--3e0b707e&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;
&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;965&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JQMWD/btsLiCSH4xT/aYh4M53nLhTqZX3ug7rqO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JQMWD/btsLiCSH4xT/aYh4M53nLhTqZX3ug7rqO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JQMWD/btsLiCSH4xT/aYh4M53nLhTqZX3ug7rqO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJQMWD%2FbtsLiCSH4xT%2FaYh4M53nLhTqZX3ug7rqO1%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;965&quot; height=&quot;514&quot; data-origin-width=&quot;965&quot; data-origin-height=&quot;514&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;IP연결에서 구글 클라우드로 사용중인 인스턴스 IP 주소를 입력하고 등록하면 된다.&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;2. Certbot으로 인증서 발급&lt;/h3&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;size16&quot;&gt;발급 종류에는 standalone, webroot, DNS 총 세가지 방법이 있는데 나는 standalone를 선택했다.&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;Ubuntu 서버에 apt를 사용하여 certbot를 설치해도 되지만, 난 도커가 이미 깔려 있어서 도커를 이용해서 certbot 이미지를 가져왔다.&lt;/p&gt;
&lt;pre id=&quot;code_1734062754852&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo docker pull certbot/certbot&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_1734062794584&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run -it --rm --name certbot \
  -v  컨테이너외부폴더:/etc/letsencrypt \
  -v  컨테이너외부폴더:/var/lib/letsencrypt \
  -p 80:80 certbot/certbot certonly --standalone --preferred-challenges http -d 도메인주소&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;GCP 인스턴스에 certbot이라는 폴더를 생성하고 pwd 명령어로 주소를 가져와 [컨테이너외부폴더]에 붙여넣었다.&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;마지막 줄에는 cerbot 방식과 도메인 주소를 넣어줬다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;볼륨을 통해 연결한 폴더에&amp;nbsp; /live/도메인이름 으로 이동하면 4개의 키가 생성된 것을 알 수 있다.&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;490&quot; data-origin-height=&quot;14&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uDtZC/btsLhK44lvP/P2BA6g4u9CTXwXyoqnsIeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uDtZC/btsLhK44lvP/P2BA6g4u9CTXwXyoqnsIeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uDtZC/btsLhK44lvP/P2BA6g4u9CTXwXyoqnsIeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuDtZC%2FbtsLhK44lvP%2FP2BA6g4u9CTXwXyoqnsIeK%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;490&quot; height=&quot;14&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;14&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: #ffffff; color: #353638; text-align: left;&quot;&gt;&lt;span&gt;여기서는 &lt;/span&gt;privkey.pem, fullchain.pem, chain.pem 키만 사용한다.&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;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;3. PEM to PKCS12 변경&lt;/span&gt;&lt;/h3&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;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;해당 인스턴스에 OpenSSL를 설치한다. &lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1734063461297&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt update
sudo apt install openssl&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;pre id=&quot;code_1734063494702&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;openssl pkcs12 -export -inkey privkey.pem  -in fullchain.pem -out keystore.p12
-name tomcat -CAfile chain.pem -caname root&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;이렇게 되면 해당 키가 들어있는 폴더에 keystore.p12라는 파일이 생기게 된다.&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;4. Spring boot에 인증서 적용하기&lt;/h3&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;size16&quot;&gt;이제 이 파일을 Spring boot에 적용하기 위해서 인스턴스에 저장되어 있는 해당 인증서를 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;putty와 파일질라를 이용해서 가져와야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1734063715751&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;GCP VM 인스턴스 FileZilla로 파일 전송하기&quot; data-og-description=&quot;공부를 위해 Google Cloud Platform의 VM 인스턴스를 사용하던 중 Local의 파일을 VM 인스턴스로 전송해야 하는 일이 생겼다.VM 인스턴스와 FileZilla를 어떻게 연결하는지 알아보도록 한다.먼저 PuTTYgen을 실&quot; data-og-host=&quot;velog.io&quot; data-og-source-url=&quot;https://velog.io/@pjh612/GCP-VM-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-FileZilla%EB%A1%9C-%ED%8C%8C%EC%9D%BC-%EC%A0%84%EC%86%A1%ED%95%98%EA%B8%B0&quot; data-og-url=&quot;https://velog.io/@pjh612/GCP-VM-인스턴스-FileZilla로-파일-전송하기&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ctxfS2/hyXOqea75T/uhNkM5Fl9kC8v2lOVkvGXk/img.png?width=341&amp;amp;height=62&amp;amp;face=0_0_341_62,https://scrap.kakaocdn.net/dn/9o7pq/hyXOkruCdY/42PXcxycZmR5egCdboC3u0/img.png?width=341&amp;amp;height=62&amp;amp;face=0_0_341_62,https://scrap.kakaocdn.net/dn/OBlZw/hyXOif8Mxu/TEnVAPRg0KG4GkkJx9XNW0/img.png?width=902&amp;amp;height=710&amp;amp;face=0_0_902_710&quot;&gt;&lt;a href=&quot;https://velog.io/@pjh612/GCP-VM-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-FileZilla%EB%A1%9C-%ED%8C%8C%EC%9D%BC-%EC%A0%84%EC%86%A1%ED%95%98%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://velog.io/@pjh612/GCP-VM-%EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4-FileZilla%EB%A1%9C-%ED%8C%8C%EC%9D%BC-%EC%A0%84%EC%86%A1%ED%95%98%EA%B8%B0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ctxfS2/hyXOqea75T/uhNkM5Fl9kC8v2lOVkvGXk/img.png?width=341&amp;amp;height=62&amp;amp;face=0_0_341_62,https://scrap.kakaocdn.net/dn/9o7pq/hyXOkruCdY/42PXcxycZmR5egCdboC3u0/img.png?width=341&amp;amp;height=62&amp;amp;face=0_0_341_62,https://scrap.kakaocdn.net/dn/OBlZw/hyXOif8Mxu/TEnVAPRg0KG4GkkJx9XNW0/img.png?width=902&amp;amp;height=710&amp;amp;face=0_0_902_710');&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;GCP VM 인스턴스 FileZilla로 파일 전송하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;공부를 위해 Google Cloud Platform의 VM 인스턴스를 사용하던 중 Local의 파일을 VM 인스턴스로 전송해야 하는 일이 생겼다.VM 인스턴스와 FileZilla를 어떻게 연결하는지 알아보도록 한다.먼저 PuTTYgen을 실&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;velog.io&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;위를 참조해서 파일을 가져오면 스프링 프로젝트의 resources 밑에 keystore.p12를 적용하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;227&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNkTGa/btsLilqgofT/984rZvbiygErbXcXk5ujgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNkTGa/btsLilqgofT/984rZvbiygErbXcXk5ujgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNkTGa/btsLilqgofT/984rZvbiygErbXcXk5ujgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNkTGa%2FbtsLilqgofT%2F984rZvbiygErbXcXk5ujgK%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;227&quot; height=&quot;162&quot; data-origin-width=&quot;227&quot; data-origin-height=&quot;162&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;그리고 application.yml에 키 경로, 형식, 비밀번호를 입력해주면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;306&quot; data-origin-height=&quot;135&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MlqWj/btsLh497I5a/ZId6h6mtKkAFAaaaZBJ6W0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MlqWj/btsLh497I5a/ZId6h6mtKkAFAaaaZBJ6W0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MlqWj/btsLh497I5a/ZId6h6mtKkAFAaaaZBJ6W0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMlqWj%2FbtsLh497I5a%2FZId6h6mtKkAFAaaaZBJ6W0%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;306&quot; height=&quot;135&quot; data-origin-width=&quot;306&quot; data-origin-height=&quot;135&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;이렇게 하면 HTTPS 적용이 마무리된다!&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;/h3&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;size16&quot;&gt;로컬에서는 잘 돌아가는데, 서버에 올리면 도커 컨테이너가 자꾸 내려갔다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;885&quot; data-origin-height=&quot;538&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w3XtQ/btsLg9xB534/Fj2PJUOHDvaG5OC5neYynk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w3XtQ/btsLg9xB534/Fj2PJUOHDvaG5OC5neYynk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w3XtQ/btsLg9xB534/Fj2PJUOHDvaG5OC5neYynk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw3XtQ%2FbtsLg9xB534%2FFj2PJUOHDvaG5OC5neYynk%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;885&quot; height=&quot;538&quot; data-origin-width=&quot;885&quot; data-origin-height=&quot;538&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;java.lang.IllegalStateException: Unable to create key store: Could not load store form 'classpath:keystore.p12'&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;/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;</description>
      <category>프로젝트/팀 프로젝트</category>
      <category>ssl 인증서 적용</category>
      <category>스프링 https 통신</category>
      <category>스프링 ssl 인증서</category>
      <category>스프링 프로젝트</category>
      <category>스프링부트 https</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/328</guid>
      <comments>https://become-programmer.tistory.com/entry/Spring-boot-Docker-Jenkins-GCP-SSL-%EC%9D%B8%EC%A6%9D%EC%84%9C-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0HTTPS#entry328comment</comments>
      <pubDate>Fri, 13 Dec 2024 13:30:47 +0900</pubDate>
    </item>
    <item>
      <title>Linked List Cycle</title>
      <link>https://become-programmer.tistory.com/entry/Linked-List-Cycle</link>
      <description>&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Solution&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Given&lt;span&gt;&amp;nbsp;&lt;/span&gt;head, the head of a linked list, determine if the linked list has a cycle in it.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;There is a cycle in a linked list if there is some node in the list that can be reached again by continuously following the&amp;nbsp;next&amp;nbsp;pointer. Internally,&lt;span&gt;&amp;nbsp;&lt;/span&gt;pos&amp;nbsp;is used to denote the index of the node that&amp;nbsp;tail's&amp;nbsp;next&amp;nbsp;pointer is connected to.&amp;nbsp;&lt;b&gt;Note that&amp;nbsp;pos&amp;nbsp;is not passed as a parameter&lt;/b&gt;.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Return&amp;nbsp;true&lt;span&gt;&amp;nbsp;&lt;/span&gt;if there is a cycle in the linked list. Otherwise, return&lt;span&gt;&amp;nbsp;&lt;/span&gt;false.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Examples&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 1:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;531&quot; data-origin-height=&quot;171&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJO2CG/btsKC20JpPw/lvPwd0B4uJ8HVMkrOJ70I1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJO2CG/btsKC20JpPw/lvPwd0B4uJ8HVMkrOJ70I1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJO2CG/btsKC20JpPw/lvPwd0B4uJ8HVMkrOJ70I1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJO2CG%2FbtsKC20JpPw%2FlvPwd0B4uJ8HVMkrOJ70I1%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;531&quot; height=&quot;171&quot; data-origin-width=&quot;531&quot; data-origin-height=&quot;171&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #f5f5f5; color: #333333; text-align: start;&quot;&gt;&lt;code&gt;Input: head = [3,2,0,-4], pos = 1
Output: true
Explanation: There is a cycle in the linked list, where the tail connects to the 1st node (0-indexed).
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;201&quot; data-origin-height=&quot;105&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIyBG9/btsKFekEEDv/PVhYtIpmf1XefkawgbSPQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIyBG9/btsKFekEEDv/PVhYtIpmf1XefkawgbSPQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIyBG9/btsKFekEEDv/PVhYtIpmf1XefkawgbSPQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIyBG9%2FbtsKFekEEDv%2FPVhYtIpmf1XefkawgbSPQk%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;201&quot; height=&quot;105&quot; data-origin-width=&quot;201&quot; data-origin-height=&quot;105&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;xquery&quot; style=&quot;background-color: #f5f5f5; color: #333333; text-align: start;&quot;&gt;&lt;code&gt;Input: head = [1,2], pos = 0
Output: true
Explanation: There is a cycle in the linked list, where the tail connects to the 0th node.
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 3:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;65&quot; data-origin-height=&quot;65&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/znL58/btsKEQdo1km/yK0c50pOjr0XJ7iDe526y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/znL58/btsKEQdo1km/yK0c50pOjr0XJ7iDe526y1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/znL58/btsKEQdo1km/yK0c50pOjr0XJ7iDe526y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FznL58%2FbtsKEQdo1km%2FyK0c50pOjr0XJ7iDe526y1%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;65&quot; height=&quot;65&quot; data-origin-width=&quot;65&quot; data-origin-height=&quot;65&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;yaml&quot; style=&quot;background-color: #f5f5f5; color: #333333; text-align: start;&quot;&gt;&lt;code&gt;Input: head = [1], pos = -1
Output: false
Explanation: There is no cycle in the linked list.
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&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;The number of the nodes in the list is in the range&lt;span&gt;&amp;nbsp;&lt;/span&gt;[0, 104].&lt;/li&gt;
&lt;li&gt;-105&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;= Node.val &amp;lt;= 105&lt;/li&gt;
&lt;li&gt;pos&lt;span&gt;&amp;nbsp;&lt;/span&gt;is&lt;span&gt;&amp;nbsp;&lt;/span&gt;-1&lt;span&gt;&amp;nbsp;&lt;/span&gt;or a&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;valid index&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;in the linked-list.&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;Explanation&lt;/h4&gt;
&lt;pre id=&quot;code_1731299838225&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class Solution {
    public boolean hasCycle(ListNode head) {
        if(head == null) return false;
        ListNode walker = head, runner = head;
        while(runner.next != null &amp;amp;&amp;amp; runner.next.next != null){
            walker = walker.next;
            runner = runner.next.next;
            if(walker == runner) return true;
        }
        return false;
        
    }
}&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;1. The problem with Cycles&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In a linked list, if there is a cycle, some node will eventually point back to a previous node, causing an infinite loop. Without a mechanism to detect this, a standard traversal would never stop. Therefore, we use a two-pointer algorithm to check if it has a cycle in it.&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;2. Two-Pointer Approach&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;There are two ListNodes; one node, runner, moves twice as fast as the other, walker. If there is no cycle in it, the runner pointer will eventually reach the end of the list, the loop will terminate, and return false. If there is a cycle, the runner pointer will eventually &quot;lap&quot; the walker pointer. This is because the runner is moving faster, so it will finally catch up to the walker in the cycle. If this happens, the function returns true.&lt;/p&gt;</description>
      <category>알고리즘/Leetcode</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>linked list cycle</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/327</guid>
      <comments>https://become-programmer.tistory.com/entry/Linked-List-Cycle#entry327comment</comments>
      <pubDate>Mon, 11 Nov 2024 13:52:21 +0900</pubDate>
    </item>
    <item>
      <title>Palindrome Linked List</title>
      <link>https://become-programmer.tistory.com/entry/Palindrome-Linked-List</link>
      <description>&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Solution&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Given the&lt;span&gt;&amp;nbsp;&lt;/span&gt;head&lt;span&gt;&amp;nbsp;&lt;/span&gt;of a singly linked list, return&lt;span&gt;&amp;nbsp;&lt;/span&gt;true&lt;span&gt;&amp;nbsp;&lt;/span&gt;if it is a&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span data-keyword=&quot;palindrome-sequence&quot;&gt;palindrome&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;or&lt;span&gt;&amp;nbsp;&lt;/span&gt;false&lt;span&gt;&amp;nbsp;&lt;/span&gt;otherwise.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Examples&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 1:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;62&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chgQ2R/btsKEQjR3sP/S7vBmKx4MbOvbyU4ByFnhk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chgQ2R/btsKEQjR3sP/S7vBmKx4MbOvbyU4ByFnhk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chgQ2R/btsKEQjR3sP/S7vBmKx4MbOvbyU4ByFnhk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchgQ2R%2FbtsKEQjR3sP%2FS7vBmKx4MbOvbyU4ByFnhk%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;422&quot; height=&quot;62&quot; data-origin-width=&quot;422&quot; data-origin-height=&quot;62&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #f5f5f5; color: #333333; text-align: start;&quot;&gt;&lt;code&gt;Input: head = [1,2,2,1]
Output: true
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;182&quot; data-origin-height=&quot;62&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xbDKF/btsKDsExRPJ/Bh1rSaLwjX1rX7CR5oD7v1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xbDKF/btsKDsExRPJ/Bh1rSaLwjX1rX7CR5oD7v1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xbDKF/btsKDsExRPJ/Bh1rSaLwjX1rX7CR5oD7v1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxbDKF%2FbtsKDsExRPJ%2FBh1rSaLwjX1rX7CR5oD7v1%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;182&quot; height=&quot;62&quot; data-origin-width=&quot;182&quot; data-origin-height=&quot;62&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;yaml&quot; style=&quot;background-color: #f5f5f5; color: #333333; text-align: start;&quot;&gt;&lt;code&gt;Input: head = [1,2]
Output: false
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&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;The number of nodes in the list is in the range&lt;span&gt;&amp;nbsp;&lt;/span&gt;[1, 105].&lt;/li&gt;
&lt;li&gt;0 &amp;lt;= Node.val &amp;lt;= 9&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;Explanation&lt;/h4&gt;
&lt;pre id=&quot;code_1731292889602&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public boolean isPalindrome(ListNode head) {
    	// Find the middle ListNode
        ListNode slow = head, fast = head, prev, temp;
        while(fast != null &amp;amp;&amp;amp; fast.next != null){
            slow = slow.next;
            fast = fast.next.next;
        }

	// Reverse the Half list
        prev = slow;
        slow = slow.next;
        prev.next = null;
        while(slow != null){
            temp = slow.next;
            slow.next = prev;
            prev = slow;
            slow = temp;
        }
        
        // Iterate over two pointers, one starting from the first element 
        // and the other from the last, moving inward while checking if the values match
        fast = head;
        slow = prev;
        while(slow != null){
            if(fast.val != slow.val) return false;
            fast = fast.next;
            slow = slow.next;
        }
        return true;
    }
                                        
}&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: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span&gt;1. Find the middle in the given ListNode&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span&gt; We use the two-pointer technique to find the middle of the linked list. One pointer, fast, moves twice as fast as the other, slow. When fast reaches the end of the list (i.e., fast or fast.next is null), the slow pointer will be at the middle of the list. If the number of nodes is even, slow will point to the second half of the list (after the middle node). &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;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;2. Reverse the Half of the list&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;After finding the middle of the list, we reverse the second half. This is crucial because to check if the linked list is a palindrome, we need to compare the first half of the list with the reversed second half. Since singly linked lists do not allow backward traversal, reversing the second half of the list makes it easier to compare the two halves.&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;For example, for the list [1, 2, 4, 4, 2, 1], after finding the middle and reversing the second half [4, 2, 1], the list becomes [1, 2, 4] and [1, 2, 4], which can then be compared node by node&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: #ffffff; color: #000000; text-align: start;&quot;&gt;3. Check if values match&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Now, with two pointers, one starting from the head of the list (the first element) and the other starting from the reversed second half, we move inward, comparing the values of the nodes. If at any point the values don&amp;rsquo;t match, return false. If all values match, return true, indicating that the list is a palindrome.&lt;/p&gt;</description>
      <category>알고리즘/Leetcode</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>palindromelinkedlist</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/326</guid>
      <comments>https://become-programmer.tistory.com/entry/Palindrome-Linked-List#entry326comment</comments>
      <pubDate>Mon, 11 Nov 2024 12:01:31 +0900</pubDate>
    </item>
    <item>
      <title>Java Concurrency - Java Memory Area &amp;amp; JMM</title>
      <link>https://become-programmer.tistory.com/entry/Java-Concurrency-Java-Memory-Area-JMM</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Java Memory Area&lt;/b&gt;&lt;/h3&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;size14&quot;&gt;The area where data is shared with all threads: Method Area, Heap.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;The thread-private data area: Program Counter Register, VM Stack, Native Method Stack.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;When running a program, the JVM automatically divides the memory it manages into the above areas, each of which has its own purpose and the timing of creation and destruction.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; The area where data is shared with all threads&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;b&gt;Method Area&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;It is mainly used to store class information, constants, static variables, code complied by the just-in-time compiler, and other data that have been loaded by the virtual machine.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;Runtime Constant Pool in the Method area&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;It is used to store various literals and symbolic references generated by the compiler after class loading for subsequent use.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;* literals: Similar to the concept of constants at the Java language level, including text strings, constant values declared as final, etc.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;* Symbolic references: Concepts at the compilation language level (class names, variable names, method names, etc).&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;To distinguish the concepts of several of &quot;constant pools&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;1. Constant pool: The constant pool is determined during data compilation and is part of the Class file. It stores constants in classes, methods, interfaces, etc., including string constants.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;2. String Pool/String Constant Pool: It is a part of the constant pool and stores string-type data generated in the compiled class.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;3. Runtime Constant Pool: Part of the method area, shared by all threads. After the virtual machine loads the Class, it puts the data in the constant pool into the runtime constant pool.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;b&gt;JVM Heap&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;It is created when the virtual machine starts and is the largest piece of memory managed by the JVM. It is used to store object instances, and almost all object instances are allocated memory here. Because the Java heap is the main area managed by the garbage collector, it is often called the GC heap.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; The thread-private data area &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;&lt;b&gt;Program Counter Register&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;It is a small memory space, mainly representing the bytecode line number indicator executed by the current thread. When the bytecode interpreter works, it selects the instruction to be executed by changing the value of this counter.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;&lt;b&gt;Java Virtual Machine Stacks&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;It is created simultaneously with the thread, and the total number is associated with the thread, representing the memory model for the execution of Java methods. When each method is executed, a stack frame is created to store local variable tables, operand stacks, dynamic links, method exits, and other information.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- Local Variable Table: It is allocated during the compilation period and is used to store method parameters and local variables defined within the method. It may be basic types, object references, or a handle pointing to an object or other location related to, and returnAddress types, with Slot as the minimum unit of capacity.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- Operand Stack: It is also often called the operation stack, and each element in the stack can be any Java data type. During the execution of the method, various bytecodes will be directed to write and extract values in the operand stack, that is, push and pop operations.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- Dynamic Linking: Each stack frame contains a reference to the method in the runtime constant pool to which the stack frame belongs. Holding this reference is to support dynamic linking during the method call process.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;- Method Exit: Normal exit, the execution engine encounters the bytecode of the method return and passes the return value to the caller. Abnormal exit, when encountering an Exception and the method does not catch the exception, there will be no return value.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;&lt;b&gt;Native Method Stacks&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;It is mainly related to the native methods used by the virtual machine and used to distinguish the division of the Java memory model from the division of the Java memory area. After all, these two divisions belongs to different levels of concepts.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Java Memory Model&lt;/b&gt;&lt;/h3&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;size14&quot;&gt;It is an abstract concept that does not actually exist. It describes a set of rules or specifications. Through this set of specifications, the access methods of various variables in the program are defined. In addition, the CPU and compiler need to cooperate with this specification to make it easier for developers to develop multithreaded programs.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;Since the entity running the program in the JVM is a thread, each thread has its own working memory for storing thread-private data. The Java Memory Model stipulates that all variables are in the main memory, which is a shared memory area that all threads can access. Threads cannot directly operate on the variables in the main memory but must first copy the variables from the main memory to their own working memory, operate on the variables in the working memory to their own working memory, operate on the variables in the working memory, and then write them back to the main memory after completion. Since the working memory is a private area for each thread, different threads cannot access each other's working memory, and communication between threads must go through the main memory.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;It should be noted that the division of the JMM and the Java memory area is at a different conceptual level. In other words, the JMM describes a set of rules that control the access methods of various variables in the shared data area and the private data area in the program. The JMM revolves around atomicity, orderliness, and visibility.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;The only similarity between the JMM and the Java memory area is that there are both shared data areas and private data areas. In the JMM, the main memory belongs to the shared data area, and to some extent, it should include the heap and the method area, while the working memory data thread private data area, to some extent, should include the program counter, the virtual machine stack, and the local method stack.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #c1bef9;&quot;&gt;&lt;b&gt;Main Memory&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;It mainly stores Java instance objects. All instance objects created by threads are stored in the main memory, regardless of whether the instance object is a member variable or a local variable in a method, and of course, shared class information, constants, and static variables are also included. Since it is a shared data area, multiple threads accessing the same variable may encounter thread safety issues.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;background-color: #c1bef9;&quot;&gt;&lt;b&gt;Working Memory&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;It stores all the local variable information of the current method (the working memory stores a copy of the variables in the main memory). Each thread can only access its own working memory; that is, the local variables in the thread are invisible to other threads. Even if two threads execute the same code, they will each create local variables belonging to the current thread in their own working memory, including the bytecode line number indicator and information about related Native methods. So the data stored in the working memory does not have thread safety issues.&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;size14&quot;&gt;According to the virtual machine specification, for a member method in an instance object, if the method contains local variables and isiof a basic data type, it will be directly stored in the local variable table of the stack frame structure in the working memory.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;If the local variable is of a reference type, then the specific reference address of the object in memory will be stored in the local variable table of the stack frame structure in the working memory, while the specific instance object will be stored in the main memory.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;However, for the member variables of an instance object, whether it is a basic data type, a wrapper type such as Integer, Double, or a reference type, they will all be stored in the heap area. As for static variables and class-related information itself, they will be stored in the main memory.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>JAVA &amp;amp; SPRING/자바</category>
      <category>java concurrency</category>
      <category>java memory area</category>
      <category>Java Memory Model</category>
      <category>JMM</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/322</guid>
      <comments>https://become-programmer.tistory.com/entry/Java-Concurrency-Java-Memory-Area-JMM#entry322comment</comments>
      <pubDate>Sat, 9 Nov 2024 13:44:35 +0900</pubDate>
    </item>
    <item>
      <title>Merge Two Sorted Lists</title>
      <link>https://become-programmer.tistory.com/entry/Merge-Two-Sorted-Lists</link>
      <description>&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Solution&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;You are given the heads of two sorted linked lists&lt;span&gt;&amp;nbsp;&lt;/span&gt;list1&lt;span&gt;&amp;nbsp;&lt;/span&gt;and&lt;span&gt;&amp;nbsp;&lt;/span&gt;list2.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Merge the two lists into one&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;sorted&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;list. The list should be made by splicing together the nodes of the first two lists.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Return&lt;span&gt;&amp;nbsp;&lt;/span&gt;the head of the merged linked list.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Examples&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 1:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ypEJE/btsKCmb2AiO/rFwHiZRumrzSjHEE7RKgI1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ypEJE/btsKCmb2AiO/rFwHiZRumrzSjHEE7RKgI1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ypEJE/btsKCmb2AiO/rFwHiZRumrzSjHEE7RKgI1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FypEJE%2FbtsKCmb2AiO%2FrFwHiZRumrzSjHEE7RKgI1%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;662&quot; height=&quot;302&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;302&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #f5f5f5; color: #333333; text-align: start;&quot;&gt;&lt;code&gt;Input: list1 = [1,2,4], list2 = [1,3,4]
Output: [1,1,2,3,4,4]
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 2:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;inform7&quot; style=&quot;background-color: #f5f5f5; color: #333333; text-align: start;&quot;&gt;&lt;code&gt;Input: list1 = [], list2 = []
Output: []
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Example 3:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;inform7&quot; style=&quot;background-color: #f5f5f5; color: #333333; text-align: start;&quot;&gt;&lt;code&gt;Input: list1 = [], list2 = [0]
Output: [0]
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Constraints:&lt;/b&gt;&lt;/p&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;The number of nodes in both lists is in the range&lt;span&gt;&amp;nbsp;&lt;/span&gt;[0, 50].&lt;/li&gt;
&lt;li&gt;-100 &amp;lt;= Node.val &amp;lt;= 100&lt;/li&gt;
&lt;li&gt;Both&lt;span&gt;&amp;nbsp;&lt;/span&gt;list1&lt;span&gt;&amp;nbsp;&lt;/span&gt;and&lt;span&gt;&amp;nbsp;&lt;/span&gt;list2&lt;span&gt;&amp;nbsp;&lt;/span&gt;are sorted in&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;non-decreasing&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;order.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Explanation&lt;/h4&gt;
&lt;pre id=&quot;code_1731040093506&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Solution {
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        ListNode newNode = new ListNode(0);
        ListNode currNode = newNode;
        
        while(list1 != null &amp;amp;&amp;amp; list2 != null){
            if(list1.val &amp;lt; list2.val){
                currNode.next = list1;
                list1 = list1.next;
            }else{
                currNode.next = list2;
                list2 = list2.next;
            }
            currNode = currNode.next;   
        }
        
        if(list1 != null){
            currNode.next = list1;
            list1 = list1.next;
        }
        
        if(list2 != null){
            currNode.next = list2;
            list2 = list2.next;
        }
        
        return newNode.next;
        
    }
}&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;newNode: It is a dummy node and created with an arbitrary value (0 in this case) to make managing the merged list simpler.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;currNode: It is initialized to point to newNode. It will move through the new list as nodes are added.&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;A while loop runs as long as both list1 and list2 are non-null.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Inside this loop, if list1's current value is smaller than list2's, currNode.next is set to list1's current node, and list1 moves to its next node. Otherwise, currNode.next is set to list2's current node, and list2 moves to its next node. currNode is then updated to its next node in the new merged list, effectively adding the selected node to the merged list.&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;After exiting the while loop, if either list1 or list2 still has nodes left, they are already sorted, so we attach the remaining nodes to currNode.next.&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;Finally, the merged list starts at newNode.next since newNode is just a dummy. This merged list is returned.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/Leetcode</category>
      <category>Java</category>
      <category>leetcode</category>
      <category>linkedlist</category>
      <category>mergeTwoSortedLists</category>
      <author>yeoni:)</author>
      <guid isPermaLink="true">https://become-programmer.tistory.com/325</guid>
      <comments>https://become-programmer.tistory.com/entry/Merge-Two-Sorted-Lists#entry325comment</comments>
      <pubDate>Fri, 8 Nov 2024 14:50:46 +0900</pubDate>
    </item>
  </channel>
</rss>