<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>개발새발 블로그</title>
    <link>https://sunghyun98.tistory.com/</link>
    <description>https://github.com/glaxyt </description>
    <language>ko</language>
    <pubDate>Sun, 5 Apr 2026 16:13:19 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>개발자 성현</managingEditor>
    <image>
      <title>개발새발 블로그</title>
      <url>https://tistory1.daumcdn.net/tistory/5197662/attach/4b02ed5ff7e7416b9bcc0b8b959d37d6</url>
      <link>https://sunghyun98.tistory.com</link>
    </image>
    <item>
      <title>[백준][Java] 1967번 트리의 지름</title>
      <link>https://sunghyun98.tistory.com/445</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;java.png&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wQ08E/dJMcaap7PJo/prkXNyug6KteIWXpl4BK20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wQ08E/dJMcaap7PJo/prkXNyug6KteIWXpl4BK20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wQ08E/dJMcaap7PJo/prkXNyug6KteIWXpl4BK20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwQ08E%2FdJMcaap7PJo%2FprkXNyug6KteIWXpl4BK20%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;616&quot; height=&quot;670&quot; data-filename=&quot;java.png&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;670&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 링크&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1967&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/1967&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1796&quot; data-origin-height=&quot;1236&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KFipl/dJMcacuH8nH/acD6sOSiZnkhYscrlCtxL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KFipl/dJMcacuH8nH/acD6sOSiZnkhYscrlCtxL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KFipl/dJMcacuH8nH/acD6sOSiZnkhYscrlCtxL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKFipl%2FdJMcacuH8nH%2FacD6sOSiZnkhYscrlCtxL1%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;1796&quot; height=&quot;1236&quot; data-origin-width=&quot;1796&quot; data-origin-height=&quot;1236&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;h2 data-ke-size=&quot;size26&quot;&gt;풀이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 정점에서 가장 먼 정점을 찾으면 찾은&amp;nbsp;정점이&amp;nbsp;무조건&amp;nbsp;지름의&amp;nbsp;끝점&amp;nbsp;중&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;트리를 탐색하는 알고리즘은 DFS/BFS 상관없습니다. 다만 재귀는 트리가 깊으면 문제가 될 수 있기에 주의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드&lt;/h2&gt;
&lt;pre id=&quot;code_1763265702409&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    static List&amp;lt;List&amp;lt;Node&amp;gt;&amp;gt; graph = new ArrayList&amp;lt;&amp;gt;();
    static boolean[] visited;
    static int max = 0;
    static int maxId = 0;
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());
        for (int i = 0; i &amp;lt;= n; i++) {
            graph.add(new ArrayList&amp;lt;&amp;gt;());
        }

        for (int i = 0; i &amp;lt; n-1; i++) {
            int[] info = Arrays.stream(br.readLine().split(&quot; &quot;)).mapToInt(Integer::parseInt).toArray();
            int a = info[0];
            int b = info[1];
            int cost = info[2];

            graph.get(a).add(new Node(b, cost));
            graph.get(b).add(new Node(a, cost));
        }

        visited = new boolean[n+1];
        visited[1] = true;
        dfs(1, 0);

        visited = new boolean[n+1];
        visited[maxId] = true;
        dfs(maxId, 0);

        System.out.println(max);
    }

    public static void dfs(int s, int result) {
        if (result &amp;gt; max) {
            maxId = s;
            max = result;
        }

        for (Node nx : graph.get(s)) {
            if (!visited[nx.id]) {
                visited[nx.id] = true;
                dfs(nx.id, result + nx.cost);
            }
        }
    }
}

class Node {
    int id;
    int cost;

    public Node(int id, int cost) {
        this.id = id;
        this.cost = cost;
    }
}&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;h2 data-ke-size=&quot;size26&quot;&gt;출력결과&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1916&quot; data-origin-height=&quot;148&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYvB8I/dJMcagqllBG/sXw5dPx8pJLceFwHJED9nk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYvB8I/dJMcagqllBG/sXw5dPx8pJLceFwHJED9nk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYvB8I/dJMcagqllBG/sXw5dPx8pJLceFwHJED9nk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYvB8I%2FdJMcagqllBG%2FsXw5dPx8pJLceFwHJED9nk%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;1916&quot; height=&quot;148&quot; data-origin-width=&quot;1916&quot; data-origin-height=&quot;148&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>백준/DFS&amp;amp;BFS</category>
      <category>1967 자바</category>
      <category>1967 트리의 지름</category>
      <category>트리의 지름 자바</category>
      <author>개발자 성현</author>
      <guid isPermaLink="true">https://sunghyun98.tistory.com/445</guid>
      <comments>https://sunghyun98.tistory.com/445#entry445comment</comments>
      <pubDate>Sun, 16 Nov 2025 13:03:17 +0900</pubDate>
    </item>
    <item>
      <title>[백준][Java] 19942번 다이어트</title>
      <link>https://sunghyun98.tistory.com/444</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;java.png&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxJPJd/btsQ6KfktDH/vNk8gVswMV3SJxo3Qa2lck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxJPJd/btsQ6KfktDH/vNk8gVswMV3SJxo3Qa2lck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxJPJd/btsQ6KfktDH/vNk8gVswMV3SJxo3Qa2lck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxJPJd%2FbtsQ6KfktDH%2FvNk8gVswMV3SJxo3Qa2lck%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;616&quot; height=&quot;670&quot; data-filename=&quot;java.png&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;670&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;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/19942&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/19942&lt;/a&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;1888&quot; data-origin-height=&quot;1300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SaGwk/btsQ73LISNu/IbkSYX2zkcuWMOsm6zIkG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SaGwk/btsQ73LISNu/IbkSYX2zkcuWMOsm6zIkG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SaGwk/btsQ73LISNu/IbkSYX2zkcuWMOsm6zIkG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSaGwk%2FbtsQ73LISNu%2FIbkSYX2zkcuWMOsm6zIkG1%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;1888&quot; height=&quot;1300&quot; data-origin-width=&quot;1888&quot; data-origin-height=&quot;1300&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;h2 data-ke-size=&quot;size26&quot;&gt;풀이&lt;/h2&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;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드&lt;/h2&gt;
&lt;pre id=&quot;code_1760346167144&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    static String comboStr = &quot;&quot;;
    static int[] minimumNutrient = new int[4];
    static int minCost = Integer.MAX_VALUE;
    static int[][] ingredients;
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        int n = Integer.parseInt(br.readLine());
        int[] minimumTempNutrient = Arrays.stream(br.readLine().split(&quot; &quot;)).mapToInt(Integer::parseInt).toArray();
        for (int i = 0; i &amp;lt; 4; i++) {
            minimumNutrient[i] = minimumTempNutrient[i];
        }

        ingredients = new int[n + 1][5];
        for (int i = 0; i &amp;lt; n; i++) {
            int[] ingredient = Arrays.stream(br.readLine().split(&quot; &quot;)).mapToInt(Integer::parseInt).toArray();
            for (int j = 0; j &amp;lt; 5; j++) {
                ingredients[i + 1][j] = ingredient[j];
            }
        }

        dfs(n, 1, new NutrientCombo(minimumNutrient[0], minimumNutrient[1], minimumNutrient[2], minimumNutrient[3]));

        if (minCost == Integer.MAX_VALUE) {
            System.out.println(-1);
        } else {
            System.out.println(minCost);
            System.out.println(comboStr);
        }
    }

    private static void dfs(int n, int start, NutrientCombo combo) {
        if (combo.isSatisfy()) {
            if (minCost &amp;gt; combo.cost) {
                minCost = combo.cost;
                comboStr = combo.printCombo();
            }
        }

        for (int i = start; i &amp;lt;= n; i++) {
            combo.addIngredient(i, ingredients[i]);
            dfs(n, i+1, combo);
            combo.removeIngredient(i, ingredients[i]);
        }
    }
}

class NutrientCombo {
    int lowerProtein;
    int lowerFat;
    int lowerTansoo;
    int lowerVitamin;

    int protein = 0;
    int fat = 0;
    int tansoo = 0;
    int vitamin = 0;
    int cost = 0;
    List&amp;lt;Integer&amp;gt; combo = new ArrayList&amp;lt;&amp;gt;();

    public NutrientCombo(int lowerProtein, int lowerFat, int lowerTansoo, int lowerVitamin) {
        this.lowerProtein = lowerProtein;
        this.lowerFat = lowerFat;
        this.lowerTansoo = lowerTansoo;
        this.lowerVitamin = lowerVitamin;
    }

    public void addIngredient(int idx, int[] ingredient) {
        protein += ingredient[0];
        fat += ingredient[1];
        tansoo += ingredient[2];
        vitamin += ingredient[3];
        cost += ingredient[4];
        combo.add(idx);
    }

    public void removeIngredient(int idx, int[] ingredient) {
        protein -= ingredient[0];
        fat -= ingredient[1];
        tansoo -= ingredient[2];
        vitamin -= ingredient[3];
        cost -= ingredient[4];
        combo.remove(combo.size() - 1);
    }

    public boolean isSatisfy() {
        if (lowerProtein &amp;gt; protein) return false;
        if (lowerFat &amp;gt; fat) return false;
        if (lowerTansoo &amp;gt; tansoo) return false;
        if (lowerVitamin &amp;gt; vitamin) return false;
        return true;
    }

    public String printCombo() {
        StringBuilder sb = new StringBuilder();
        for (Integer i : combo) {
            sb.append(i).append(&quot; &quot;);
        }
        return sb.toString();
    }
}&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;h2 data-ke-size=&quot;size26&quot;&gt;출력결과&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2290&quot; data-origin-height=&quot;148&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LV23h/btsQ6Uu9yEz/lzdPfZkhw2tHV8b4kQUit0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LV23h/btsQ6Uu9yEz/lzdPfZkhw2tHV8b4kQUit0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LV23h/btsQ6Uu9yEz/lzdPfZkhw2tHV8b4kQUit0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLV23h%2FbtsQ6Uu9yEz%2FlzdPfZkhw2tHV8b4kQUit0%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;2290&quot; height=&quot;148&quot; data-origin-width=&quot;2290&quot; data-origin-height=&quot;148&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>백준/구현</category>
      <category>19942 다이어트</category>
      <category>19942 자바</category>
      <category>백준 19942</category>
      <category>백준 19942 자바</category>
      <category>백준 백트래킹 문제</category>
      <author>개발자 성현</author>
      <guid isPermaLink="true">https://sunghyun98.tistory.com/444</guid>
      <comments>https://sunghyun98.tistory.com/444#entry444comment</comments>
      <pubDate>Mon, 13 Oct 2025 18:03:47 +0900</pubDate>
    </item>
    <item>
      <title>[백준][Java] 23350번 K 물류창고</title>
      <link>https://sunghyun98.tistory.com/443</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;java.png&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oUrls/btsQCQsyJGJ/Hh6rwmifIHr990zhBJBKHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oUrls/btsQCQsyJGJ/Hh6rwmifIHr990zhBJBKHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oUrls/btsQCQsyJGJ/Hh6rwmifIHr990zhBJBKHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoUrls%2FbtsQCQsyJGJ%2FHh6rwmifIHr990zhBJBKHk%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;616&quot; height=&quot;670&quot; data-filename=&quot;java.png&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;670&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 링크&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/23350&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/23350&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1742&quot; data-origin-height=&quot;1408&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgRH4u/btsQCzkh7fH/8g08QXH6YV0Ud6t4t1bi4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgRH4u/btsQCzkh7fH/8g08QXH6YV0Ud6t4t1bi4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgRH4u/btsQCzkh7fH/8g08QXH6YV0Ud6t4t1bi4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgRH4u%2FbtsQCzkh7fH%2F8g08QXH6YV0Ud6t4t1bi4K%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;856&quot; height=&quot;692&quot; data-origin-width=&quot;1742&quot; data-origin-height=&quot;1408&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;h2 data-ke-size=&quot;size26&quot;&gt;풀이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구현문제입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선순위는 1에 가까울수록 낮은 우선 순위이며, M에 가까울수록 높은 우선순위를 갖습니다.&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;그리고 같은 우선순위를 가진 컨테이너 사이에서는 무게를 위에서부터 내림차순으로 쌓아야합니다.(무거운 것부터 아래로)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 먼저 적재된 컨테이너가 '현재 적재해야할 새로운 컨테이너'보다 무게가 적다면 있다면 옮겨놨다가 다시 쌓아야합니다. 컨테이너를 2번 옮겨야하기 때문에 비용이 이미 적재된 컨테이너의 무게의 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;- 레일의 처음으로 옮길 때&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;h2 data-ke-size=&quot;size26&quot;&gt;코드&lt;/h2&gt;
&lt;pre id=&quot;code_1758129727642&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    static PriorityQueue&amp;lt;Container&amp;gt; storage;
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        // 컨테이너를 적재한다.
        // 1에 가까울 수록 높은 우선수위이며, M에 가까울수록 낮은 우선순위를 갖는다.
        // 우선순위가 낮은 순서로 적재한다.
        // 만일 우선순위가 낮은 컨테이너가 아직 존재한다면 높은 우선순위의 컨테이너는 레일의 처음으로 보낸다.
        // 우선순위 큐는 오직 메타정보를 저장하는 용도이자 내가 찾는 컨테이너가 무엇인지를 알려주고,
        // 컨테이너 자체 구현은 큐로 구현한다
        // 낮은 우선순위의 컨테이너가 오면 무조건 적재한다.
        // 따라서 추후에 우선순위가 같지만 무게가 더 무겁다면,
        // 이 과정을, 가벼운 컨테이너가 모두 빠질 때까지 반복한다. 이 과정에서 컨테이너를 뺄 때와 적재될 때 컨테이너의 무게만큼 비용이 발생한다.
        int[] input = Arrays.stream(br.readLine().split(&quot; &quot;)).mapToInt(Integer::parseInt).toArray();
        int n = input[0];
        int m = input[1];

        List&amp;lt;Integer&amp;gt; priorities = new ArrayList&amp;lt;&amp;gt;();
        Deque&amp;lt;Container&amp;gt; rail = new ArrayDeque&amp;lt;&amp;gt;();
        // 레일의 처음으로 보낼 때, 컨테이너의 무게만큼 비용이 발생한다.
        storage = new PriorityQueue&amp;lt;&amp;gt;((Container a, Container b) -&amp;gt; {
            int val = Integer.compare(a.priority, b.priority);
            if (val == 0) return Integer.compare(a.weight, b.weight);
            return val;
        });

        for (int i = 0; i &amp;lt; n; i++) {
            int[] containerData = Arrays.stream(br.readLine().split(&quot; &quot;)).mapToInt(Integer::parseInt).toArray();
            int priority = containerData[0];
            int weight = containerData[1];
            priorities.add(priority);
            rail.offer(new Container(priority, weight));
        }

        priorities.sort((a, b) -&amp;gt; Integer.compare(b, a));

        int answer = 0;
        for (int idx = 0; idx &amp;lt; priorities.size(); idx++) {
            int targetPriority = priorities.get(idx);

            while (true) {
                Container cont = rail.poll();
                int curContPriority = cont.priority;

                if (curContPriority == targetPriority) {
                    // 찾았지만 아직 안에 넣어도 되는지 모른다. 무게 비교 필요
                    if (!storage.isEmpty()) answer += moveLighterContainer(cont);
                    storage.offer(cont);
                    answer += cont.weight;
                    break;
                }
                answer += cont.weight;
                rail.offer(cont);
            }
        }
        System.out.println(answer);
    }

    private static int moveLighterContainer(Container container) {
        int result = 0;
        int curContainerPriority = container.priority;
        int curContainerWeight = container.weight;
        List&amp;lt;Container&amp;gt; tempStorage = new ArrayList&amp;lt;&amp;gt;();

        while (!storage.isEmpty()) {
            Container topContainer = storage.peek();
            if (topContainer.priority == curContainerPriority &amp;amp;&amp;amp; topContainer.weight &amp;lt; curContainerWeight) {
                result += topContainer.weight;
                tempStorage.add(storage.poll());
            } else {
                break;
            }
        }

        for (Container cont : tempStorage) storage.offer(cont);

        return result * 2;
    }
}

class Container {
    int priority;
    int weight;

    public Container(int priority, int weight) {
        this.priority = priority;
        this.weight = weight;
    }
}&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;h2 data-ke-size=&quot;size26&quot;&gt;출력결과&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2080&quot; data-origin-height=&quot;146&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GJ8x8/btsQBtyarYD/RH0O6bt8kmzIAGzSt0KDKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GJ8x8/btsQBtyarYD/RH0O6bt8kmzIAGzSt0KDKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GJ8x8/btsQBtyarYD/RH0O6bt8kmzIAGzSt0KDKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGJ8x8%2FbtsQBtyarYD%2FRH0O6bt8kmzIAGzSt0KDKk%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;2080&quot; height=&quot;146&quot; data-origin-width=&quot;2080&quot; data-origin-height=&quot;146&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>백준/구현</category>
      <category>23350 자바</category>
      <category>K물류창고</category>
      <category>백준 23350</category>
      <category>백준 23350 자바</category>
      <category>백준 자바</category>
      <author>개발자 성현</author>
      <guid isPermaLink="true">https://sunghyun98.tistory.com/443</guid>
      <comments>https://sunghyun98.tistory.com/443#entry443comment</comments>
      <pubDate>Thu, 18 Sep 2025 02:23:17 +0900</pubDate>
    </item>
    <item>
      <title>[백준][Java] 12834번 주간 미팅</title>
      <link>https://sunghyun98.tistory.com/442</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;java.png&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJx41I/btsQmpOneUS/3oYCBUwT3m6ooWoUxkph0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJx41I/btsQmpOneUS/3oYCBUwT3m6ooWoUxkph0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJx41I/btsQmpOneUS/3oYCBUwT3m6ooWoUxkph0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJx41I%2FbtsQmpOneUS%2F3oYCBUwT3m6ooWoUxkph0K%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;616&quot; height=&quot;670&quot; data-filename=&quot;java.png&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;670&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1894&quot; data-origin-height=&quot;1368&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ERPDJ/btsQkmeCRK5/yckhtZlaBnkDgKJc6Urf30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ERPDJ/btsQkmeCRK5/yckhtZlaBnkDgKJc6Urf30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ERPDJ/btsQkmeCRK5/yckhtZlaBnkDgKJc6Urf30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FERPDJ%2FbtsQkmeCRK5%2FyckhtZlaBnkDgKJc6Urf30%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;852&quot; height=&quot;615&quot; data-origin-width=&quot;1894&quot; data-origin-height=&quot;1368&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;h2 data-ke-size=&quot;size26&quot;&gt;풀이&lt;/h2&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;h2 data-ke-size=&quot;size26&quot;&gt;코드&lt;/h2&gt;
&lt;pre id=&quot;code_1756966998913&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.*;
import java.util.stream.Collectors;

public class Main {
    static int[][] graph;
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        // KIST 기사단 N명의 집이 있는 노드 번호
        // KIST, 씨알푸드의 노드 번호
        // 한 사람의 거리 di = (집-KIST의 최단 거리) + (집-씨알푸드의 최단 거리)
        // 도달할 수 없는 경우의 최단 거리는 -1로 정의
        // 주어진 기사단의 총 거리 합을 계산하는 것이 목표

        int[] input = Arrays.stream(br.readLine().split(&quot; &quot;))
                .mapToInt(Integer::parseInt).toArray();
        int n = input[0];
        int v = input[1];
        int e = input[2];

        graph = new int[v+1][v+1];
        int[] targetNodes = Arrays.stream(br.readLine().split(&quot; &quot;))
                .mapToInt(Integer::parseInt).toArray();
        int kistNode = targetNodes[0];
        int crFoodNode = targetNodes[1];

        List&amp;lt;Integer&amp;gt; teammateNodes = Arrays.stream(br.readLine().split(&quot; &quot;))
                .map(Integer::parseInt).collect(Collectors.toList());

        int answer = 0;
        for (int i = 0; i &amp;lt; e; i++) {
            int[] data = Arrays.stream(br.readLine().split(&quot; &quot;))
                    .mapToInt(Integer::parseInt).toArray();
            int a = data[0];
            int b = data[1];
            int w = data[2];
            graph[a][b] = w;
            graph[b][a] = w;
        }

        for (int teammateNode : teammateNodes) {
            answer += dijkstra(v, teammateNode, kistNode, crFoodNode);
        }

        System.out.println(answer);
    }

    private static int dijkstra(int v, int teamHomeNode, int kist, int food) {
        int result = 0;

        PriorityQueue&amp;lt;Node&amp;gt; pq = new PriorityQueue&amp;lt;&amp;gt;(
                (Node a, Node b) -&amp;gt; Integer.compare(a.weight, b.weight));
        pq.offer(new Node(teamHomeNode, 0));
        int[] dis = new int[v+1];
        Arrays.fill(dis, Integer.MAX_VALUE);
        dis[teamHomeNode] = 0;

        while (!pq.isEmpty()) {
            Node curNode = pq.poll();

            if (curNode.weight &amp;gt; dis[curNode.id]) continue;

            for (int nextNodeId = 1; nextNodeId &amp;lt;= v; nextNodeId++) {
                int weight = graph[curNode.id][nextNodeId];
                if (weight == 0) continue;

                int newWeight = weight + curNode.weight;
                if (newWeight &amp;lt; dis[nextNodeId]) {
                    dis[nextNodeId] = newWeight;
                    pq.offer(new Node(nextNodeId, newWeight));
                }
            }
        }

        if (dis[food] == Integer.MAX_VALUE) result += -1;
        else result += dis[food];

        if (dis[kist] == Integer.MAX_VALUE) result += -1;
        else result += dis[kist];

        return result;
    }
}

class Node {
    int id;
    int weight;

    public Node(int id, int weight) {
        this.id = id;
        this.weight = weight;
    }
}&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;h2 data-ke-size=&quot;size26&quot;&gt;출력결과&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2286&quot; data-origin-height=&quot;152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/diOLx6/btsQlBBZoCS/9l3lqlgOngvR0bgBROAY20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/diOLx6/btsQlBBZoCS/9l3lqlgOngvR0bgBROAY20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/diOLx6/btsQlBBZoCS/9l3lqlgOngvR0bgBROAY20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdiOLx6%2FbtsQlBBZoCS%2F9l3lqlgOngvR0bgBROAY20%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;860&quot; height=&quot;57&quot; data-origin-width=&quot;2286&quot; data-origin-height=&quot;152&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>백준/최단거리</category>
      <category>12834 자바</category>
      <category>12834 주간 미팅</category>
      <category>다익스트라</category>
      <category>자바 주간 미팅</category>
      <category>주간 미팅</category>
      <author>개발자 성현</author>
      <guid isPermaLink="true">https://sunghyun98.tistory.com/442</guid>
      <comments>https://sunghyun98.tistory.com/442#entry442comment</comments>
      <pubDate>Thu, 4 Sep 2025 15:27:07 +0900</pubDate>
    </item>
    <item>
      <title>[백준][Java] 13904번 과제</title>
      <link>https://sunghyun98.tistory.com/441</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;java.png&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wuLlo/btsQdXMPusq/AzefIXstVjlizBLJ0pjeak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wuLlo/btsQdXMPusq/AzefIXstVjlizBLJ0pjeak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wuLlo/btsQdXMPusq/AzefIXstVjlizBLJ0pjeak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwuLlo%2FbtsQdXMPusq%2FAzefIXstVjlizBLJ0pjeak%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;616&quot; height=&quot;670&quot; data-filename=&quot;java.png&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;670&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제&lt;br /&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2344&quot; data-origin-height=&quot;1388&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zaFgU/btsQdQGXGq8/IKrEFegRW9kkanlB5AclR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zaFgU/btsQdQGXGq8/IKrEFegRW9kkanlB5AclR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zaFgU/btsQdQGXGq8/IKrEFegRW9kkanlB5AclR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzaFgU%2FbtsQdQGXGq8%2FIKrEFegRW9kkanlB5AclR0%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;2344&quot; height=&quot;1388&quot; data-origin-width=&quot;2344&quot; data-origin-height=&quot;1388&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;풀이&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백트래킹으로 풀어야하는가? 아니면 그리디로 풀 수 있는가? 2개의 고민부터 시작했다.&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1756577738352&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 Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        // 시간복잡도면에서 그렇게 불리해보이지는 않는다.
        // 백트래킹이 맞는가? 안어룰리는 근거는?
        // 점수가 최댓값이어야하니 이 값들을 우선적으로 정렬해서 우겨넣어봐야한다.
        List&amp;lt;int[]&amp;gt; assignments = new ArrayList&amp;lt;&amp;gt;();

        for (int i = 0; i &amp;lt; n; i++) {
            int[] assignmentData = Arrays.stream(br.readLine().split(&quot; &quot;)).mapToInt(Integer::parseInt).toArray();
            assignments.add(assignmentData);
        }

        assignments.sort(Comparator.comparing((int[] data) -&amp;gt; (data[1])).reversed());

        int answer = 0;
        boolean[] visited = new boolean[1001];

        for (int i = 0; i &amp;lt; n; i++) {
            int d = assignments.get(i)[0];
            int w = assignments.get(i)[1];

            int idx = d;
            while(idx &amp;gt; 0) {
                if (!visited[idx]) {
                    visited[idx] = true;
                    answer += w;
                    break;
                }
                idx--;
            }
        }
        System.out.println(answer);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;출력결과&lt;br /&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2286&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brUbN1/btsQcmzuaFV/T7ohyMyH6mbLkfEdBGoBbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brUbN1/btsQcmzuaFV/T7ohyMyH6mbLkfEdBGoBbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brUbN1/btsQcmzuaFV/T7ohyMyH6mbLkfEdBGoBbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrUbN1%2FbtsQcmzuaFV%2FT7ohyMyH6mbLkfEdBGoBbK%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;2286&quot; height=&quot;150&quot; data-origin-width=&quot;2286&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;</description>
      <category>백준/그리디</category>
      <category>13904 자바</category>
      <category>13904번 과제</category>
      <category>그리디</category>
      <category>백준 13904</category>
      <author>개발자 성현</author>
      <guid isPermaLink="true">https://sunghyun98.tistory.com/441</guid>
      <comments>https://sunghyun98.tistory.com/441#entry441comment</comments>
      <pubDate>Sun, 31 Aug 2025 03:19:43 +0900</pubDate>
    </item>
    <item>
      <title>[Java] Volatile: 메모리 가시성과 멀티스레딩</title>
      <link>https://sunghyun98.tistory.com/440</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;java.png&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bg2UxP/btsPRnEW1Cd/HWMk0OwzHhMtuD4UbHTjL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bg2UxP/btsPRnEW1Cd/HWMk0OwzHhMtuD4UbHTjL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bg2UxP/btsPRnEW1Cd/HWMk0OwzHhMtuD4UbHTjL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbg2UxP%2FbtsPRnEW1Cd%2FHWMk0OwzHhMtuD4UbHTjL0%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;616&quot; height=&quot;670&quot; data-filename=&quot;java.png&quot; data-origin-width=&quot;616&quot; data-origin-height=&quot;670&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Java의 Volatile 키워드: 메모리 가시성과 멀티스레딩&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백엔드 개발자로서 멀티스레드 환경을 다루다 보면, 데이터의 일관성과 가시성 문제가 자주 발생합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 Java 개발자라면 Volatile 키워드가 왜 중요한지, 그리고 이를 어떻게 활용할지 이해하는 것이 핵심입니다.&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;이 글에서는 Volatile의 기본 개념부터 Java Memory Model(JMM)까지 단계적으로 설명하겠습니다. 실제 코드 예시를 통해 개념을 구체화하고, 나중에 다시 읽을 때 도움이 되도록 깊이 있게 다루겠습니다.&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;메모리 가시성(Memory Visibility)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멀티스레드 환경에서 한 스레드가 변경한 값이 다른 스레드에서 언제 보이는지에 대한 문제를 메모리 가시성(Memory Visibility)이라고 합니다. 이름 그대로 메모리에 변경한 값이 보이는가, 보이지 않는가에 대한 문제입니다.&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;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public class VisibilityExample {
    private boolean flag = false;

    public void writer() {
        flag = true;  *// 스레드 1에서 변경*
    }

    public void reader() {
        while (!flag) {
            *// 스레드 2에서 flag가 true가 될 때까지 대기*
        }
        System.out.println(&quot;Flag is now true&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 스레드 1이 flag를 true로 변경해도, 스레드 2가 이를 즉시 보지 못할 수 있습니다. 이는 각 스레드가 로컬 캐시를 사용하기 때문입니다. Volatile을 사용하지 않으면, 변경 사항이 메인 메모리에 즉시 반영되지 않아 무한 루프가 발생할 위험이 있습니다.&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;L1, L2 캐시와 Volatile의 역할&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체적인 문제는 코어 당 메인 메모리에 접근하는 것이 아니라 L1, L2와 같은 캐시에 접근하기 때문입니다. 따라서 캐시라는 중간 매개체가 존재하기 때문에 데이터가 변경되더라도 스레드 별로 변경된 데이터를 인식하는 데 시간이 걸립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 이미지에서 스레드가 메인 메모리가 아닌 캐시에 먼저 접근하는 것을 알 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;cache.png&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;592&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIrbqi/btsPS5b4gfy/cPuGoy6Fig8atfxTThsvU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIrbqi/btsPS5b4gfy/cPuGoy6Fig8atfxTThsvU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIrbqi/btsPS5b4gfy/cPuGoy6Fig8atfxTThsvU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIrbqi%2FbtsPS5b4gfy%2FcPuGoy6Fig8atfxTThsvU0%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;724&quot; height=&quot;592&quot; data-filename=&quot;cache.png&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;592&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Volatile은 메인 메모리에 직접 접근하게 해 메모리 가시성 문제를 해소합니다. 그래서 Volatile은 항상 메인 메모리에 접근하도록 합니다. 캐시를 사용하지 않습니다.&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;더 정확히 말하면, Volatile 변수는 읽기/쓰기 연산 시 캐시를 무시하고 메인 메모리와 직접 동기화됩니다. 이는 CPU 캐시 코히어런시 프로토콜(예: MESI 프로토콜)을 통해 보장되지만, Volatile 자체는 캐시를 완전히 배제하는 것이 아니라 가시성을 강제합니다.&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;예시를 확장해 Volatile을 적용해 보겠습니다.&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;public class VolatileExample {
    private volatile boolean flag = false;

    public void writer() {
        flag = true;  *// 메인 메모리에 즉시 반영*
    }

    public void reader() {
        while (!flag) {
            *// Volatile 덕분에 변경이 보임*
        }
        System.out.println(&quot;Flag is now true&quot;);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Volatile을 추가하면, flag의 변경이 다른 스레드에게 보장되며 무한 루프를 피할 수 있습니다. &lt;br /&gt;이는 JMM에서 Volatile이 happens-before 관계를 제공하기 때문입니다(아래에서 자세히 설명).&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;Volatile의 성능 영향&lt;/h3&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;그래서 Volatile을 사용할 경우 데이터 접근이 모두 메인 메모리에서 이루어지기 때문에 성능이 캐시보다 좋지 않습니다.&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;주의할 점은 Volatile은 가시성을 보장하지만, 원자성을 보장하지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, volatile int counter에 대한 counter++ 연산은 여전히 race condition이 발생할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성능 측면에서 Volatile은 캐시 미스를 유발할 수 있지만, 현대 JVM과 하드웨어 최적화로 인해 오버헤드가 크지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만, 불필요한 Volatile 사용은 피해야합니다. 특히 공유 변수가 정말 가시성 문제가 있을 때만 적용하는 것이 좋습니다.&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;Java Memory Model(JMM)과 Happens-Before&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java Memory Model(JMM)은 멀티스레드 프로그램의 동작을 정의합니다. JMM은 스레드 간 작업의 순서를 보장하는 'happens-before' 관계를 중심으로 합니다. 이는 한 작업이 다른 작업 전에 '발생'했다고 보는 규칙입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Volatile과 관련된 happens-before 규칙은 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Volatile 변수에 쓰기 작업이 일어나면, 그 이후의 해당 변수 읽기 작업은 쓰기 결과를 봅니다.&lt;/li&gt;
&lt;li&gt;Volatile 쓰기 전에 일어난 모든 작업은, 그 Volatile 읽기 후에 보입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 예시를 보겠습니다.&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;public class HappensBeforeExample {
    private int value = 0;
    private volatile boolean ready = false;

    public void producer() {
        value = 42;
        ready = true;  *// Volatile 쓰기: value 설정이 보장됨*
    }

    public void consumer() {
        if (ready) {  *// Volatile 읽기*
            System.out.println(value);  *// 42 출력 보장*
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 ready의 Volatile 쓰기는 value 설정이 consumer에게 보이도록 합니다. 이는 JMM의 강력한 보장으로, 동기화 없이 안전한 publikation을 가능하게 합니다.&lt;/p&gt;</description>
      <category>Dev Lang/Java</category>
      <category>Backend Development</category>
      <category>concurrency</category>
      <category>java</category>
      <category>Java Memory Model</category>
      <category>Memory Visibility</category>
      <category>Multithreading</category>
      <category>Programming</category>
      <category>volatile</category>
      <author>개발자 성현</author>
      <guid isPermaLink="true">https://sunghyun98.tistory.com/440</guid>
      <comments>https://sunghyun98.tistory.com/440#entry440comment</comments>
      <pubDate>Wed, 13 Aug 2025 17:11:44 +0900</pubDate>
    </item>
    <item>
      <title>[백준][Python] 20006번 랭킹전 대기열</title>
      <link>https://sunghyun98.tistory.com/439</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;python.png&quot; data-origin-width=&quot;1526&quot; data-origin-height=&quot;1006&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GHVCt/btsPJaYCWwF/OyJmKUjFDCBLlqykuAv2Dk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GHVCt/btsPJaYCWwF/OyJmKUjFDCBLlqykuAv2Dk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GHVCt/btsPJaYCWwF/OyJmKUjFDCBLlqykuAv2Dk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGHVCt%2FbtsPJaYCWwF%2FOyJmKUjFDCBLlqykuAv2Dk%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;1526&quot; height=&quot;1006&quot; data-filename=&quot;python.png&quot; data-origin-width=&quot;1526&quot; data-origin-height=&quot;1006&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/20006&quot;&gt;https://www.acmicpc.net/problem/20006&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;909&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dlvIOi/btsPIGwIocy/Gy4YsETpekjnQfHC5hLou0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dlvIOi/btsPIGwIocy/Gy4YsETpekjnQfHC5hLou0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dlvIOi/btsPIGwIocy/Gy4YsETpekjnQfHC5hLou0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdlvIOi%2FbtsPIGwIocy%2FGy4YsETpekjnQfHC5hLou0%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;944&quot; height=&quot;909&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;909&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;h2 data-ke-size=&quot;size26&quot;&gt;코드&lt;/h2&gt;
&lt;pre id=&quot;code_1754368191396&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution():
    p, m = map(int, input().split())
    # 방의 레벨 제한 키: 순서, [레벨, 인원 수]
    room_info = dict()
    # 방에 누가 있는지 키: 순서, 누가있는지
    room_players = dict()
    idx = 0
    # 방은 생성순, 플레이어는 사전순
    for _ in range(p):
        level, name = input().split()
        level = int(level)
        is_join = False
        for key in room_info.keys():
            limit_level = room_info[key][0]
            room_player_numb = room_info[key][1]
            if room_player_numb == m:
                continue
            if limit_level - 10 &amp;lt;= level &amp;lt;= limit_level + 10:
                room_info[key][1] += 1
                room_players[key].append([level, name])
                is_join = True
                break
        if not is_join:
            idx += 1
            room_info[idx] = [level, 1]
            room_players[idx] = []
            room_players[idx].append([level, name])

    keys = sorted(list(room_info.keys()))
    for key in keys:
        _, player_num = room_info[key]
        if player_num == m:
            print(&quot;Started!&quot;)
        else:
            print(&quot;Waiting!&quot;)
        for player_info in sorted(room_players[key], key=lambda x : x[1]):
            print(*player_info)
    
solution()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;풀이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구현 문제입니다. 그래서 어떻게 데이터를 저장해야 답을 표현할 수 있을지부터 생각했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2개의 딕셔너리를 사용하기로 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;room_info는 방의 입장하기 위한 기준 레벨과 입장한 인원 수를 관리합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;room_players는 특정 방의 입장한 사용자들의 정보를 저장하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 2개의 딕셔너리는 모두 방이 생성된 순서를 key를 기준으로 저장되어있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;출력결과&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1142&quot; data-origin-height=&quot;77&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGS2nK/btsPFE8wf1w/qC1azVictJ6XNn8S59Cn1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGS2nK/btsPFE8wf1w/qC1azVictJ6XNn8S59Cn1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGS2nK/btsPFE8wf1w/qC1azVictJ6XNn8S59Cn1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGS2nK%2FbtsPFE8wf1w%2FqC1azVictJ6XNn8S59Cn1K%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;1142&quot; height=&quot;77&quot; data-origin-width=&quot;1142&quot; data-origin-height=&quot;77&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;</description>
      <category>백준/구현</category>
      <category>20006</category>
      <category>20006 파이썬</category>
      <category>랭킹전 대기열</category>
      <category>랭킹전 대기열 파이썬</category>
      <category>백준</category>
      <category>백준 20006</category>
      <author>개발자 성현</author>
      <guid isPermaLink="true">https://sunghyun98.tistory.com/439</guid>
      <comments>https://sunghyun98.tistory.com/439#entry439comment</comments>
      <pubDate>Tue, 5 Aug 2025 13:38:32 +0900</pubDate>
    </item>
    <item>
      <title>[백준][Python] 1863번 스카이라인 쉬운거</title>
      <link>https://sunghyun98.tistory.com/438</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;python.png&quot; data-origin-width=&quot;1526&quot; data-origin-height=&quot;1006&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKdfuR/btsPF4q0qBn/0cgyE2CzYVDYXkIAt1UTB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKdfuR/btsPF4q0qBn/0cgyE2CzYVDYXkIAt1UTB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKdfuR/btsPF4q0qBn/0cgyE2CzYVDYXkIAt1UTB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKdfuR%2FbtsPF4q0qBn%2F0cgyE2CzYVDYXkIAt1UTB0%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;855&quot; height=&quot;564&quot; data-filename=&quot;python.png&quot; data-origin-width=&quot;1526&quot; data-origin-height=&quot;1006&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;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1167&quot; data-origin-height=&quot;684&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x3GId/btsPErHzScn/6MUajPiP7VHhkthTMXTuEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x3GId/btsPErHzScn/6MUajPiP7VHhkthTMXTuEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x3GId/btsPErHzScn/6MUajPiP7VHhkthTMXTuEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx3GId%2FbtsPErHzScn%2F6MUajPiP7VHhkthTMXTuEk%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;855&quot; height=&quot;501&quot; data-origin-width=&quot;1167&quot; data-origin-height=&quot;684&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;h2 data-ke-size=&quot;size26&quot;&gt;풀이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주어지는 n이 최대 50,000 이고 x 좌표의 범위는 1,000,000,0 이고 y좌표의 범위는 500,000이기에 이차원 리스트로 풀어볼 생각은 버리게 되었습니다.&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;h2 data-ke-size=&quot;size26&quot;&gt;코드&lt;/h2&gt;
&lt;pre id=&quot;code_1754065973704&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from collections import defaultdict

def solution():
    n = int(input())

    heights_set = defaultdict(int)
    answer = 0

    for _ in range(n):
        x, y = map(int, input().split())
        for ex_h in heights_set.keys():
            if ex_h &amp;gt; y and heights_set[ex_h] &amp;gt; 0:
                answer += 1
                heights_set[ex_h] = 0
        if y != 0:
            heights_set[y] = 1

    for ex_h in heights_set.keys():
        if heights_set[ex_h] &amp;gt; 0:
            answer += 1

    print(answer)

solution()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;출력결과&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1144&quot; data-origin-height=&quot;79&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b93TId/btsPFsZWRFD/wraLxqZoiOAtiWFKlVNML1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b93TId/btsPFsZWRFD/wraLxqZoiOAtiWFKlVNML1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b93TId/btsPFsZWRFD/wraLxqZoiOAtiWFKlVNML1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb93TId%2FbtsPFsZWRFD%2FwraLxqZoiOAtiWFKlVNML1%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;860&quot; height=&quot;59&quot; data-origin-width=&quot;1144&quot; data-origin-height=&quot;79&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>백준/스택 &amp;amp; 큐</category>
      <category>1863</category>
      <category>1863 파이썬</category>
      <category>백준 1863</category>
      <category>백준 스카이라인 쉬운거</category>
      <author>개발자 성현</author>
      <guid isPermaLink="true">https://sunghyun98.tistory.com/438</guid>
      <comments>https://sunghyun98.tistory.com/438#entry438comment</comments>
      <pubDate>Sat, 2 Aug 2025 01:37:22 +0900</pubDate>
    </item>
    <item>
      <title>[백준][Python] 30970번 선택의 기로</title>
      <link>https://sunghyun98.tistory.com/437</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;python.png&quot; data-origin-width=&quot;1526&quot; data-origin-height=&quot;1006&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ci356z/btsPGFEojIU/SM7dsyYnkpWTTDCsztPwr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ci356z/btsPGFEojIU/SM7dsyYnkpWTTDCsztPwr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ci356z/btsPGFEojIU/SM7dsyYnkpWTTDCsztPwr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fci356z%2FbtsPGFEojIU%2FSM7dsyYnkpWTTDCsztPwr0%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;851&quot; height=&quot;561&quot; data-filename=&quot;python.png&quot; data-origin-width=&quot;1526&quot; data-origin-height=&quot;1006&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/30970&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/30970&lt;/a&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1190&quot; data-origin-height=&quot;748&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lX458/btsPDFlZGTc/Ul9vWm4PvJpUUojzlwNETK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lX458/btsPDFlZGTc/Ul9vWm4PvJpUUojzlwNETK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lX458/btsPDFlZGTc/Ul9vWm4PvJpUUojzlwNETK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlX458%2FbtsPDFlZGTc%2FUl9vWm4PvJpUUojzlwNETK%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;1190&quot; height=&quot;748&quot; data-origin-width=&quot;1190&quot; data-origin-height=&quot;748&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;h2 data-ke-size=&quot;size26&quot;&gt;풀이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리스트 안에 입력값을 집어넣은 다음에 람다로 정렬을 수행하면 풀 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;품질과 가격 순서로 고가치 고가성비 촉석루 미니어처를 고른다면 key: lambda x: x[0], -x[1]과 같이 정렬을 손쉽게 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드&lt;/h2&gt;
&lt;pre id=&quot;code_1754063390029&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys

def solution():
    n = int(input())
    rocks = []
    for _ in range(n):
        rock_info = list(map(int, sys.stdin.readline().strip().split()))
        rocks.append(rock_info)

    prefer_quality_rocks = sorted(rocks, key = lambda x: (x[0], -x[1]), reverse = True)
    prefer_price_rocks = sorted(rocks, key = lambda x: (-x[1], x[0]), reverse = True)

    print(*prefer_quality_rocks[0], *prefer_quality_rocks[1])
    print(*prefer_price_rocks[0], *prefer_price_rocks[1])

solution()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;출력결과&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1143&quot; data-origin-height=&quot;79&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8B4i4/btsPDGLYPyi/6TJlCw59V0csQUHdL7NoKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8B4i4/btsPDGLYPyi/6TJlCw59V0csQUHdL7NoKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8B4i4/btsPDGLYPyi/6TJlCw59V0csQUHdL7NoKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8B4i4%2FbtsPDGLYPyi%2F6TJlCw59V0csQUHdL7NoKK%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;860&quot; height=&quot;59&quot; data-origin-width=&quot;1143&quot; data-origin-height=&quot;79&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>백준/구현</category>
      <category>30970</category>
      <category>백준 30970</category>
      <category>백준 선택의 기로</category>
      <category>선택의 기로</category>
      <category>파이썬 30970</category>
      <author>개발자 성현</author>
      <guid isPermaLink="true">https://sunghyun98.tistory.com/437</guid>
      <comments>https://sunghyun98.tistory.com/437#entry437comment</comments>
      <pubDate>Sat, 2 Aug 2025 00:51:06 +0900</pubDate>
    </item>
    <item>
      <title>[백준][Python] 13748번 Periodic Strings</title>
      <link>https://sunghyun98.tistory.com/436</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;python.png&quot; data-origin-width=&quot;1526&quot; data-origin-height=&quot;1006&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SU2cq/btsPGj9gHsB/iAqEahUlXTwhfl1x7fbjD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SU2cq/btsPGj9gHsB/iAqEahUlXTwhfl1x7fbjD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SU2cq/btsPGj9gHsB/iAqEahUlXTwhfl1x7fbjD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSU2cq%2FbtsPGj9gHsB%2FiAqEahUlXTwhfl1x7fbjD1%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;855&quot; height=&quot;564&quot; data-filename=&quot;python.png&quot; data-origin-width=&quot;1526&quot; data-origin-height=&quot;1006&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/13748&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/13748&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1176&quot; data-origin-height=&quot;875&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FzLrr/btsPDOiNyO2/KX67N9TOpFkpDKkhlrhGHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FzLrr/btsPDOiNyO2/KX67N9TOpFkpDKkhlrhGHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FzLrr/btsPDOiNyO2/KX67N9TOpFkpDKkhlrhGHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFzLrr%2FbtsPDOiNyO2%2FKX67N9TOpFkpDKkhlrhGHk%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;849&quot; height=&quot;632&quot; data-origin-width=&quot;1176&quot; data-origin-height=&quot;875&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;문제&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&quot;k-주기 문자열&quot;을 다음과 같이 정의합니다. 문자열 s가 &lt;b&gt;k-주기(k-periodic)&lt;/b&gt;라는 것은, 문자열의 길이 |s|가 k의 배수이고, 문자열을 길이 k의 부분 문자열들(|s|/k개)로 잘랐을 때, 각 부분 문자열(첫 번째 제외)이 바로 이전 부분 문자열의 마지막 문자를 맨 앞으로 이동시킨 것과 같은 경우를 말합니다. 예를 들어, abccabbcaabc는 3-주기 문자열입니다. 이 문자열은 abc, cab, bca, abc로 나뉘며, 각 부분 문자열은 이전 부분 문자열의 회전 형태입니다(abc &amp;rarr; cab, cab &amp;rarr; bca, bca &amp;rarr; abc). 주어진 문자열에 대해, 그 문자열이 k-주기가 되는 가장 작은 k값을 찾으세요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;입력&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;입력은 한 줄이며, 소문자로만 구성된 문자열 s를 포함합니다 (문자열 길이: 1 이상 100 이하).&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;출력&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;입력된 문자열이 k-주기가 되는 가장 작은 k값을 나타내는 정수 하나를 출력합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;풀이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;항상 첫 풀이의 시작은 완전탐색으로 생각했습니다. 입력 값의 범위도 크지않아서 부담스럽지않았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;K 길이의 문자를 잘라서 주기 별로 뒷 문자를 앞 문자로 옮겨서 같은지 비교하는 방식으로 문제를 풀었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;코드&lt;/h2&gt;
&lt;pre id=&quot;code_1754063506298&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution():
    answer = 1
    word = list(input())
    word_length = len(word)
    for k in range(1, word_length + 1):
        if word_length % k == 0:
            # 마지막 문자를 맨 앞으로 옮긴 것과 같아야함
            if compareTwoWord(k, word_length, word):
                answer = k
                break
    print(answer)

def compareTwoWord(k, word_length, word):
    idx = k
    k_word = word[:k]
    while idx - 1 + k  &amp;lt; word_length:
        temp = k_word.pop()
        k_word.insert(0, temp)

        for i in range(k):
            if k_word[i] != word[idx + i]:
                return False

        idx += k

    return True

solution()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;출력결과&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1142&quot; data-origin-height=&quot;75&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brLHQM/btsPEObpNVV/XE3AkKiL4uZRxh9Ri2LopK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brLHQM/btsPEObpNVV/XE3AkKiL4uZRxh9Ri2LopK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brLHQM/btsPEObpNVV/XE3AkKiL4uZRxh9Ri2LopK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrLHQM%2FbtsPEObpNVV%2FXE3AkKiL4uZRxh9Ri2LopK%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;845&quot; height=&quot;55&quot; data-origin-width=&quot;1142&quot; data-origin-height=&quot;75&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>백준/완전 탐색</category>
      <category>13748</category>
      <category>13748 파이썬</category>
      <category>13748번 Periodic Strings</category>
      <category>백준 13748</category>
      <author>개발자 성현</author>
      <guid isPermaLink="true">https://sunghyun98.tistory.com/436</guid>
      <comments>https://sunghyun98.tistory.com/436#entry436comment</comments>
      <pubDate>Sat, 2 Aug 2025 00:30:31 +0900</pubDate>
    </item>
  </channel>
</rss>