<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>cons</title>
    <link>https://cons-ps.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Thu, 18 Jun 2026 21:26:27 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>cons-ps</managingEditor>
    <item>
      <title>[JAVA]388351 유연근무제</title>
      <link>https://cons-ps.tistory.com/46</link>
      <description>&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;nbsp;  문제&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/388351&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/388351&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1748013524840&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;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/388351&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/yzSwX/hyYYwSLvhn/bNeN97i60yhpEwzkdMMR6k/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/w3qC4/hyYYD5pczI/3JIdPxEKaKWgZyJPocztZk/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/388351&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/388351&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/yzSwX/hyYYwSLvhn/bNeN97i60yhpEwzkdMMR6k/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/w3qC4/hyYYD5pczI/3JIdPxEKaKWgZyJPocztZk/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960');&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;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&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 style=&quot;text-align: left;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  아이디어&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;시간을 60분 단위로 계산하는 것이 포인트.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;또한 시간이 0530과 같은 형식이 아닌 530과 같이 들어오기에 잘 잘라서 계산해야한다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  풀이&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1684808965659&quot; class=&quot;java&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.*;
class Solution {
    public int solution(int[] schedules, int[][] timelogs, int startday) {
        int answer = 0;
        int peopleCnt = timelogs.length;
        
        int[] schedulesTime = new int[schedules.length];
        for(int i=0;i&amp;lt;schedulesTime.length;i++){
            String temp = String.valueOf(schedules[i]);
            schedulesTime[i] = Integer.valueOf(temp.substring(0,temp.length()/2))*60+Integer.valueOf(temp.substring(temp.length()/2));
        }
        
        boolean[] servive = new boolean[peopleCnt];
        Arrays.fill(servive,true);
        for(int i=0;i&amp;lt;7;i++){
            int nowDay = (startday-1+i)%7;
            if(nowDay &amp;lt; 5 ) {
                for(int j=0;j&amp;lt;peopleCnt;j++){
                    if(servive[j]){
                        String temp = String.valueOf(timelogs[j][i]);
                        int now= Integer.valueOf(temp.substring(0,temp.length()/2))*60+Integer.valueOf(temp.substring(temp.length()/2));
                        if(now&amp;gt;schedulesTime[j]+10){
                            servive[j] = false;
                        }
                    }
                }
                
            }
        }
        
        for(boolean s: servive){
            if(s) answer++;
        }
        return answer;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>programmers</category>
      <category>Java</category>
      <category>programmers</category>
      <category>구현</category>
      <category>자바</category>
      <author>cons-ps</author>
      <guid isPermaLink="true">https://cons-ps.tistory.com/46</guid>
      <comments>https://cons-ps.tistory.com/46#entry46comment</comments>
      <pubDate>Sat, 24 May 2025 00:19:41 +0900</pubDate>
    </item>
    <item>
      <title>[JAVA]389480 완전 범죄</title>
      <link>https://cons-ps.tistory.com/45</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;[JAVA]389480 완전 범죄&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;nbsp;  문제&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/389480&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/389480&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1748013354059&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;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/389480&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bgxd2X/hyYYDK6Gwx/WLRCnLe4QZk0fEUcr9hkxk/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/mJq56/hyYW0tpmwO/yQiRl3RNXQS43bVJRzm0Bk/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/389480&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/389480&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bgxd2X/hyYYDK6Gwx/WLRCnLe4QZk0fEUcr9hkxk/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/mJq56/hyYW0tpmwO/yQiRl3RNXQS43bVJRzm0Bk/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960');&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;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  아이디어&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;bfs를 통한 완전 탐색형 구현.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;but 확인했던것은 재확인하지 않도록 해야 시간 초과를 면할 수 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  풀이&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1684808965659&quot; class=&quot;java&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.*;

class Solution {
   public int solution(int[][] info, int n, int m) {
        int min = Integer.MAX_VALUE;
        boolean[][] saved;
        Queue&amp;lt;int[]&amp;gt; queue = new ArrayDeque&amp;lt;&amp;gt;();
        queue.add(new int[]{0, 0});
        for (int[] in : info) {
            int now = queue.size();
            saved = new boolean[n][m];

            for (int j = 0; j &amp;lt; now; j++) {
                int[] poll = queue.poll();
                int nowA = poll[0];
                int nowB = poll[1];
                int mvA = nowA + in[0];
                int mvB = nowB + in[1];
                if (mvA &amp;lt; n &amp;amp;&amp;amp; !saved[mvA][nowB]) {
                    queue.add(new int[]{mvA, nowB});
                    saved[mvA][nowB] = true;
                }
                if (mvB &amp;lt; m &amp;amp;&amp;amp; !saved[nowA][mvB]) {
                    queue.add(new int[]{nowA, mvB});
                    saved[nowA][mvB] = true;
                }
            }
        }

        while (!queue.isEmpty()) {
            int[] poll = queue.poll();
            min = Math.min(poll[0], min);
        }
        return (min == Integer.MAX_VALUE) ? -1 : min;
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>programmers</category>
      <category>bfs</category>
      <category>programmers</category>
      <category>자바</category>
      <author>cons-ps</author>
      <guid isPermaLink="true">https://cons-ps.tistory.com/45</guid>
      <comments>https://cons-ps.tistory.com/45#entry45comment</comments>
      <pubDate>Sat, 24 May 2025 00:17:40 +0900</pubDate>
    </item>
    <item>
      <title>[JAVA]389479 서버 증설 횟수</title>
      <link>https://cons-ps.tistory.com/44</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;[JAVA]389479 서버 증설 횟수&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;nbsp;  문제&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/389479&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/389479&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1748013239681&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;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/389479&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/1GtNh/hyYWXi9Y2Z/xxmp2kwl5XerEq0SmpEIP0/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/cjgeLr/hyYW0GXDBB/Zs5WyOiujVYBPKowHDQVn0/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/389479&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/389479&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/1GtNh/hyYWXi9Y2Z/xxmp2kwl5XerEq0SmpEIP0/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/cjgeLr/hyYW0GXDBB/Zs5WyOiujVYBPKowHDQVn0/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960');&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;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&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 style=&quot;text-align: left;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  아이디어&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;서버를 증설해야할 타이밍에 생성하고 k시간이후에 자동으로 해제 되도록 한다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  풀이&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1684808965659&quot; class=&quot;java&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.*;
class Solution {
    public int solution(int[] players, int m, int k) {
        int servers = 0;
        PriorityQueue&amp;lt;Integer&amp;gt; pq = new PriorityQueue&amp;lt;&amp;gt;();
        for (int i = 0; i &amp;lt; 24; i++) {
            while (!pq.isEmpty() &amp;amp;&amp;amp; pq.peek() &amp;lt;= i) {
                Integer poll = pq.poll();
                //System.out.println(poll + &quot; 반납&quot;);
            }

            int needServers = players[i] / m;
            if (pq.size() &amp;lt; needServers) {
                for (int j = pq.size(); j &amp;lt; needServers; j++) {
                    //System.out.println(i+&quot; 생성&quot;);
                    pq.add(i + k);
                    servers++;
                }
            }
        }

        return servers;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>programmers</category>
      <category>우선순위큐</category>
      <category>자바</category>
      <category>프로그래머스</category>
      <author>cons-ps</author>
      <guid isPermaLink="true">https://cons-ps.tistory.com/44</guid>
      <comments>https://cons-ps.tistory.com/44#entry44comment</comments>
      <pubDate>Sat, 24 May 2025 00:15:13 +0900</pubDate>
    </item>
    <item>
      <title>[JAVA]1111 IQ 테스트</title>
      <link>https://cons-ps.tistory.com/43</link>
      <description>&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;nbsp;  문제&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1111&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/1111&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; 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;1012&quot; data-origin-height=&quot;138&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEb7Ft/btsNkveUQrJ/ihUXqIZDMxfma5E6VigTg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEb7Ft/btsNkveUQrJ/ihUXqIZDMxfma5E6VigTg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEb7Ft/btsNkveUQrJ/ihUXqIZDMxfma5E6VigTg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEb7Ft%2FbtsNkveUQrJ%2FihUXqIZDMxfma5E6VigTg1%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;1012&quot; height=&quot;138&quot; data-origin-width=&quot;1012&quot; data-origin-height=&quot;138&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  아이디어&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;절댓값 내의 범위가 -100, 100 사이라 하여 완전 탐색을 고려하였다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;1. 실수 포인트 : -100 ~ 100 사이에서 A가 반드시 나오지 않는다. B가 커버칠수도 있다 (-100 , 99 와 같은 케이스 )&lt;/p&gt;
&lt;pre id=&quot;code_1744629541989&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;input:
3
-100 -99 2

output:
10203

// 수열의 세 번째 수로 2가 아니라 2 이상 100 이하의 수 중 아무거나 사용하여도
// 모두 곱해지는 수의 절댓값이 100을 넘습니다.
// -100 * 101 + 10001 = -99, -99 * 101 + 10001 = 2&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;출처 : &lt;a href=&quot;https://www.acmicpc.net/board/view/107405&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/board/view/107405&lt;/a&gt; &amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;2. 실수 포인트 : 중복 값을 비교하는 부분에서&amp;nbsp; if (isAble &amp;amp;&amp;amp; next != foundNum) {&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;next의 값의 초기값을 잘 정해야 한다. 처음에 next로 -1을 지정해두니 -1이 다음값으로 나올 수 있는 경우가 무시된다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Integer.MAX_VALUE로 변경 후 통과하였다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  풀이&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1684808965659&quot; class=&quot;java&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

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

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

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

        if (n &amp;lt;= 2) { //1 또는 2
            System.out.println(&quot;A&quot;);
            return;
        }

        int foundCnt = 0;
        int next = Integer.MAX_VALUE;
        int tempB;
        for (int a = -200; a &amp;lt;= 200 &amp;amp;&amp;amp; foundCnt &amp;lt; 2; a++) {
            boolean isAble = true;
            tempB = arr[1] - arr[0] * a;
            for (int i = 1; i &amp;lt; n; i++) {
                if (arr[i - 1] * a + tempB != arr[i]) {
                    isAble = false;
                    break;
                }
            }

            int foundNum = arr[n - 1] * a + tempB;
            if (isAble &amp;amp;&amp;amp; next != foundNum) {
//                System.out.println(&quot;FOUND : &quot; + foundNum);
//                System.out.println(&quot;ABLE: &quot; + a + &quot; &quot; + tempB);
                next = foundNum;
                foundCnt++;
            }
        }
//        System.out.println(foundCnt);
        System.out.println(foundCnt == 0 ? &quot;B&quot; : (foundCnt &amp;gt;= 2 ? &quot;A&quot; : next));
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>백준(boj)</category>
      <category>Java</category>
      <category>백준</category>
      <category>자바</category>
      <author>cons-ps</author>
      <guid isPermaLink="true">https://cons-ps.tistory.com/43</guid>
      <comments>https://cons-ps.tistory.com/43#entry43comment</comments>
      <pubDate>Mon, 14 Apr 2025 20:21:35 +0900</pubDate>
    </item>
    <item>
      <title>[JAVA]1153 네 개의 소수</title>
      <link>https://cons-ps.tistory.com/42</link>
      <description>&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;nbsp;  문제&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1153&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/1153&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반례 확인 : &lt;a href=&quot;https://testcase.ac/problems/1153&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://testcase.ac/problems/1153&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1744546850826&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;1153번 네 개의 소수 - Testcase AC&quot; data-og-description=&quot;반례 찾기 실행 횟수11번 반례 찾은 횟수6번 최근 1주일 실행 횟수3번&quot; data-og-host=&quot;testcase.ac&quot; data-og-source-url=&quot;https://testcase.ac/problems/1153&quot; data-og-url=&quot;https://testcase.ac/problems/1153&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://testcase.ac/problems/1153&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://testcase.ac/problems/1153&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;1153번 네 개의 소수 - Testcase AC&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;반례 찾기 실행 횟수11번 반례 찾은 횟수6번 최근 1주일 실행 횟수3번&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;testcase.ac&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1626&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLUkZa/btsNkt03UCG/4TfRKkxrsEbXb143BIDmE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLUkZa/btsNkt03UCG/4TfRKkxrsEbXb143BIDmE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLUkZa/btsNkt03UCG/4TfRKkxrsEbXb143BIDmE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLUkZa%2FbtsNkt03UCG%2F4TfRKkxrsEbXb143BIDmE0%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;1626&quot; height=&quot;108&quot; data-origin-width=&quot;1626&quot; data-origin-height=&quot;108&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  아이디어&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;1. N미만의 소수를 모두 미리 찾는다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;2. 골드 바흐의 추측 짝수는 두개의 소수로 반드시 표현 가능하다. ( 즉, 짝수 + a + b 의 조합으로 만든다)&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;2-1. 짝수인 경우는 ( 2+2 + (짝수) 로 가능한지 확인)&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;2-2 홀수 인 경우는 ( 2+3 +(짝수)로 가능한지 확인)&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  풀이&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1684808965659&quot; class=&quot;java&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package 백준.수학.에라토스테네스의체;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Boj_1153_네개의소수 {
    private static List&amp;lt;Integer&amp;gt; primes = new ArrayList&amp;lt;&amp;gt;();
    private static boolean[] isPrime;

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

        int N = Integer.parseInt(br.readLine());
        if (N &amp;lt; 8) {
            System.out.println(&quot;-1&quot;);
            return;
        }

        findPrimes(N);
        List&amp;lt;Integer&amp;gt; path = new ArrayList&amp;lt;&amp;gt;();
//      골드바흐의 추측 ( 짝수는 항상 두 소수의 합으로 표현이 가능하다 =&amp;gt; 짝수가 되면 찾을수 있음)
        if (N % 2 == 0) {
            path.add(2);
            path.add(2);
            N -= 4;
        } else {
            path.add(2);
            path.add(3);
            N -= 5;
        }
        for (int prime : primes) {
            int other = N - prime;
            if (other &amp;gt;= 2 &amp;amp;&amp;amp; isPrime[other]) {
                path.add(prime);
                path.add(other);
                break;
            }
        }

        for (int num : path) {
            System.out.print(num + &quot; &quot;);
        }
    }

    private static void findPrimes(int n) {
        isPrime = new boolean[n + 1];
        Arrays.fill(isPrime, true);
        isPrime[0] = isPrime[1] = false;

        for (int i = 2; i * i &amp;lt;= n; i++) {
            if (isPrime[i]) {
                for (int j = i * i; j &amp;lt;= n; j += i) {
                    isPrime[j] = false;
                }
            }
        }

        for (int i = 2; i &amp;lt;= n; i++) {
            if (isPrime[i]) {
                primes.add(i);
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 빠른 코드 ( 쓸모없이 이진 탐색 넣기..)&lt;/p&gt;
&lt;pre id=&quot;code_1744547023608&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package 백준.수학.에라토스테네스의체;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class Boj_1153_수정완료 {
    private static List&amp;lt;Integer&amp;gt; primes = new ArrayList&amp;lt;&amp;gt;();

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

        if (N % 2 == 0) {
            //짝수
            if (findDfs(N - 4, 2, new ArrayList&amp;lt;&amp;gt;(List.of(2, 2)))) {
                return;
            }
        } else if (N != 1) {
            //홀수 (하나는 짝수여야 한다 - 2가 포함)
            if (findDfs(N - 5, 2, new ArrayList&amp;lt;&amp;gt;(List.of(2, 3)))) {
                return;
            }
        }

        System.out.println(&quot;-1&quot;);
    }

    private static boolean findDfs(int n, int depth, List&amp;lt;Integer&amp;gt; path) {
        if (path.size() &amp;gt; 4)
            return false;

        if (depth == 0) {
            if (path.size() == 4 &amp;amp;&amp;amp; n == 0) {
                for (Integer number : path) {
                    System.out.print(number + &quot; &quot;);
                }
                return true;
            }
            return false;
        }

        for (int i = upperBound(n); 0 &amp;lt;= i; i--) {
            path.add(primes.get(i));
            //찾음
            if (findDfs(n - primes.get(i), depth - 1, path)) {
                return true;
            }
            path.remove(path.size() - 1);
        }
        return false;
    }

    private static int upperBound(int n) {
        int start = 0;
        int end = primes.size() - 1;
        int upperBound = 0;

        while (start &amp;lt;= end) {
            int mid = start + (end - start) / 2;
            if (primes.get(mid) &amp;lt;= n) {
                start = mid + 1;
                upperBound = mid;
            } else {
                end = mid - 1;
            }
        }
        return upperBound;
    }

    private static void findPrimes(int n) {
        boolean[] isNotPrime = new boolean[n + 1];
        isNotPrime[0] = isNotPrime[1] = true;
        for (int i = 1; i &amp;lt;= n; i++) {
            if (!isNotPrime[i]) {
                primes.add(i);
                for (int j = i; j &amp;lt;= n; j += i) {
                    isNotPrime[j] = true;
                }
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>백준(boj)</category>
      <category>골드바흐의추측</category>
      <category>백준</category>
      <category>수학</category>
      <category>에라토스테네스의체</category>
      <category>자바</category>
      <author>cons-ps</author>
      <guid isPermaLink="true">https://cons-ps.tistory.com/42</guid>
      <comments>https://cons-ps.tistory.com/42#entry42comment</comments>
      <pubDate>Sun, 13 Apr 2025 21:24:13 +0900</pubDate>
    </item>
    <item>
      <title>[JAVA]16947 서울 지하철 2호선</title>
      <link>https://cons-ps.tistory.com/41</link>
      <description>&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;nbsp;  문제&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a title=&quot;https://www.acmicpc.net/problem/16947&quot; href=&quot;https://www.acmicpc.net/problem/16947&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/16947&lt;/a&gt;&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;966&quot; data-origin-height=&quot;122&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/enZM9t/btsNi7rmr17/XOx0H4LatbL6yN486Fb2a0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/enZM9t/btsNi7rmr17/XOx0H4LatbL6yN486Fb2a0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/enZM9t/btsNi7rmr17/XOx0H4LatbL6yN486Fb2a0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FenZM9t%2FbtsNi7rmr17%2FXOx0H4LatbL6yN486Fb2a0%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;966&quot; height=&quot;122&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;122&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  아이디어&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;1. Cycle을 찾는다. -&amp;gt; DFS&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;2. Cycle에 속한 것들만 추려 거기서 부터 시작되는 것들의 Depth(distance)을 찾는다. -&amp;gt; BFS&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;실수 했던점 : &lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;casting 오류 (Integer 과 Integer을 비교하면 reference만 비교한다. 주의 필요)&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;b&gt;Cycle을 찾는법 : (하기 두 개의 방법은 싸이클이 하나일때만 생각한 것입니다)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;1. union find ( findParents(a) == findParents(b) 인 경우면 이미 두개가 같은 부모를 향하는 것으로 싸이클임 존재함을 의미)&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;2. DFS (이미 방문된 노드라면 싸이클이 존재함을 의미한다)&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  풀이&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1684808965659&quot; class=&quot;java&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package 백준.구현;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Boj_16947_서울지하철2호선 {
    private static List&amp;lt;List&amp;lt;Integer&amp;gt;&amp;gt; graphs = new ArrayList&amp;lt;&amp;gt;();
    private static boolean[] visited;
    private static boolean[] isInCycle;
    private static int[] distance;

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

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

        for (int i = 0; i &amp;lt; N; i++) {
            graphs.add(new ArrayList&amp;lt;&amp;gt;());
        }
        for (int i = 0; i &amp;lt; N; i++) {
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken()) - 1;
            int b = Integer.parseInt(st.nextToken()) - 1;
            graphs.get(a).add(b);
            graphs.get(b).add(a);
        }

        visited = new boolean[N];
        isInCycle = new boolean[N];
        findCycle(0, -1, new ArrayList&amp;lt;&amp;gt;());

        distance = new int[N];
        foundDepth();

        for (int d : distance) {
            sb.append(d).append(&quot; &quot;);
        }
        System.out.println(sb);
    }

    //bfs
    private static void foundDepth() {
        Queue&amp;lt;Integer&amp;gt; queue = new LinkedList&amp;lt;&amp;gt;();
        visited = new boolean[graphs.size()];

        for (int i = 0; i &amp;lt; isInCycle.length; i++) {
            if (isInCycle[i]) {
                queue.add(i);
                visited[i] = true;
                distance[i] = 0;
            }
        }

        int tempDepth = 1;
        while (!queue.isEmpty()) {
            int size = queue.size();
            for (int i = 0; i &amp;lt; size; i++) {
                int current = queue.poll();
                for (Integer child : graphs.get(current)) {
                    if (!visited[child]) {
                        distance[child] = tempDepth;
                        queue.add(child);
                        visited[child] = true;
                    }
                }
            }
            tempDepth++;
        }
    }

    //dfs
    private static boolean findCycle(int current, int parent, ArrayList&amp;lt;Integer&amp;gt; path) {
        visited[current] = true;
        path.add(current);

        for (Integer next : graphs.get(current)) {
            //방향 간선으로 부모는 무시한다.
            if (next == parent) continue;

            if (visited[next]) {
                //path내의 현재 노드가 시작한 위치부터 현재까지를 싸이클로 취급한다.
                coloredCycle(next, path);
                return true;
            }

            if(findCycle(next, current, path)) return true;
        }
        path.remove(path.size() - 1);
        return false;
    }

    private static void coloredCycle(int cycleStart, ArrayList&amp;lt;Integer&amp;gt; containsPath) {
        boolean marking = false;
        //Integer을 형변화 하여 변환해야 비교 된다.
        for (int node : containsPath) {
            if (cycleStart == node) marking = true;
            if (marking) isInCycle[node] = true;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>백준(boj)</category>
      <category>bfs</category>
      <category>dfs</category>
      <category>Java</category>
      <category>알고리즘</category>
      <author>cons-ps</author>
      <guid isPermaLink="true">https://cons-ps.tistory.com/41</guid>
      <comments>https://cons-ps.tistory.com/41#entry41comment</comments>
      <pubDate>Sun, 13 Apr 2025 20:15:28 +0900</pubDate>
    </item>
    <item>
      <title>[JAVA]1377 버블 소트, 정렬</title>
      <link>https://cons-ps.tistory.com/40</link>
      <description>&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;nbsp;  문제&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1377&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/1377&lt;/a&gt;&lt;/b&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;1460&quot; data-origin-height=&quot;178&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GOiHy/btsNjEIF0uE/MJzVRdrEZgRTzkbWtGiUBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GOiHy/btsNjEIF0uE/MJzVRdrEZgRTzkbWtGiUBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GOiHy/btsNjEIF0uE/MJzVRdrEZgRTzkbWtGiUBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGOiHy%2FbtsNjEIF0uE%2FMJzVRdrEZgRTzkbWtGiUBk%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;1460&quot; height=&quot;178&quot; data-origin-width=&quot;1460&quot; data-origin-height=&quot;178&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  아이디어&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;h4 style=&quot;text-align: left;&quot; data-ke-size=&quot;size20&quot;&gt;버블 소트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;237&quot; data-start=&quot;124&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;163&quot; data-start=&quot;124&quot;&gt;버블 소트는 &lt;b&gt;왼쪽에서 오른쪽으로&lt;/b&gt; 인접한 두 값을 비교하면서,&lt;/li&gt;
&lt;li data-end=&quot;201&quot; data-start=&quot;164&quot;&gt;&lt;b&gt;큰 값을 오른쪽으로 한 칸씩 밀어내는 방식&lt;/b&gt;으로 작동한다. (즉 작은값을 기준으로 오름차순 하고 있다)&lt;/li&gt;
&lt;li data-end=&quot;237&quot; data-start=&quot;202&quot;&gt;한 패스를 돌 때마다 &lt;b&gt;가장 큰 값이 끝으로 보내진다&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;325&quot; data-start=&quot;311&quot; data-ke-size=&quot;size20&quot;&gt;핵심 인사이트&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;450&quot; data-start=&quot;326&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;363&quot; data-start=&quot;326&quot;&gt;버블 소트에서는 &lt;b&gt;큰 값이 오른쪽으로 한 칸씩 이동&lt;/b&gt;하므로,&lt;/li&gt;
&lt;li data-end=&quot;399&quot; data-start=&quot;364&quot;&gt;&lt;b&gt;가장 많이 움직인 원소가 정렬 완료 시점을 결정&lt;/b&gt;한다. (왼쪽으로 이동한것들)&amp;nbsp;&lt;/li&gt;
&lt;li data-end=&quot;450&quot; data-start=&quot;400&quot;&gt;이때 그 원소가 &lt;b&gt;정렬된 위치에 도달하기까지 몇 번의 패스가 필요한지&lt;/b&gt;가 관건이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-end=&quot;469&quot; data-start=&quot;457&quot; data-ke-size=&quot;size20&quot;&gt;계산 방식&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;687&quot; data-start=&quot;470&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;514&quot; data-start=&quot;470&quot;&gt;정렬 전 배열에서 각 값의 &lt;b&gt;원래 인덱스 - 정렬된 인덱스&lt;/b&gt;를 계산한다.(&lt;b&gt;정렬된 위치보다 원래 인덱스가 뒤에 있는 값, 앞으로 이동한 것들)&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;687&quot; data-start=&quot;586&quot;&gt;가장 큰 이동 거리에 +1을 해주면 정답이 된다. (마지막으로 움직인 그 값이 제자리 간 &lt;b&gt;다음 패스&lt;/b&gt;에 swap이 더 이상 없어서 종료되기 때문.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  풀이&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1684808965659&quot; class=&quot;java&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package 백준.정렬;

import java.io.*;
import java.util.*;

public class Boj_1377_버블소트 {
    static class Pair {
        int value, index;
        Pair(int value, int index) {
            this.value = value;
            this.index = index;
        }
    }

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

        Pair[] arr = new Pair[n];

        for (int i = 0; i &amp;lt; n; i++) {
            int num = Integer.parseInt(br.readLine());
            arr[i] = new Pair(num, i); // 값 + 원래 인덱스 저장
        }

        Arrays.sort(arr, Comparator.comparingInt(a -&amp;gt; a.value)); // 값 기준 정렬

        int maxMove = 0;
        for (int i = 0; i &amp;lt; n; i++) {
            // 원래 인덱스 - 정렬된 인덱스
            int move = arr[i].index - i;
            maxMove = Math.max(maxMove, move);
        }

        System.out.println(maxMove + 1); // 패스 수 = 최대 이동 거리 + 1
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;328&quot; data-origin-height=&quot;284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXo96E/btsNkkiD8KM/SomNyLxaw3zC4sT3IVjYo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXo96E/btsNkkiD8KM/SomNyLxaw3zC4sT3IVjYo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXo96E/btsNkkiD8KM/SomNyLxaw3zC4sT3IVjYo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXo96E%2FbtsNkkiD8KM%2FSomNyLxaw3zC4sT3IVjYo0%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;94&quot; height=&quot;81&quot; data-origin-width=&quot;328&quot; data-origin-height=&quot;284&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>백준(boj)</category>
      <category>백준</category>
      <category>알고리즘</category>
      <category>정렬</category>
      <author>cons-ps</author>
      <guid isPermaLink="true">https://cons-ps.tistory.com/40</guid>
      <comments>https://cons-ps.tistory.com/40#entry40comment</comments>
      <pubDate>Sat, 12 Apr 2025 18:46:22 +0900</pubDate>
    </item>
    <item>
      <title>[JAVA]22856 트리 순회 (골드 4)</title>
      <link>https://cons-ps.tistory.com/39</link>
      <description>&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;nbsp;  문제&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/22856&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/22856&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1695217143454&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;22856번: 트리 순회&quot; data-og-description=&quot;노드가 $N$개인 이진 트리가 있다. 트리를 중위 순회와 유사하게 순회하려고 한다. 이를 유사 중위 순회라고 하자. 순회의 시작은 트리의 루트이고 순회의 끝은 중위 순회할 때 마지막 노드이다. &quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/22856&quot; data-og-url=&quot;https://www.acmicpc.net/problem/22856&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ecSwwQ/hyTZbFNGnY/k5GyG38PJvM5jcbHmhOrT0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/22856&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/22856&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ecSwwQ/hyTZbFNGnY/k5GyG38PJvM5jcbHmhOrT0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&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;22856번: 트리 순회&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;노드가 $N$개인 이진 트리가 있다. 트리를 중위 순회와 유사하게 순회하려고 한다. 이를 유사 중위 순회라고 하자. 순회의 시작은 트리의 루트이고 순회의 끝은 중위 순회할 때 마지막 노드이다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  아이디어&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;만약 현재 노드가 유사 중위 순회의 끝이라면 유사 순위를 종료한다는 부분을 잘못 이해해서 여러 번 틀렸던 문제였습니다. 이 구문은 현재 노드가 중위 순회가 끝났다면 다시 올라가지 않아도 된다는 것을 의미합니다. 즉 왼쪽으로 가는 경우는 반드시 루트로 다시 올라와야 하지만 오른쪽의 경우는 중위순회가 끝난 상태라면 다시 올라오지 않아도 됩니다. (중위 순회 : 왼쪽 자식 -&amp;gt; root -&amp;gt; 오른쪽 자식)&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;따라서 왼쪽 자식을 가는 경우는 내려갔다 올라오는 점수를 모두 세 주었지만&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;오른쪽 자식으로 가는경우는 모든 노드를 방문한 상태라면 다시 올라오지 않고 종료하도록 하였습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  풀이&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1684808965659&quot; class=&quot;java&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Boj_22856_트리순회 {
    private static class Node {
        int root;
        Node left;
        Node right;

        public Node(int root) {
            this.root = root;
        }

        public void set(Node left, Node right) {
            this.left = left;
            this.right = right;
        }
    }

    private static int visitedCnt = 0;
    private static boolean[] visited;
    private static int n;

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

        n = Integer.parseInt(br.readLine());
        Node[] nodes = new Node[n];
        visited = new boolean[n];
        for (int i = 0; i &amp;lt; n; i++) {
            nodes[i] = new Node(i);
        }
        for (int i = 0; i &amp;lt; n; i++) {
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken()) - 1;
            int left = Integer.parseInt(st.nextToken()) - 1;
            int right = Integer.parseInt(st.nextToken()) - 1;

            if (left != -2 &amp;amp;&amp;amp; right != -2) {
                nodes[a].set(nodes[left], nodes[right]); //자식이 없는경우
            } else if (left != -2) {
                nodes[a].set(nodes[left], null); //왼쪽 자식만 있는 경우
            } else if (right != -2) {
                nodes[a].set(null, nodes[right]); //오른쪽 자식만 있는 경우
            }
        }
        System.out.println(dfs(nodes[0]));
    }

    private static int dfs(Node now) {
        //왼쪽만 있으면 다시 올라가야 하고
        //오른쪽에서 중위 순회가 끝났으면 올라가지 않아도 됨
        int score = 0;

        if (now.left != null &amp;amp;&amp;amp; !visited[now.left.root]) {
            score++; //내려가는 비용
            score += dfs(now.left);
            score++; //다시 올라가는 비용
        }

        //중위 순회함을 체크한다.
        visited[now.root] = true;
        visitedCnt++;

        if (now.right != null &amp;amp;&amp;amp; !visited[now.right.root]) {
            score++; //내려가는 비용
            score += dfs(now.right);
            if (visitedCnt == n) { //오른쪽에서 중위 순회가 종료되었다.다시 올라가지 않아도 된다.
                return score;
            }
            score++;
        }

        return score;

    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1654&quot; data-origin-height=&quot;168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AzX2t/btsu2dnLfzd/OAZCUnLMvlqpFWK5UKAUdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AzX2t/btsu2dnLfzd/OAZCUnLMvlqpFWK5UKAUdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AzX2t/btsu2dnLfzd/OAZCUnLMvlqpFWK5UKAUdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAzX2t%2Fbtsu2dnLfzd%2FOAZCUnLMvlqpFWK5UKAUdK%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;1654&quot; height=&quot;168&quot; data-origin-width=&quot;1654&quot; data-origin-height=&quot;168&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>백준</category>
      <category>알고리즘</category>
      <category>자바</category>
      <author>cons-ps</author>
      <guid isPermaLink="true">https://cons-ps.tistory.com/39</guid>
      <comments>https://cons-ps.tistory.com/39#entry39comment</comments>
      <pubDate>Wed, 20 Sep 2023 22:47:38 +0900</pubDate>
    </item>
    <item>
      <title>[JAVA]11437 LCA 공통 부모 노드 찾기(골드 3)</title>
      <link>https://cons-ps.tistory.com/38</link>
      <description>&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;nbsp;  문제&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/11437&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/11437&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1695216286993&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;11437번: LCA&quot; data-og-description=&quot;첫째 줄에 노드의 개수 N이 주어지고, 다음 N-1개 줄에는 트리 상에서 연결된 두 정점이 주어진다. 그 다음 줄에는 가장 가까운 공통 조상을 알고싶은 쌍의 개수 M이 주어지고, 다음 M개 줄에는 정&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/11437&quot; data-og-url=&quot;https://www.acmicpc.net/problem/11437&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/kJJIZ/hyTY3HLwD3/GfdrIZr7ySPyOka1qdQGDk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/11437&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/11437&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/kJJIZ/hyTY3HLwD3/GfdrIZr7ySPyOka1qdQGDk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&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;11437번: LCA&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 노드의 개수 N이 주어지고, 다음 N-1개 줄에는 트리 상에서 연결된 두 정점이 주어진다. 그 다음 줄에는 가장 가까운 공통 조상을 알고싶은 쌍의 개수 M이 주어지고, 다음 M개 줄에는 정&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  아이디어&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;공통 조상을 찾는 문제입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;각 노드의 깊이를 먼저 BFS, DFS를 이용하여 계산합니다. (이때 부모 노드도 함께 지정해줍니다, parents 배열)&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이후에 a,b 노드의 공통 조상을 찾는 경우 a의 깊이, b의 깊이를 비교하여 두 노드의 깊이가 동일할 때까지 부모로 이동하며 올라옵니다&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;두 노드의 깊이가 같아졌으면 두 노드를 함께 부모로 노드로 올리는것을 반복합니다. 해당 과정을 반복하다 동일 노드가 되면 해당 노드가 공통 부모 노드입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;참고로 해당문제는 더욱 최적화할 수 있어 플레티넘 5문제가 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;여기서 주의해야 할 점은 부모 노드가 반드시 적은 숫자인 것이 아니라는 것입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;즉 아래와 같은 경우도 있을 수 있기 때문에 parents배열을 bfs/dfs 탐색하면서 채워주어야 정확한 값을 구해줄 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;882&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCNwTt/btsuZRr0Dc7/zBMRJRuGYTYdNiJXOypIb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCNwTt/btsuZRr0Dc7/zBMRJRuGYTYdNiJXOypIb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCNwTt/btsuZRr0Dc7/zBMRJRuGYTYdNiJXOypIb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCNwTt%2FbtsuZRr0Dc7%2FzBMRJRuGYTYdNiJXOypIb0%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;433&quot; height=&quot;466&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;882&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  풀이&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1684808965659&quot; class=&quot;java&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Boj_11437_LCA {
    private static int[] depths;
    private static int[] parents;
    private static final List&amp;lt;List&amp;lt;Integer&amp;gt;&amp;gt; graph = new ArrayList&amp;lt;&amp;gt;();

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

        int nodeCnt = Integer.parseInt(br.readLine());
        //부모 노드를 적는다.
        parents = new int[nodeCnt];
        for (int i = 0; i &amp;lt; nodeCnt; i++) {
            graph.add(new ArrayList&amp;lt;&amp;gt;());
        }

        for (int i = 0; i &amp;lt; nodeCnt - 1; i++) {
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken()) - 1;
            int b = Integer.parseInt(st.nextToken()) - 1;

            graph.get(a).add(b);
            graph.get(b).add(a);
        }

        //각 정점의 깊이를 구한다.
        depths = new int[nodeCnt];
        bfs();

        //두 정점의 같은 노드 구한다.
        int tc = Integer.parseInt(br.readLine());
        for (int i = 0; i &amp;lt; tc; i++) {
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken()) - 1;
            int b = Integer.parseInt(st.nextToken()) - 1;
            sb.append(lca(a, b)).append(&quot;\n&quot;);
        }
        System.out.println(sb);

    }

    private static int lca(int a, int b) {
        //일단 두 깊이가 같아 질때까지 끌어올린다.
        if (depths[a] &amp;gt; depths[b]) {
            //a를 끌어 올린다.
            while (depths[a] != depths[b]) {
                a = parents[a];
            }

        } else if (depths[a] &amp;lt; depths[b]) {
            //b를 끌어 올린다.
            while (depths[a] != depths[b]) {
                b = parents[b];
            }
        }

        //두 노드를 같이 올린다.
        while (a != b) {
            a = parents[a];
            b = parents[b];
        }

        return a + 1;
    }

    private static void bfs() {
        Queue&amp;lt;Integer&amp;gt; q = new LinkedList&amp;lt;&amp;gt;();
        q.add(0);
        int level = 1;
        depths[0] = level;
        parents[0] = 0;

        while (!q.isEmpty()) {
            level++;
            int size = q.size();

            for (int i = 0; i &amp;lt; size; i++) {
                Integer parent = q.poll();
                for (Integer child : graph.get(parent)) {
                    if (depths[child] == 0) { //방문하지 않은 경우만 방문한다
                        depths[child] = level;
                        parents[child] = parent;
                        q.add(child);
                    }
                }
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1690&quot; data-origin-height=&quot;154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NyEjL/btsuZUvuUlc/wDmH9o728xdki00iokXo30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NyEjL/btsuZUvuUlc/wDmH9o728xdki00iokXo30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NyEjL/btsuZUvuUlc/wDmH9o728xdki00iokXo30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNyEjL%2FbtsuZUvuUlc%2FwDmH9o728xdki00iokXo30%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;1690&quot; height=&quot;154&quot; data-origin-width=&quot;1690&quot; data-origin-height=&quot;154&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>백준(boj)</category>
      <category>LCA</category>
      <category>백준</category>
      <category>자바</category>
      <author>cons-ps</author>
      <guid isPermaLink="true">https://cons-ps.tistory.com/38</guid>
      <comments>https://cons-ps.tistory.com/38#entry38comment</comments>
      <pubDate>Wed, 20 Sep 2023 22:35:22 +0900</pubDate>
    </item>
    <item>
      <title>[JAVA]13418 학교 탐방하기, 골드 3</title>
      <link>https://cons-ps.tistory.com/37</link>
      <description>&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;nbsp;  문제&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/13418&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/13418&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1692585623596&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;13418번: 학교 탐방하기&quot; data-og-description=&quot;입력 데이터는 표준 입력을 사용한다. 입력은 1개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 건물의 개수 N(1 &amp;le; N &amp;le; 1,000)과 도로의 개수 M(1 &amp;le; M &amp;le; N(N-1)/2) 이 주어진다. 입력의 두 번&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/13418&quot; data-og-url=&quot;https://www.acmicpc.net/problem/13418&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cjYTcA/hyTFprWFkD/cvFqDurCa9ua6r6g1cSarK/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/13418&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/13418&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cjYTcA/hyTFprWFkD/cvFqDurCa9ua6r6g1cSarK/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&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;13418번: 학교 탐방하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;입력 데이터는 표준 입력을 사용한다. 입력은 1개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 건물의 개수 N(1 &amp;le; N &amp;le; 1,000)과 도로의 개수 M(1 &amp;le; M &amp;le; N(N-1)/2) 이 주어진다. 입력의 두 번&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  아이디어&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;mst를 활용하여 풀이하였습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*(다른 분들과 풀이가 달라 맞는 풀이인지 확신이 들지 않습니다. 참고 부탁드립니다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;가장 힘이 드는경우는 가장 많은 경사로(같은 길이 나오지 않기때문)를 이용하는 경우라고 생각하였습니다&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;따라서 먼저 경사로를 이용하는 경우의 모든 경로를 연결합니다. 이때 연결된 경사로의 개수의 제곱이 점수가 됩니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;가장 힘이 적게 드는 경우는 경사로를 이용하지 않고 내리막길을 가장 많이 이용해야 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이때는 만약 union하는 경우에 사용한 길의 개수에서 빼서 경사로로 가야만 하는 길의 개수를 구할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; 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;1472&quot; data-origin-height=&quot;178&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b15BAa/btsrIaamHwS/2Ivp9q8fkYkdpcLNVkGklK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b15BAa/btsrIaamHwS/2Ivp9q8fkYkdpcLNVkGklK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b15BAa/btsrIaamHwS/2Ivp9q8fkYkdpcLNVkGklK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb15BAa%2FbtsrIaamHwS%2F2Ivp9q8fkYkdpcLNVkGklK%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;1472&quot; height=&quot;178&quot; data-origin-width=&quot;1472&quot; data-origin-height=&quot;178&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  풀이&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1684808965659&quot; class=&quot;java&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package 백준.graph.mst.kruskal;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

public class Boj_13418_학교탐방하기 {
    private static class Road {
        int start;
        int end;

        public Road(int start, int end) {
            this.start = start;
            this.end = end;
        }
    }

    private static int[] parents;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken()) + 1; //city
        int m = Integer.parseInt(st.nextToken()) + 1;

        List&amp;lt;Road&amp;gt; slopes = new ArrayList&amp;lt;&amp;gt;(); //경사로들만
        List&amp;lt;Road&amp;gt; descs = new ArrayList&amp;lt;&amp;gt;(); //내리막길말


        for (int i = 0; i &amp;lt; m; i++) {
            st = new StringTokenizer(br.readLine());
            int start = Integer.parseInt(st.nextToken());
            int end = Integer.parseInt(st.nextToken());
            int slope = Integer.parseInt(st.nextToken());
            if (slope == 0) {
                slopes.add(new Road(start, end));
            } else {
                descs.add(new Road(start, end));
            }
        }
        parents = new int[n];

        //경사로 연결할 수 있는 만큼 연결하는 경우
        for (int i = 0; i &amp;lt; n; i++) {
            parents[i] = i;
        }

        int maxCnt = 0;
        for (Road slope : slopes) {
            if (union(slope.start, slope.end)) {
                maxCnt++;
            }
        }

        //내려가는 길을 연결할 수 있는 만큼 연결하는 경우
        int minCnt= n-1;
        for (int i = 0; i &amp;lt; n; i++) {
            parents[i] = i;
        }

        for (Road desc : descs) {
            if(union(desc.start, desc.end)){
                minCnt--;
            }
        }

        System.out.println((maxCnt * maxCnt) - (minCnt * minCnt));
    }

    private static boolean union(int a, int b) {
        a = findParent(a);
        b = findParent(b);

        if (a != b) {
            if (a &amp;lt; b) parents[b] = a;
            else parents[a] = b;
            return true;
        }
        return false;
    }

    private static int findParent(int a) {
        if (a == parents[a]) return a;
        return parents[a] = findParent(parents[a]);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>백준(boj)</category>
      <category>백준</category>
      <category>알고리즘</category>
      <category>자바</category>
      <author>cons-ps</author>
      <guid isPermaLink="true">https://cons-ps.tistory.com/37</guid>
      <comments>https://cons-ps.tistory.com/37#entry37comment</comments>
      <pubDate>Mon, 21 Aug 2023 11:49:20 +0900</pubDate>
    </item>
  </channel>
</rss>