<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>jihyung1997</title>
    <link>https://jihyung1997.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Tue, 2 Jun 2026 13:36:01 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>끄응끄응</managingEditor>
    <item>
      <title>[diamond1][해설미확인,분류확인] boj2586 소방차 (아이디어만)</title>
      <link>https://jihyung1997.tistory.com/63</link>
      <description>&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;1648&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dntoiw/dJMcahc2mPF/zyr62Q1kQJdzDhK04KeelK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dntoiw/dJMcahc2mPF/zyr62Q1kQJdzDhK04KeelK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dntoiw/dJMcahc2mPF/zyr62Q1kQJdzDhK04KeelK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdntoiw%2FdJMcahc2mPF%2Fzyr62Q1kQJdzDhK04KeelK%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;1648&quot; data-origin-width=&quot;2290&quot; data-origin-height=&quot;1648&quot;/&gt;&lt;/span&gt;&lt;/figure&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1277&quot; data-origin-height=&quot;369&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Lt6tT/dJMcaf7lBW7/cxSnJhZZAkUFQQnaWRfjg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Lt6tT/dJMcaf7lBW7/cxSnJhZZAkUFQQnaWRfjg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Lt6tT/dJMcaf7lBW7/cxSnJhZZAkUFQQnaWRfjg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLt6tT%2FdJMcaf7lBW7%2FcxSnJhZZAkUFQQnaWRfjg1%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;1277&quot; height=&quot;369&quot; data-origin-width=&quot;1277&quot; data-origin-height=&quot;369&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 위와 같이 소방차를 1번부터 맨왼쪽 호스로 차례로 연결한다.&amp;nbsp; 그럼 모든 소방차는 왼쪽 호스로 쏠린 상태일 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 그런 상태는 절대로 정답이 아닐 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 위와같은 상태에서 소방차와 호스사이에 칸을 띄워야 할 것이다.&amp;nbsp; 예를들어 소방차 2번부터 한칸을 띄우면 아래와 같이 된다.&lt;/p&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;515&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oueTv/dJMcahD5sIb/fKWSb5uTww03f8pfpWynsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oueTv/dJMcahD5sIb/fKWSb5uTww03f8pfpWynsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oueTv/dJMcahD5sIb/fKWSb5uTww03f8pfpWynsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoueTv%2FdJMcahD5sIb%2FfKWSb5uTww03f8pfpWynsK%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;1894&quot; height=&quot;515&quot; data-origin-width=&quot;1894&quot; data-origin-height=&quot;515&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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-origin-width=&quot;1737&quot; data-origin-height=&quot;281&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x3uMS/dJMcafsKvMW/KjtU9eUmq89RzNCoSLfCh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x3uMS/dJMcafsKvMW/KjtU9eUmq89RzNCoSLfCh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x3uMS/dJMcafsKvMW/KjtU9eUmq89RzNCoSLfCh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx3uMS%2FdJMcafsKvMW%2FKjtU9eUmq89RzNCoSLfCh1%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;1737&quot; height=&quot;281&quot; data-origin-width=&quot;1737&quot; data-origin-height=&quot;281&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 1번소방차, 2번소방차 사이의&amp;nbsp; 1의 의미는 1번과 2번사이에 1칸을 띄웠다는 것이다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1412&quot; data-origin-height=&quot;249&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b50ZXN/dJMcaiQv381/V7KDDBUOaCvpPMbPUkKsn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b50ZXN/dJMcaiQv381/V7KDDBUOaCvpPMbPUkKsn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b50ZXN/dJMcaiQv381/V7KDDBUOaCvpPMbPUkKsn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb50ZXN%2FdJMcaiQv381%2FV7KDDBUOaCvpPMbPUkKsn1%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;1412&quot; height=&quot;249&quot; data-origin-width=&quot;1412&quot; data-origin-height=&quot;249&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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-origin-width=&quot;1581&quot; data-origin-height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SUtIh/dJMcacW5BFj/E1m6OV2IqsdD9IewBLvHG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SUtIh/dJMcacW5BFj/E1m6OV2IqsdD9IewBLvHG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SUtIh/dJMcacW5BFj/E1m6OV2IqsdD9IewBLvHG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSUtIh%2FdJMcacW5BFj%2FE1m6OV2IqsdD9IewBLvHG1%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;1581&quot; height=&quot;370&quot; data-origin-width=&quot;1581&quot; data-origin-height=&quot;370&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 이제 다시 처음으로 돌아와서,&amp;nbsp; 아래와 같은 경우는 어떻게 띄워야 할까?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1277&quot; data-origin-height=&quot;369&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Lt6tT/dJMcaf7lBW7/cxSnJhZZAkUFQQnaWRfjg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Lt6tT/dJMcaf7lBW7/cxSnJhZZAkUFQQnaWRfjg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Lt6tT/dJMcaf7lBW7/cxSnJhZZAkUFQQnaWRfjg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLt6tT%2FdJMcaf7lBW7%2FcxSnJhZZAkUFQQnaWRfjg1%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;1277&quot; height=&quot;369&quot; data-origin-width=&quot;1277&quot; data-origin-height=&quot;369&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 번 계산에 한칸씩 띄운다고 가정했을 때, 한칸 띄웠을 때 가장 소방차와 호스간의 간격의 합이 크게 줄어드는 부분을 띄우면 된다.&amp;nbsp; 그 이유를 알아보자. 위와 같은 상황에서, 4~5번 사이를 띄운다고 치자. 그럼 아래와 같이 된다.&amp;nbsp; 일단 아래는 간격총합이 줄어들긴 한다. (소방차5번, 호스7 번이 최적의 짝인데, 7번에 가까워졌기 때문)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1573&quot; data-origin-height=&quot;390&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EmrSx/dJMcaarsTYM/EPkkJllynbr5UeCCT1Ylg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EmrSx/dJMcaarsTYM/EPkkJllynbr5UeCCT1Ylg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EmrSx/dJMcaarsTYM/EPkkJllynbr5UeCCT1Ylg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEmrSx%2FdJMcaarsTYM%2FEPkkJllynbr5UeCCT1Ylg1%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;1573&quot; height=&quot;390&quot; data-origin-width=&quot;1573&quot; data-origin-height=&quot;390&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3~4번 사이를 띄우면 아래와 같이 된다. 이때는 소방차4, 소방차5 의 호스의 간격총합이 줄어든다.&amp;nbsp;&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;1783&quot; data-origin-height=&quot;366&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nqmcW/dJMcafM5Z5s/auq02iEp7GeAiJmipM33Tk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nqmcW/dJMcafM5Z5s/auq02iEp7GeAiJmipM33Tk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nqmcW/dJMcafM5Z5s/auq02iEp7GeAiJmipM33Tk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnqmcW%2FdJMcafM5Z5s%2Fauq02iEp7GeAiJmipM33Tk%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;1783&quot; height=&quot;366&quot; data-origin-width=&quot;1783&quot; data-origin-height=&quot;366&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;반면 0~1번, (소방차1번의 왼쪽)을 띄우면 아래와 같이 된다.이 때 소방차1번의 최적 호스는 1번이였는데 2번으로 갔으므로 간격총합은 증가한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1772&quot; data-origin-height=&quot;319&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CkciQ/dJMcadhpdPp/aQBcyArXiMWttCNXBqiod1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CkciQ/dJMcadhpdPp/aQBcyArXiMWttCNXBqiod1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CkciQ/dJMcadhpdPp/aQBcyArXiMWttCNXBqiod1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCkciQ%2FdJMcadhpdPp%2FaQBcyArXiMWttCNXBqiod1%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;1772&quot; height=&quot;319&quot; data-origin-width=&quot;1772&quot; data-origin-height=&quot;319&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; &amp;nbsp;직관적으로 보면 당연히 그리디 하게 띄우는게 타당해 보이지만, 의심할 만한 포인트가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;어느 간격을 띄우냐에 따른 간격총합 변화량이 아래와 같다고 생각해보자.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;우선 4~5번, 3~4번까지는 간격총합이 점차 감소한다.&amp;nbsp; 그러나, 2~3번 사이에선 다시 증가한다. 즉 3번 소방차의 호스간격이 증가한 것이다. 다시 1~2번 사이를 띄우면 크게 총합이 감소한다. 즉 2번 소방차의 간격이 크게 감소한 것이다.&amp;nbsp; 0~1번 사이를 띄우면 다시 증가하므로, 1번 소방차의&amp;nbsp; 간격이 증가한 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp;그럼 이제 직관적으로 3~4번을 띄울지, 1~2번을 띄울지 고민이 될 것이다. 3~4번을 띄우는 이유는 3,4,5번소방차를 띄우는 과정에서 어떤 소방차의 호스 간격도 증가하지 않기 때문이고, 1~2번을 띄우는 이유는 간격총합이 가장 크게 감소하기 때문이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;즉 1~2번 을 띄우는데 주저하게 되는 이유는 바로 3번 소방차의 간격이 증가하기 때문이다. 그러나 걱정하지 않아도 된다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;1~2번을 띄우면 2,3,4,5번 소방차가, 3~4번을 띄우면 4,5번 소방차가 띄워지게 된다.&amp;nbsp; &amp;nbsp; 즉 4,5번 소방차는 공통으로 띄워진다. 그럼 차이는 2,3번 소방차가 띄워지냐 마냐인데, 만약 3번소방차 간격이 증가하는게 무서워 띄우지 않게 된다면, 2번소방차는 평생 못띄우게 된다.&amp;nbsp; 1~2번을 띄우고 3번은 이제 더이상 안건들이면 되므로,&amp;nbsp; 특정 소방차의 간격이 증가하는 것은 무시하고 전체 간격총합이 가장 크게 감소하는 사이를 띄우면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;1105&quot; data-origin-height=&quot;849&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rNUFP/dJMcafTQc4F/c3EWuVG1BS9ZVd8NGLheBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rNUFP/dJMcafTQc4F/c3EWuVG1BS9ZVd8NGLheBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rNUFP/dJMcafTQc4F/c3EWuVG1BS9ZVd8NGLheBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrNUFP%2FdJMcafTQc4F%2Fc3EWuVG1BS9ZVd8NGLheBk%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;1105&quot; height=&quot;849&quot; data-origin-width=&quot;1105&quot; data-origin-height=&quot;849&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;또한 한가지 매우 중요한 점은 간격총합이 가장 크게 줄어드는 소방차 사이를 띄웠으면 이제 더이상은 그 지점보다 왼쪽의 구간은 띄워선 안된다는 것이다.&amp;nbsp;&lt;/b&gt; 위에서는 1~2번 사이의 간격이 가장 크게 줄었다.&amp;nbsp; 그래서 1~2번을 띄웠다고 치자. 그 다음 띄울때 만약 1~2번 보다 왼쪽의 지점을 띄우게 된다면, 간격은 늘어나게 될 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1622&quot; data-origin-height=&quot;268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tLlcG/dJMcagSKppR/U4MX0MPMAWiZmKp1MJH9E0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tLlcG/dJMcagSKppR/U4MX0MPMAWiZmKp1MJH9E0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tLlcG/dJMcagSKppR/U4MX0MPMAWiZmKp1MJH9E0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtLlcG%2FdJMcagSKppR%2FU4MX0MPMAWiZmKp1MJH9E0%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;1622&quot; height=&quot;268&quot; data-origin-width=&quot;1622&quot; data-origin-height=&quot;268&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 위와 같은 상황이고 3~4번을 띄우는게 최적이라고 치자. 그럼 여기서 2번 3번의 호스를 오른쪽으로 옮기면 간격총합이 증가한다는 것을 알 수 있다.&amp;nbsp; 따라서 다음 번 띄울 때는 3~4번 보다 왼쪽의 지점 ( 0~1 OR 1~2 OR 2~3) 을 띄우면 안된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그럼 이제 우리는 소방차를 가장 왼쪽의 호스로 몰아 연결한 뒤, 어느 지점을 띄워야 할지 찾은 뒤 , 다음 번에는 그 지점보다 오른쪽부터 어디를 띄울지 탐색하면 된다.&amp;nbsp;&amp;nbsp;&lt;/b&gt;그러나 이 경우는 최악의 경우&amp;nbsp; N + N - 1 + N - 2 + ... 1 이 되므로&amp;nbsp; O(N^2) 이 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 어떠헥 이 문제를 해결할 수 있을 까? 아래와 같은 경우가 있다고 치자.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2951&quot; data-origin-height=&quot;1132&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eonjlF/dJMcafGjiAz/SvARy0d3jz9kIyT2GjDvvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eonjlF/dJMcafGjiAz/SvARy0d3jz9kIyT2GjDvvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eonjlF/dJMcafGjiAz/SvARy0d3jz9kIyT2GjDvvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeonjlF%2FdJMcafGjiAz%2FSvARy0d3jz9kIyT2GjDvvK%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;2951&quot; height=&quot;1132&quot; data-origin-width=&quot;2951&quot; data-origin-height=&quot;1132&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우 간격총합이 감소하는 구간과 증가하는 구간이 있다. 이 구간을 따로 저장한다.&amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 경우&amp;nbsp; &amp;nbsp; &amp;nbsp;1~3 구간,&amp;nbsp; 5 ~8 구간,&amp;nbsp; 11 ~13 구간 이 감소하는 구간, 나머지 구간은 증가하는 구간이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리는 여기서 감소하는 구간의 가장 오른쪽 구간만 띄워보면 된다는 것을 알 수 있다.&amp;nbsp; &amp;nbsp; 1~3구간에서는&amp;nbsp; 3번지점이 , 5~8 에서는 8번 지점이 가장 간격총합이 크게 감소하기 때문이다.&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 우리가 원래 지점 별로 간격총합을 검사할 때는 22번을 검사 (모든 점의 갯수) 해야 하지만,&amp;nbsp; 이렇게 감소하는 구간의 가장 오른쪽만 조사한다면 3번만 검사하면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 한 간격을 띄울 때 간격 총합의 변화량은 어떻게 계산할까? 다음과 같이 한칸씩 오른쪽으로 띄울 때, 현재 전체 총합에서 가장 호스의 왼쪽, (b1) 과 오른쪽 (b4)만 고려하면 되므로, 변화량 계산의 시간복잡도는 O(1)이 될 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kI5bf/dJMcahqALT5/YBIPsmYOmgQglKzn58Vbsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kI5bf/dJMcahqALT5/YBIPsmYOmgQglKzn58Vbsk/img.png&quot; data-origin-width=&quot;967&quot; data-origin-height=&quot;480&quot; data-is-animation=&quot;false&quot; style=&quot;width: 54.2904%; margin-right: 10px;&quot; data-widthpercent=&quot;54.93&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kI5bf/dJMcahqALT5/YBIPsmYOmgQglKzn58Vbsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkI5bf%2FdJMcahqALT5%2FYBIPsmYOmgQglKzn58Vbsk%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;967&quot; height=&quot;480&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xkf4E/dJMcaadVUhi/M6s4TvjdSw6QS4ip22Oj20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xkf4E/dJMcaadVUhi/M6s4TvjdSw6QS4ip22Oj20/img.png&quot; data-origin-width=&quot;848&quot; data-origin-height=&quot;513&quot; data-is-animation=&quot;false&quot; style=&quot;width: 44.5468%;&quot; data-widthpercent=&quot;45.07&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xkf4E/dJMcaadVUhi/M6s4TvjdSw6QS4ip22Oj20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxkf4E%2FdJMcaadVUhi%2FM6s4TvjdSw6QS4ip22Oj20%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;848&quot; height=&quot;513&quot;/&gt;&lt;/span&gt;&lt;/div&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;자, 그러나 여전히 감소 구간의 오른쪽을 검사해도, 최악의 경우에는 한번 검사할 때마다 O(N)번씩 검사해야 할 수도 있다,.&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-origin-width=&quot;2038&quot; data-origin-height=&quot;564&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dBIsLX/dJMcai3180F/YiTDNWeOgKIfx8MnykyD8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dBIsLX/dJMcai3180F/YiTDNWeOgKIfx8MnykyD8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dBIsLX/dJMcai3180F/YiTDNWeOgKIfx8MnykyD8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdBIsLX%2FdJMcai3180F%2FYiTDNWeOgKIfx8MnykyD8k%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;2038&quot; height=&quot;564&quot; data-origin-width=&quot;2038&quot; data-origin-height=&quot;564&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 그림은 소방차와 연결된 호스를 한칸 오른쪽으로 옮길 때 의 양상을 나타낸 것이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우부터 좌로 훑어보면 맨오른쪽 소방차는 호스를 오른쪽으로 이동하면 간격 총합이 증가한다. (증가구간)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두번째 소방차는 호스를 이동하면 감소구간에서 증가구간으로 스위칭 하는 과정이므로, 간격총합이 증가할지 감소할지 모른다. 계산해봐야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3~4번째 소방차는 오른쪽으로 이동시 확실히 간격총합이 감소한다.&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;또한 여기서 시간복잡도를 O(N^2)이 아니라는 것을 증명하기 위해 매우 중요한 포인트는, &lt;b&gt;감소구간의 맨 오른쪽 부분이 다음 간격시에는 무조건 스위칭 구간이 된다는 것이다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dobOeT/dJMcaiJKqFJ/LHrSKgoMZufklGrJcxaoeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dobOeT/dJMcaiJKqFJ/LHrSKgoMZufklGrJcxaoeK/img.png&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;328&quot; data-is-animation=&quot;false&quot; style=&quot;width: 37.5305%; margin-right: 10px;&quot; data-widthpercent=&quot;37.97&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dobOeT/dJMcaiJKqFJ/LHrSKgoMZufklGrJcxaoeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdobOeT%2FdJMcaiJKqFJ%2FLHrSKgoMZufklGrJcxaoeK%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;697&quot; height=&quot;328&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvyR7y/dJMcaduSJPu/cL5sHPmirPlxlFYwu9zbU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvyR7y/dJMcaduSJPu/cL5sHPmirPlxlFYwu9zbU0/img.png&quot; data-origin-width=&quot;965&quot; data-origin-height=&quot;278&quot; data-is-animation=&quot;false&quot; style=&quot;width: 61.3067%;&quot; data-widthpercent=&quot;62.03&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvyR7y/dJMcaduSJPu/cL5sHPmirPlxlFYwu9zbU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvyR7y%2FdJMcaduSJPu%2FcL5sHPmirPlxlFYwu9zbU0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;965&quot; height=&quot;278&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 왼쪽은 한칸 띄우기 전이고, 한칸 띄운뒤는 오른쪽과 같이 된다. 여기서 감소구간의 맨오른쪽은 스위칭 구간이 된것을 알 수 있다. 이유는 단순하다. 띄우기 전 구간에서 3번째 소방차가 3번째호스에서 스위칭 구간이였는데, 그 소방차보다 왼쪽에 있는 2번소방차가&amp;nbsp; 띄운 후 3번 호스와 매칭되면서 반드시 스위칭 구간이 된다. 핵심은 감소구간의 오른쪽 구간은 스위칭 구간이고, 감소구간의 맨 오른쪽 지점은 현재 스위칭 지점보다 왼쪽에 있기 때문에 반드시 다음에 스위칭 구간이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;그럼 다음과 같은 사실을 알 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 한칸을 띄울때의 간격총합이 최소로 감소하는 지점은 각&lt;b&gt; 감소구간의 맨왼쪽 지점으로 좁혀진다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2.&lt;/b&gt;감소구간의 맨&lt;b&gt; 오른쪽 지점은 다음 번에 반드시 스위칭 구간이 된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 N이 10만 개고, 감소구간이 100개, 각각의 감소구간은 1000개의 소방차로 이루어져있다고 생각하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 시행에서 어디를 띄울지는 각 감소구간의 맨 왼쪽, 즉 100개만 고려하면 된다. 그리고 그 시행이 끝날 때마다, 각 감소구간의 맨오른쪽은 무조건 스위칭 구간이 된다. 즉 , 각 감소구간의 소방차수가 한개씩 감소한다. 즉 500번 시행 한다면, 각 감소구간은 500개의 소방차로 이루어져있을 것이다. 1000번 시행시는 감소구간이 없어져 있을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 위의 두가지 특성으로, O(N)으로 구할 수 있다.&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;투포인터로 n번째 소방차가 m번째 호스와 매칭시 스위칭 구간임을 알아내면, n + 1번 소방차는 최소 m번째 이상의 호스와 매칭시 스위칭 구간이므로 m번째부터 고려한다.&amp;nbsp; &amp;nbsp; 또한 n번째 소방차가 m번째 호스와 매칭시&amp;nbsp; m-n만큼 간격을 띄웠을 때 매칭됨을 유의한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요약:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 각 소방차의 사이 지점을 탐색, 그 지점들을 집합으로 하는 감소구간, 증가구간, 스위칭구간(집합갯수 1개) 를 구분한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 각 소방차마다 몇칸을 띄웠을 때(호스를 오른쪽으로 몇칸 이동했을 때) 스위칭 구간이 되는지 알아낸다. O(N)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.각 감소구간의 맨 왼쪽을 띄워보면서, 어느 지점을 뜨웟을 때 간격총합이 가장 크게 감소하는지 찾는다. 이제 다음 띄울 때는 그 지점부터 고려한다.(그 지점의 왼쪽부분은 더이상 고려대상 X) . 그 후 감소한 간격총합을 토대로 정답을 업데이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 이제 그 지점을 띄웠을 때, 그 지점부터 맨 오른쪽 까지 구간중 어느 지점이 스위칭 구간이 되는지는 2번에서 알아냈으므로, 그걸 토대로 감소구간을 새로 업데이트. (이때 최소 감소구간 갯수 이상의 소방차가 감소구간에서 스위칭 구간으로 전환)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5.2~4번 구간을 반복한다. 만약어떤 지점에서도 간격총합이 감소하지 않을 경우, 사이클을 멈춘다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/baekjoon(boj)</category>
      <author>끄응끄응</author>
      <guid isPermaLink="true">https://jihyung1997.tistory.com/63</guid>
      <comments>https://jihyung1997.tistory.com/63#entry63comment</comments>
      <pubDate>Sat, 18 Apr 2026 15:24:18 +0900</pubDate>
    </item>
    <item>
      <title>[diamond5][ 풀이, 분류 미확인] boj18444 우체국3</title>
      <link>https://jihyung1997.tistory.com/62</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/18444&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/18444&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2183&quot; data-origin-height=&quot;985&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdPECS/dJMcaipeUDD/pkOSEjiPbcm0KiVjl8e2D1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdPECS/dJMcaipeUDD/pkOSEjiPbcm0KiVjl8e2D1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdPECS/dJMcaipeUDD/pkOSEjiPbcm0KiVjl8e2D1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdPECS%2FdJMcaipeUDD%2FpkOSEjiPbcm0KiVjl8e2D1%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;2183&quot; height=&quot;985&quot; data-origin-width=&quot;2183&quot; data-origin-height=&quot;985&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;+ 구현도 상당히 복잡했고,, 제일 큰 이슈는 java로는 시간제한을 지킬 수 없는 문제여서 수없는 삽질을 하였다...&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cq3162/dJMcadOVLmq/UC6GIrviEOn3CqeWFqd1K0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cq3162/dJMcadOVLmq/UC6GIrviEOn3CqeWFqd1K0/img.png&quot; data-origin-width=&quot;1685&quot; data-origin-height=&quot;1203&quot; data-is-animation=&quot;false&quot; style=&quot;width: 47.3265%; margin-right: 10px;&quot; data-widthpercent=&quot;47.88&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cq3162/dJMcadOVLmq/UC6GIrviEOn3CqeWFqd1K0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcq3162%2FdJMcadOVLmq%2FUC6GIrviEOn3CqeWFqd1K0%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;1685&quot; height=&quot;1203&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SblUe/dJMcafTAig7/YITpNkP2e3Yzb4rNykR6ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SblUe/dJMcafTAig7/YITpNkP2e3Yzb4rNykR6ok/img.png&quot; data-origin-width=&quot;1680&quot; data-origin-height=&quot;1102&quot; data-is-animation=&quot;false&quot; style=&quot;width: 51.5107%;&quot; data-widthpercent=&quot;52.12&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SblUe/dJMcafTAig7/YITpNkP2e3Yzb4rNykR6ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSblUe%2FdJMcafTAig7%2FYITpNkP2e3Yzb4rNykR6ok%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;1680&quot; height=&quot;1102&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Wow&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 생각한 아이디어는 누적합을 이용한 dp 였다.&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;1613&quot; data-origin-height=&quot;1143&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I2AoK/dJMcacbtJvo/8914yKHU78ADC0rC2iAXm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I2AoK/dJMcacbtJvo/8914yKHU78ADC0rC2iAXm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I2AoK/dJMcacbtJvo/8914yKHU78ADC0rC2iAXm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI2AoK%2FdJMcacbtJvo%2F8914yKHU78ADC0rC2iAXm0%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;1613&quot; height=&quot;1143&quot; data-origin-width=&quot;1613&quot; data-origin-height=&quot;1143&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 dp는 시작지점,&amp;nbsp; 끝지점, 그 사이의 우체국 갯수 (시작 , 끝 점은 우체국 반드시 포함) 을&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;state로 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;dp[2][6][3] =&amp;nbsp; Math.min(dp[2][5][2], dp[2][4][2], dp[2][3][2])&amp;nbsp; 의 점화식을 가질 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;end 지점이 e번이고 시작지점이 s번,&amp;nbsp; 우체국 갯수가 p개인 dp를 구하고자 할 때&amp;nbsp; , n-1, n- 2... 가 end지점, 우체국갯수가 p - 1 개, start지점은 s번인 dp들을 참고해야 할 것이다.&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dp[s][e][p] 를 구할 때&amp;nbsp; dp[s][e - 1][p],&amp;nbsp; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;dp[s][e - 2][p]... dp[s][e -&amp;nbsp; p&amp;nbsp; + 1][p]...&amp;nbsp; 만큼 참고해야 하므로 최대, e번 계산해야하고, 최대 N번이 된다.&amp;nbsp; 이 과정을 N(s에 대해) * N (e에 대해)* P(우체국갯수)에 반복하므로,&amp;nbsp; 시간복잡도는 거의 O(N^4)이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떻게 하면 이걸 줄일 수 있을 까...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;한참을 고민하다가, 희소배열의 개념이 떠올랐다. 사실 문제를 보자마자 생김새가 예전에 풀었던 감시카메라 문제와 유사해서 희소배열도 잠깐 떠올린 것 같지만 , dp에 꽂혀서 금세 잊혀졌었다. 그러다가 dp[s][e][p] 에 대해,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dp[s][e][p] 를 dp[s][m][p1] 와 dp[m][e][p2] (p1 + p2 = p ) 로 나타낼 수 있지 않을 까 생각하던중, 거듭제곱을 활용한 희소배열이 생각이 났다. 희소배열을 사용하면서 분할 정복도 사용이 될 것이다.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선, 희소배열을 생각하기 전 분할정복은 다음과 같다.&amp;nbsp; &amp;nbsp; dp[1][10][5] 를 구성할 수 있는 요소로는 dp[1][5][3], dp[5][10][3] 이 있을 것이다.&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;2152&quot; data-origin-height=&quot;525&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccgN5o/dJMcab4HGTQ/VI0zIzAXmVzdHrrdUiXSI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccgN5o/dJMcab4HGTQ/VI0zIzAXmVzdHrrdUiXSI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccgN5o/dJMcab4HGTQ/VI0zIzAXmVzdHrrdUiXSI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccgN5o%2FdJMcab4HGTQ%2FVI0zIzAXmVzdHrrdUiXSI0%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;2152&quot; height=&quot;525&quot; data-origin-width=&quot;2152&quot; data-origin-height=&quot;525&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 아래와 같이 dp[1][3][3], dp[3][10][3] 과 같은 경우도 있을 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2203&quot; data-origin-height=&quot;568&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IMXAs/dJMcabcxXIA/jBTRicVT216iHMoAxYDDuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IMXAs/dJMcabcxXIA/jBTRicVT216iHMoAxYDDuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IMXAs/dJMcabcxXIA/jBTRicVT216iHMoAxYDDuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIMXAs%2FdJMcabcxXIA%2FjBTRicVT216iHMoAxYDDuk%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;2203&quot; height=&quot;568&quot; data-origin-width=&quot;2203&quot; data-origin-height=&quot;568&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;dp[1][10][5] = Math.min(dp[1][5][3] + dp[5][10][3], dp[1][6][3] + dp[6][10][3],&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dp[1][7][3] + dp[7][10][3]&amp;nbsp; ....&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dp[1][8][10]&amp;nbsp; + dp[8][10][3]) 으로 생각 할 수 있을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 여기서 의문이 들 수도 있다. 왜 dp[1][4][2] + dp[4][10][4]와 같은 경우는 생각하지 않는가?&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 말이다.&amp;nbsp; &amp;nbsp;결국&amp;nbsp; &amp;nbsp;dp[1][4][2] + dp[4][10][4]&amp;nbsp; 는 범위를 조정하면 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;dp[1][5][3] + dp[5][10][3]&lt;span&gt; 로도 나타낼 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;따라서 우체국 수는 3으로 고정시킬 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2153&quot; data-origin-height=&quot;436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wFH06/dJMcaf0jQ7P/hXQt6PW0kU3QFH65fsVXCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wFH06/dJMcaf0jQ7P/hXQt6PW0kU3QFH65fsVXCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wFH06/dJMcaf0jQ7P/hXQt6PW0kU3QFH65fsVXCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwFH06%2FdJMcaf0jQ7P%2FhXQt6PW0kU3QFH65fsVXCk%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;2153&quot; height=&quot;436&quot; data-origin-width=&quot;2153&quot; data-origin-height=&quot;436&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2152&quot; data-origin-height=&quot;525&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccgN5o/dJMcab4HGTQ/VI0zIzAXmVzdHrrdUiXSI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccgN5o/dJMcab4HGTQ/VI0zIzAXmVzdHrrdUiXSI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccgN5o/dJMcab4HGTQ/VI0zIzAXmVzdHrrdUiXSI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccgN5o%2FdJMcab4HGTQ%2FVI0zIzAXmVzdHrrdUiXSI0%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;2152&quot; height=&quot;525&quot; data-origin-width=&quot;2152&quot; data-origin-height=&quot;525&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;분할정복은 대충 이렇게 하는 거라는 걸 알았지만, 위와같이 dp[s][e][cnt] = dp[s][m][cnt1] + dp[m][e][cnt2]&amp;nbsp; 의 형태로 구하려한다면, 여기서도 어김없이 O(N ^4)의 시간복잡도이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 희소배열의 아이디어가 쓰인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 dp[s][e][5] 은 dp[s][m][3] + dp[m][e][3] 에서 m을 조정하며 얻은 최솟값이라는 걸 알았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면, dp[s][e][9] 는?&amp;nbsp; dp[s][m][5] + dp[m][e][5] 를 조정하며 얻은 최솟값이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마찬가지로 dp[s][e][17] 은&amp;nbsp; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;dp[s][m][9] + dp[m][e][9]&lt;span&gt;에서 계산할수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;이런식으로 2 * p - 1&amp;nbsp; 씩 증가시키며 계산하면,&amp;nbsp; 구간안의 우체국 수가 2 , 3 , 5 , 9 , 17, 33 , 65 , 129 ... 일때의 dp을 구할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;이때 모든 구간 s, e에 대해 구한다고 하면,&amp;nbsp; &amp;nbsp;s, e, m 을 조정하면서 구하므로,&amp;nbsp; 이때 O(N^3), 이걸 2,3,5...129,257 까지 구한다 하면 O( N^3 * log2(257)) 이 된다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;왜 이렇게 구했을까?&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp; dp[s][e][111] 을 구해야 한다고 생각해보자.&amp;nbsp; 우선 위에서 구한 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;2 , 3 , 5 , 9 , 17, 33 , 65 , 129 ...&lt;span&gt;&amp;nbsp; 중&amp;nbsp; 65와 33 을 결합한다고 생각해보자.&amp;nbsp; &amp;nbsp;dp[s][e][97] 은 dp[s][m][65] + dp[m][e][33] 에서 s,e,m을 조정하며 모든 구간에 대한 우체국 수가 97일 때를 구할 수 있다. 97까지 구했으면 111까지 14개의 우체국이 남았다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;여기서 dp[s][e][97 + 9 - 1] 은 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;dp[s][m][97] + dp[m][e][9]&lt;span&gt;&amp;nbsp; 로 구할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;dp[s][e][105 + 5 - 1]&amp;nbsp; 은 dp[s][m][105] + dp[m][e][5]&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;dp[s][e][109 + 3 - 1]&amp;nbsp; 은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;dp[s][m][109] + dp[m][e][3]&amp;nbsp; &amp;nbsp;이런식으로 구할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;65&lt;/b&gt; +&lt;b&gt; 33&lt;/b&gt; -&amp;gt; 97&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;97 + &lt;b&gt;9&lt;/b&gt; -&amp;gt; 105&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;105 + &lt;b&gt;5&lt;/b&gt; -&amp;gt; 109&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;109 + &lt;b&gt;3&lt;/b&gt; -&amp;gt; 111&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 여기서 111까지 구하기 위해선&amp;nbsp; 65, 33 , 9 , 5 , 3&amp;nbsp; 만 필요했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 우체국수를 2,3,5,9... 257 까지 구해놓으면 여기서 적절하게 조합해 모든 수를 만들 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각의 우체국수에 대해 O(N^3)의 시간복잡도이므로, 결국 O(N^3 * (log2(257))로 구할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 모든 dp[s][e][p]에서 p를 1,2,3,4,... 우체국 최대갯수 까지 구하는게 아니라, 2, 3,5,9, ... 식으로 띄엄띄엄 구해서, 이 수들을 조합하는 식으로 구할 수 있는 것이다.&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;최대 우체국수가 111개 였으면, 위와 같이 모든 s,e에 대해 dp[s][e][111]을 구했다. 그런데 마을은 원형을 이루고 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;880&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6VwK1/dJMcagkDan1/jm6UhDLrDAntMBC1QuZHd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6VwK1/dJMcagkDan1/jm6UhDLrDAntMBC1QuZHd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6VwK1/dJMcagkDan1/jm6UhDLrDAntMBC1QuZHd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6VwK1%2FdJMcagkDan1%2Fjm6UhDLrDAntMBC1QuZHd1%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;583&quot; height=&quot;539&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;880&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 dp[s][e][111]에 대해 구했으면, 빨간 부분은 이제 우체국이 들어설 수 없는 구역이다. 이 구역에는 양끝 s, e 에만 우체국이 있으므로, 누적합을 이용해 빨간색 구간 마을의 우체국 거리 합을 구할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;dp[s][e][111] + 빨간구간 거리합&lt;/b&gt; 까지 합하면, 이제 원형의 모든 마을에 대해 우체국까지 최소거리를 구할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 s,e에 대해 이뤄지므로 추가적으로 O(N^2 ) 이 이뤄지게 된다. (누적합을 통한 계산은 거의 O(1)이다).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역추적은 적당히 재귀 dfs를 이용해 돌리면 된다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 아이디어를 내보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아이디어를 떠올린 것 까지는 분위기가 좋았다. 그러나 구현이 매우 까다로웠고, 구현 성공후, java로는 도저히 안돌려지길래 gpt한테 그대로 c++로 옮겨달라고 해서 해결하였다.&amp;nbsp; java로 안되서 얼마나 오래 삽질했는지 정신이 아찔해진다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2034&quot; data-origin-height=&quot;1676&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RcCbV/dJMcacJk7hE/kxnJf65Fry5rkpikfaeSV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RcCbV/dJMcacJk7hE/kxnJf65Fry5rkpikfaeSV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RcCbV/dJMcacJk7hE/kxnJf65Fry5rkpikfaeSV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRcCbV%2FdJMcacJk7hE%2FkxnJf65Fry5rkpikfaeSV0%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;2034&quot; height=&quot;1676&quot; data-origin-width=&quot;2034&quot; data-origin-height=&quot;1676&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다고 합니다. 사실 c++로 돌려서 채점을 돌리다가 75프로에서 WA가 나서, 디버깅까지 하면 내 멘탈이 못버티겠다 하고, 구글링을 해서 반례를 찾았는데, 이 반례는 알고보니 java에서 한참 삽질하면서 이미 고쳤지만, c++로 옮기면서 미쳐 놓친 부분이였다. 마을이 같은 곳에 있을 때 마을의 위치대신 인덱스로 역추적을 하게 만드는 부분이였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;package&amp;nbsp;boj18444; &lt;br /&gt;&lt;br /&gt;import&amp;nbsp;java.io.BufferedReader; &lt;br /&gt;import&amp;nbsp;java.io.IOException; &lt;br /&gt;import&amp;nbsp;java.io.InputStreamReader; &lt;br /&gt;import&amp;nbsp;java.util.*; &lt;br /&gt;public&amp;nbsp;class&amp;nbsp;Main2&amp;nbsp;{ &lt;br /&gt;static&amp;nbsp;int&amp;nbsp;N; &lt;br /&gt;static&amp;nbsp;int&amp;nbsp;posts; &lt;br /&gt;static&amp;nbsp;long&amp;nbsp;L; &lt;br /&gt;&lt;br /&gt;static&amp;nbsp;long[]&amp;nbsp;P; &lt;br /&gt;static&amp;nbsp;long&amp;nbsp;[]&amp;nbsp;sum; &lt;br /&gt;static&amp;nbsp;long&amp;nbsp;[][][][]&amp;nbsp;trace;&amp;nbsp;//&amp;nbsp;s,&amp;nbsp;e&amp;nbsp;,&amp;nbsp;cnt&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mid,&amp;nbsp;cnt1&amp;nbsp;,&amp;nbsp;cnt2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;static&amp;nbsp;long&amp;nbsp;[][][]&amp;nbsp;dp;&amp;nbsp;//&amp;nbsp;s&amp;nbsp;,&amp;nbsp;e&amp;nbsp;,&amp;nbsp;cnt &lt;br /&gt;static&amp;nbsp;List&amp;lt;Long&amp;gt;&amp;nbsp;ansL&amp;nbsp;=&amp;nbsp;new&amp;nbsp;ArrayList&amp;lt;Long&amp;gt;(); &lt;br /&gt;&amp;nbsp; public&amp;nbsp;static&amp;nbsp;void&amp;nbsp;main(String[]&amp;nbsp;args)&amp;nbsp;throws&amp;nbsp;IOException{ &lt;br /&gt;BufferedReader&amp;nbsp;br&amp;nbsp;=&amp;nbsp;new&amp;nbsp;BufferedReader(new&amp;nbsp;InputStreamReader(System.in)); &lt;br /&gt;StringTokenizer&amp;nbsp;st&amp;nbsp;=&amp;nbsp;new&amp;nbsp;StringTokenizer(br.readLine()); &lt;br /&gt;N&amp;nbsp;=&amp;nbsp;Integer.parseInt(st.nextToken());posts&amp;nbsp;=&amp;nbsp;Integer.parseInt(st.nextToken());L&amp;nbsp;=&amp;nbsp;Long.parseLong(st.nextToken()); &lt;br /&gt;P&amp;nbsp;=&amp;nbsp;new&amp;nbsp;long&amp;nbsp;[N&amp;nbsp;+&amp;nbsp;1];&amp;nbsp;sum&amp;nbsp;=&amp;nbsp;new&amp;nbsp;long[N&amp;nbsp;+&amp;nbsp;1];&amp;nbsp;trace&amp;nbsp;=&amp;nbsp;new&amp;nbsp;long[N&amp;nbsp;+&amp;nbsp;1][N&amp;nbsp;+&amp;nbsp;1][N&amp;nbsp;+&amp;nbsp;1][3];&amp;nbsp;dp&amp;nbsp;=&amp;nbsp;new&amp;nbsp;long[N&amp;nbsp;+&amp;nbsp;1][N&amp;nbsp;+&amp;nbsp;1][N&amp;nbsp;+&amp;nbsp;1]; &lt;br /&gt;st&amp;nbsp;=&amp;nbsp;new&amp;nbsp;StringTokenizer(br.readLine()); &lt;br /&gt;for(int&amp;nbsp;i&amp;nbsp;=&amp;nbsp;1&amp;nbsp;;&amp;nbsp;i&amp;nbsp;&amp;lt;=&amp;nbsp;N;&amp;nbsp;i++)&amp;nbsp;{ &lt;br /&gt;P[i]&amp;nbsp;=&amp;nbsp;Long.parseLong(st.nextToken()); &lt;br /&gt;sum[i]&amp;nbsp;=&amp;nbsp;P[i]&amp;nbsp;+&amp;nbsp;sum&amp;nbsp;[i&amp;nbsp;-&amp;nbsp;1]; &lt;br /&gt;} &lt;br /&gt;if(posts&amp;nbsp;==&amp;nbsp;1)&amp;nbsp;{ &lt;br /&gt;long&amp;nbsp;ans1&amp;nbsp;=&amp;nbsp;Long.MAX_VALUE;&amp;nbsp;int&amp;nbsp;ansi&amp;nbsp;=&amp;nbsp;0; &lt;br /&gt;&amp;nbsp; for(int&amp;nbsp;n&amp;nbsp;=&amp;nbsp;1&amp;nbsp;;&amp;nbsp;n&amp;nbsp;&amp;lt;=&amp;nbsp;N&amp;nbsp;;&amp;nbsp;n++)&amp;nbsp;{ &lt;br /&gt;long&amp;nbsp;res&amp;nbsp;=&amp;nbsp;(P[n]&amp;nbsp;+&amp;nbsp;L&amp;nbsp;/&amp;nbsp;2); &lt;br /&gt;&amp;nbsp; long&amp;nbsp;mid&amp;nbsp;=&amp;nbsp;res&amp;nbsp;&amp;gt;=&amp;nbsp;L&amp;nbsp;?&amp;nbsp;&amp;nbsp;res&amp;nbsp;-&amp;nbsp;L&amp;nbsp;:&amp;nbsp;res; &lt;br /&gt;&amp;nbsp; int&amp;nbsp;mi&amp;nbsp;=&amp;nbsp;0&amp;nbsp;;&amp;nbsp;int&amp;nbsp;l&amp;nbsp;=&amp;nbsp;1&amp;nbsp;;&amp;nbsp;int&amp;nbsp;r&amp;nbsp;=&amp;nbsp;N; &lt;br /&gt;&amp;nbsp; &amp;nbsp; while(l&amp;nbsp;&amp;lt;=&amp;nbsp;r)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp; &amp;nbsp; int&amp;nbsp;m&amp;nbsp;=&amp;nbsp;(l&amp;nbsp;+&amp;nbsp;r)&amp;nbsp;/&amp;nbsp;2; &lt;br /&gt;&amp;nbsp; &amp;nbsp; if(P[m]&amp;nbsp;&amp;lt;=&amp;nbsp;mid)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp; &amp;nbsp; mi&amp;nbsp;=&amp;nbsp;m; &lt;br /&gt;&amp;nbsp; &amp;nbsp; l&amp;nbsp;=&amp;nbsp;m&amp;nbsp;+&amp;nbsp;1; &lt;br /&gt;&amp;nbsp; &amp;nbsp; }else&amp;nbsp;{ &lt;br /&gt;&amp;nbsp; &amp;nbsp; r&amp;nbsp;=&amp;nbsp;m&amp;nbsp;-&amp;nbsp;1; &lt;br /&gt;&amp;nbsp; &amp;nbsp; } &lt;br /&gt;&amp;nbsp; &amp;nbsp; } &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; long&amp;nbsp;sum1&amp;nbsp;=&amp;nbsp;0&amp;nbsp;;&amp;nbsp;long&amp;nbsp;sum2&amp;nbsp;=&amp;nbsp;0&amp;nbsp;;&amp;nbsp;long&amp;nbsp;sum3&amp;nbsp;=&amp;nbsp;0; &lt;br /&gt;if(n&amp;nbsp;&amp;lt;=&amp;nbsp;mi)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;sum1&amp;nbsp;=&amp;nbsp;sum[mi]&amp;nbsp;-&amp;nbsp;sum[n&amp;nbsp;-&amp;nbsp;1]&amp;nbsp;-&amp;nbsp;(mi&amp;nbsp;-&amp;nbsp;n&amp;nbsp;+&amp;nbsp;1)&amp;nbsp;*&amp;nbsp;P[n]; &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;sum2&amp;nbsp;=&amp;nbsp;&amp;nbsp;&amp;nbsp;(N-&amp;nbsp;(mi&amp;nbsp;+&amp;nbsp;1)&amp;nbsp;+&amp;nbsp;1)&amp;nbsp;*&amp;nbsp;P[n]&amp;nbsp;+&amp;nbsp;(L&amp;nbsp;*&amp;nbsp;(N&amp;nbsp;-&amp;nbsp;mi)&amp;nbsp;-&amp;nbsp;(sum[N]&amp;nbsp;-&amp;nbsp;sum[mi]));&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;mi&amp;nbsp;+&amp;nbsp;1&amp;nbsp;~&amp;nbsp;N &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;sum3&amp;nbsp;=&amp;nbsp;&amp;nbsp;n&amp;nbsp;*&amp;nbsp;P[n]&amp;nbsp;-&amp;nbsp;sum[n];&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;1&amp;nbsp;~&amp;nbsp;n2 &lt;br /&gt;&amp;nbsp; //&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(sum1&amp;nbsp;+&amp;nbsp;&quot;&amp;nbsp;&quot;&amp;nbsp;+&amp;nbsp;sum2&amp;nbsp;+&amp;nbsp;&quot;&amp;nbsp;&quot;&amp;nbsp;+&amp;nbsp;sum3); &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; }else&amp;nbsp;{ &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;sum1&amp;nbsp;=&amp;nbsp;sum[N]&amp;nbsp;-&amp;nbsp;sum[n&amp;nbsp;-&amp;nbsp;1]&amp;nbsp;-&amp;nbsp;(N&amp;nbsp;-&amp;nbsp;n&amp;nbsp;+&amp;nbsp;1)&amp;nbsp;*&amp;nbsp;P[n]; &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;sum2&amp;nbsp;=&amp;nbsp;mi&amp;nbsp;*&amp;nbsp;(L&amp;nbsp;-&amp;nbsp;P[n])&amp;nbsp;+&amp;nbsp;sum[mi]; &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;sum3&amp;nbsp;=&amp;nbsp;(n&amp;nbsp;-&amp;nbsp;(mi&amp;nbsp;+&amp;nbsp;1)&amp;nbsp;+&amp;nbsp;1)&amp;nbsp;*&amp;nbsp;P[n]&amp;nbsp;-&amp;nbsp;(sum[n]&amp;nbsp;-&amp;nbsp;sum[mi]);&amp;nbsp;&amp;nbsp;//&amp;nbsp;mi&amp;nbsp;+&amp;nbsp;1&amp;nbsp;~&amp;nbsp;n2 &lt;br /&gt;&amp;nbsp; } &lt;br /&gt;if(sum1&amp;nbsp;+&amp;nbsp;sum2&amp;nbsp;+&amp;nbsp;sum3&amp;nbsp;&amp;lt;&amp;nbsp;ans1)&amp;nbsp;{ &lt;br /&gt;ans1&amp;nbsp;=&amp;nbsp;&amp;nbsp;sum1&amp;nbsp;+&amp;nbsp;sum2&amp;nbsp;+&amp;nbsp;sum3; &lt;br /&gt;ansi&amp;nbsp;=&amp;nbsp;n; &lt;br /&gt;} &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;System.out.println(ans1);System.out.println(P[ansi]); &lt;br /&gt;&lt;br /&gt;return; &lt;br /&gt;} &lt;br /&gt;for(int&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0&amp;nbsp;;&amp;nbsp;i&amp;nbsp;&amp;lt;=&amp;nbsp;N&amp;nbsp;;&amp;nbsp;i++)&amp;nbsp;{ &lt;br /&gt;for(int&amp;nbsp;j&amp;nbsp;=&amp;nbsp;0&amp;nbsp;;&amp;nbsp;j&amp;nbsp;&amp;lt;=&amp;nbsp;N&amp;nbsp;;&amp;nbsp;j++)&amp;nbsp;{ &lt;br /&gt;Arrays.fill(dp[i][j],&amp;nbsp;Long.MAX_VALUE&amp;nbsp;/&amp;nbsp;2); &lt;br /&gt;} &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;for(int&amp;nbsp;i&amp;nbsp;=&amp;nbsp;1&amp;nbsp;;&amp;nbsp;i&amp;nbsp;&amp;lt;=&amp;nbsp;N&amp;nbsp;;&amp;nbsp;i++)&amp;nbsp;{ &lt;br /&gt;for(int&amp;nbsp;j&amp;nbsp;=&amp;nbsp;i&amp;nbsp;+&amp;nbsp;1&amp;nbsp;;&amp;nbsp;j&amp;nbsp;&amp;lt;=&amp;nbsp;N&amp;nbsp;;&amp;nbsp;j++)&amp;nbsp;{ &lt;br /&gt;dp[i][j][2]&amp;nbsp;=&amp;nbsp;getS(i,j); &lt;br /&gt;//System.out.println&amp;nbsp;(dp[i][j][2]&amp;nbsp;+&amp;nbsp;&quot;&amp;nbsp;&quot;&amp;nbsp;+&amp;nbsp;&amp;nbsp;i&amp;nbsp;&amp;nbsp;&amp;nbsp;+&amp;nbsp;&quot;&amp;nbsp;&amp;nbsp;&quot;&amp;nbsp;+&amp;nbsp;&amp;nbsp;j&amp;nbsp;); &lt;br /&gt;} &lt;br /&gt;} &lt;br /&gt;&amp;nbsp; List&amp;lt;Integer&amp;gt;&amp;nbsp;pows&amp;nbsp;=&amp;nbsp;new&amp;nbsp;ArrayList&amp;lt;Integer&amp;gt;(); &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; for(int&amp;nbsp;pow&amp;nbsp;=&amp;nbsp;2&amp;nbsp;;&amp;nbsp;pow&amp;nbsp;&amp;lt;=&amp;nbsp;300&amp;nbsp;;&amp;nbsp;pow&amp;nbsp;=&amp;nbsp;2&amp;nbsp;*&amp;nbsp;pow&amp;nbsp;-&amp;nbsp;1)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; pows.add(pow); &lt;br /&gt;&amp;nbsp; } &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;for(int&amp;nbsp;pow&amp;nbsp;=&amp;nbsp;2&amp;nbsp;;&amp;nbsp;pow&amp;nbsp;&amp;lt;=&amp;nbsp;150&amp;nbsp;;&amp;nbsp;pow&amp;nbsp;=&amp;nbsp;2&amp;nbsp;*&amp;nbsp;pow&amp;nbsp;-&amp;nbsp;1)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;N&amp;nbsp;^&amp;nbsp;3&amp;nbsp;*&amp;nbsp;log2N &lt;br /&gt;&lt;br /&gt;for(int&amp;nbsp;i&amp;nbsp;=&amp;nbsp;1&amp;nbsp;;&amp;nbsp;i&amp;nbsp;&amp;lt;=&amp;nbsp;N&amp;nbsp;;&amp;nbsp;i++)&amp;nbsp;{ &lt;br /&gt;for(int&amp;nbsp;j&amp;nbsp;=&amp;nbsp;i&amp;nbsp;+&amp;nbsp;1&amp;nbsp;;&amp;nbsp;j&amp;nbsp;&amp;lt;=&amp;nbsp;N&amp;nbsp;;&amp;nbsp;j++)&amp;nbsp;{ &lt;br /&gt;for(int&amp;nbsp;m&amp;nbsp;=&amp;nbsp;pow&amp;nbsp;+&amp;nbsp;i&amp;nbsp;-&amp;nbsp;1&amp;nbsp;;&amp;nbsp;m&amp;nbsp;&amp;lt;=&amp;nbsp;j&amp;nbsp;+&amp;nbsp;1&amp;nbsp;-&amp;nbsp;pow&amp;nbsp;;&amp;nbsp;m++)&amp;nbsp;{ &lt;br /&gt;// if(m&amp;nbsp;-&amp;nbsp;i&amp;nbsp;+&amp;nbsp;1&amp;nbsp;&amp;lt;&amp;nbsp;pow&amp;nbsp;||&amp;nbsp;&amp;nbsp;&amp;nbsp;j&amp;nbsp;-&amp;nbsp;m&amp;nbsp;+&amp;nbsp;1&amp;nbsp;&amp;lt;&amp;nbsp;pow&amp;nbsp;)&amp;nbsp;continue; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;if(dp[i][m][pow]&amp;nbsp;+&amp;nbsp;dp[m][j][pow]&amp;nbsp;&amp;lt;&amp;nbsp;dp[i][j][2&amp;nbsp;*&amp;nbsp;pow&amp;nbsp;-&amp;nbsp;1])&amp;nbsp;{ &lt;br /&gt;trace[i][j][2&amp;nbsp;*&amp;nbsp;pow&amp;nbsp;-&amp;nbsp;1]&amp;nbsp;=&amp;nbsp;new&amp;nbsp;long[]&amp;nbsp;{m,&amp;nbsp;pow&amp;nbsp;,&amp;nbsp;pow}; &lt;br /&gt;dp[i][j][2&amp;nbsp;*&amp;nbsp;pow&amp;nbsp;-&amp;nbsp;1]&amp;nbsp;=&amp;nbsp;dp[i][m][pow]&amp;nbsp;+&amp;nbsp;dp[m][j][pow]; &lt;br /&gt;} &lt;br /&gt;&amp;nbsp; &lt;br /&gt;} &lt;br /&gt;} &lt;br /&gt;} &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;int&amp;nbsp;pow&amp;nbsp;=&amp;nbsp;0; &lt;br /&gt;int&amp;nbsp;psum&amp;nbsp;=&amp;nbsp;0; &lt;br /&gt;for(int&amp;nbsp;i&amp;nbsp;=&amp;nbsp;pows.size()&amp;nbsp;-&amp;nbsp;1&amp;nbsp;;&amp;nbsp;i&amp;gt;=&amp;nbsp;0&amp;nbsp;;&amp;nbsp;i--)&amp;nbsp;{ &lt;br /&gt;if(pows.get(i)&amp;nbsp;&amp;lt;=&amp;nbsp;posts)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;psum&amp;nbsp;=&amp;nbsp;pows.get(i)&amp;nbsp;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break; &lt;br /&gt;} &lt;br /&gt;} &lt;br /&gt;while(psum&amp;nbsp;&amp;lt;&amp;nbsp;posts)&amp;nbsp;{ &lt;br /&gt;for(int&amp;nbsp;i&amp;nbsp;=&amp;nbsp;pows.size()&amp;nbsp;-&amp;nbsp;1&amp;nbsp;;&amp;nbsp;i&amp;gt;=&amp;nbsp;0&amp;nbsp;;&amp;nbsp;i--)&amp;nbsp;{ &lt;br /&gt;if(pows.get(i)&amp;nbsp;+&amp;nbsp;psum&amp;nbsp;-&amp;nbsp;1&amp;nbsp;&amp;lt;=&amp;nbsp;posts)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;pow&amp;nbsp;=&amp;nbsp;pows.get(i);&amp;nbsp;break; &lt;br /&gt;} &lt;br /&gt;} &lt;br /&gt;&amp;nbsp; &lt;br /&gt;for(int&amp;nbsp;i&amp;nbsp;=&amp;nbsp;1&amp;nbsp;;&amp;nbsp;i&amp;nbsp;&amp;lt;=&amp;nbsp;N&amp;nbsp;;&amp;nbsp;i++)&amp;nbsp;{ &lt;br /&gt;for(int&amp;nbsp;j&amp;nbsp;=&amp;nbsp;i&amp;nbsp;+&amp;nbsp;1&amp;nbsp;;&amp;nbsp;j&amp;nbsp;&amp;lt;=&amp;nbsp;N&amp;nbsp;;&amp;nbsp;j++)&amp;nbsp;{ &lt;br /&gt;for(int&amp;nbsp;m&amp;nbsp;=&amp;nbsp;pow&amp;nbsp;+&amp;nbsp;i&amp;nbsp;-&amp;nbsp;1&amp;nbsp;;&amp;nbsp;m&amp;nbsp;&amp;lt;=&amp;nbsp;j&amp;nbsp;+&amp;nbsp;1&amp;nbsp;-&amp;nbsp;psum&amp;nbsp;;&amp;nbsp;m++)&amp;nbsp;{ &lt;br /&gt;//if(m&amp;nbsp;-&amp;nbsp;i&amp;nbsp;+&amp;nbsp;1&amp;nbsp;&amp;lt;&amp;nbsp;pow&amp;nbsp;||&amp;nbsp;&amp;nbsp;&amp;nbsp;j&amp;nbsp;-&amp;nbsp;m&amp;nbsp;+&amp;nbsp;1&amp;nbsp;&amp;lt;&amp;nbsp;psum&amp;nbsp;)&amp;nbsp;continue; &lt;br /&gt;if(&amp;nbsp;dp[i][m][pow]&amp;nbsp;+&amp;nbsp;dp[m][j][psum]&amp;nbsp;&amp;lt;&amp;nbsp;dp[i][j][pow&amp;nbsp;+&amp;nbsp;psum&amp;nbsp;-&amp;nbsp;1])&amp;nbsp;{ &lt;br /&gt;dp[i][j][pow&amp;nbsp;+&amp;nbsp;psum&amp;nbsp;-&amp;nbsp;1]&amp;nbsp;=&amp;nbsp;dp[i][m][pow]&amp;nbsp;+&amp;nbsp;dp[m][j][psum]; &lt;br /&gt;trace[i][j][pow&amp;nbsp;+&amp;nbsp;psum&amp;nbsp;-&amp;nbsp;1]&amp;nbsp;=&amp;nbsp;new&amp;nbsp;long[]&amp;nbsp;{m,&amp;nbsp;pow&amp;nbsp;,&amp;nbsp;psum}; &lt;br /&gt;&lt;br /&gt;} &lt;br /&gt;&amp;nbsp; &lt;br /&gt;} &lt;br /&gt;} &lt;br /&gt;} &lt;br /&gt;psum&amp;nbsp;=&amp;nbsp;psum&amp;nbsp;+&amp;nbsp;pow&amp;nbsp;-&amp;nbsp;1; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;} &lt;br /&gt;&amp;nbsp; &lt;br /&gt;long&amp;nbsp;ans&amp;nbsp;=&amp;nbsp;Long.MAX_VALUE&amp;nbsp;; &lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;int&amp;nbsp;anss&amp;nbsp;=&amp;nbsp;0&amp;nbsp;;&amp;nbsp;int&amp;nbsp;anse&amp;nbsp;=&amp;nbsp;0&amp;nbsp;;&amp;nbsp; &lt;br /&gt;for(int&amp;nbsp;i&amp;nbsp;=&amp;nbsp;1&amp;nbsp;;&amp;nbsp;i&amp;nbsp;&amp;lt;=&amp;nbsp;N&amp;nbsp;;&amp;nbsp;i++)&amp;nbsp;{ &lt;br /&gt;for(int&amp;nbsp;j&amp;nbsp;=&amp;nbsp;i&amp;nbsp;+&amp;nbsp;1&amp;nbsp;;&amp;nbsp;j&amp;nbsp;&amp;lt;=&amp;nbsp;N&amp;nbsp;;&amp;nbsp;j++)&amp;nbsp;{ &lt;br /&gt;long&amp;nbsp;res&amp;nbsp;=&amp;nbsp;&amp;nbsp;getS2(j,i)+&amp;nbsp;dp[i][j][posts]; &lt;br /&gt;if(res&amp;nbsp;&amp;lt;&amp;nbsp;ans)&amp;nbsp;{ &lt;br /&gt;ans&amp;nbsp;=&amp;nbsp;res; &lt;br /&gt;anss&amp;nbsp;=&amp;nbsp;i&amp;nbsp;;&amp;nbsp;anse&amp;nbsp;=&amp;nbsp;j; &lt;br /&gt;&lt;br /&gt;} &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;} &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;System.out.println(ans); &lt;br /&gt;&amp;nbsp;&amp;nbsp;makeList(anss&amp;nbsp;,&amp;nbsp;anse&amp;nbsp;,&amp;nbsp;posts); &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;Set&amp;lt;Long&amp;gt;&amp;nbsp;ansS&amp;nbsp;=&amp;nbsp;new&amp;nbsp;HashSet&amp;lt;Long&amp;gt;(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;ansS.addAll(ansL); &lt;br /&gt;&amp;nbsp;&amp;nbsp;ansL&amp;nbsp;=&amp;nbsp;new&amp;nbsp;ArrayList&amp;lt;Long&amp;gt;(ansS); &lt;br /&gt;&amp;nbsp;&amp;nbsp;Collections.sort(ansL); &lt;br /&gt;StringBuilder&amp;nbsp;sb&amp;nbsp;=&amp;nbsp;new&amp;nbsp;StringBuilder(); &lt;br /&gt;for(long&amp;nbsp;idx&amp;nbsp;:&amp;nbsp;ansL)&amp;nbsp;sb.append(idx&amp;nbsp;+&amp;nbsp;&quot;&amp;nbsp;&quot;); &lt;br /&gt;System.out.println(sb); &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;} &lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; public&amp;nbsp;static&amp;nbsp;long&amp;nbsp;getS(int&amp;nbsp;n1&amp;nbsp;,&amp;nbsp;int&amp;nbsp;n2)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp; long&amp;nbsp;mid&amp;nbsp;=&amp;nbsp;(P[n1]&amp;nbsp;+&amp;nbsp;P[n2]&amp;nbsp;&amp;nbsp;)&amp;nbsp;/2; &lt;br /&gt;&amp;nbsp; if(posts&amp;nbsp;==&amp;nbsp;1)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp; long&amp;nbsp;res&amp;nbsp;=&amp;nbsp;(P[n1]&amp;nbsp;+&amp;nbsp;L&amp;nbsp;/&amp;nbsp;2); &lt;br /&gt;&amp;nbsp; mid&amp;nbsp;=&amp;nbsp;res&amp;nbsp;&amp;gt;=&amp;nbsp;L&amp;nbsp;?&amp;nbsp;&amp;nbsp;res&amp;nbsp;-&amp;nbsp;L&amp;nbsp;:&amp;nbsp;res; &lt;br /&gt;&amp;nbsp; } &lt;br /&gt;&amp;nbsp; int&amp;nbsp;mi&amp;nbsp;=&amp;nbsp;0&amp;nbsp;;&amp;nbsp;int&amp;nbsp;l&amp;nbsp;=&amp;nbsp;1&amp;nbsp;;&amp;nbsp;int&amp;nbsp;r&amp;nbsp;=&amp;nbsp;N; &lt;br /&gt;&amp;nbsp; while(l&amp;nbsp;&amp;lt;=&amp;nbsp;r)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp; int&amp;nbsp;m&amp;nbsp;=&amp;nbsp;(l&amp;nbsp;+&amp;nbsp;r)&amp;nbsp;/&amp;nbsp;2; &lt;br /&gt;&amp;nbsp; if(P[m]&amp;nbsp;&amp;lt;=&amp;nbsp;mid)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp; mi&amp;nbsp;=&amp;nbsp;m; &lt;br /&gt;&amp;nbsp; l&amp;nbsp;=&amp;nbsp;m&amp;nbsp;+&amp;nbsp;1; &lt;br /&gt;&amp;nbsp; }else&amp;nbsp;{ &lt;br /&gt;&amp;nbsp; r&amp;nbsp;=&amp;nbsp;m&amp;nbsp;-&amp;nbsp;1; &lt;br /&gt;&amp;nbsp; } &lt;br /&gt;&amp;nbsp; } &lt;br /&gt;&amp;nbsp; //System.out.println(&amp;nbsp;&amp;nbsp;n1&amp;nbsp;+&amp;nbsp;&quot;&amp;nbsp;&amp;nbsp;&quot;&amp;nbsp;+&amp;nbsp;n2&amp;nbsp;+&amp;nbsp;&quot;&amp;nbsp;m&amp;nbsp;&quot;&amp;nbsp;+&amp;nbsp;mi); &lt;br /&gt;&amp;nbsp; long&amp;nbsp;sum1&amp;nbsp;=&amp;nbsp; sum[mi]&amp;nbsp;-&amp;nbsp;sum[n1&amp;nbsp;-&amp;nbsp;1]&amp;nbsp;-&amp;nbsp;(mi&amp;nbsp;-&amp;nbsp;n1&amp;nbsp;+&amp;nbsp;1)&amp;nbsp;*&amp;nbsp;P[n1]&amp;nbsp;; &lt;br /&gt;&amp;nbsp; long&amp;nbsp;sum2&amp;nbsp;=&amp;nbsp;&amp;nbsp;(n2&amp;nbsp;-&amp;nbsp;(mi&amp;nbsp;+&amp;nbsp;1)&amp;nbsp;+&amp;nbsp;1)&amp;nbsp;*&amp;nbsp;L&amp;nbsp;-&amp;nbsp;(sum[n2]&amp;nbsp;-&amp;nbsp;sum[mi]&amp;nbsp;)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;(n2&amp;nbsp;-&amp;nbsp;(mi&amp;nbsp;+&amp;nbsp;1)&amp;nbsp;+&amp;nbsp;1)&amp;nbsp;*&amp;nbsp;(L&amp;nbsp;-&amp;nbsp;P[n2])&amp;nbsp;; &lt;br /&gt;&amp;nbsp; return&amp;nbsp;sum1&amp;nbsp;+&amp;nbsp;sum2; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; } &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; public&amp;nbsp;static&amp;nbsp;long&amp;nbsp;getS2(int&amp;nbsp;n1&amp;nbsp;,&amp;nbsp;int&amp;nbsp;n2)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp; long&amp;nbsp;dist&amp;nbsp;=&amp;nbsp;L&amp;nbsp;-&amp;nbsp;P[n1]&amp;nbsp;+&amp;nbsp;P[n2];&amp;nbsp;long&amp;nbsp;mid&amp;nbsp;=&amp;nbsp;0; &lt;br /&gt;&amp;nbsp; if(P[n1]&amp;nbsp;+&amp;nbsp;dist&amp;nbsp;/&amp;nbsp;2&amp;nbsp;&amp;gt;=&amp;nbsp;L)&amp;nbsp;{&amp;nbsp; &lt;br /&gt;&amp;nbsp; mid&amp;nbsp;=&amp;nbsp;P[n1]&amp;nbsp;+&amp;nbsp;dist&amp;nbsp;/&amp;nbsp;2&amp;nbsp;-&amp;nbsp;L; &lt;br /&gt;&amp;nbsp; } &lt;br /&gt;&amp;nbsp; else&amp;nbsp;mid&amp;nbsp;=&amp;nbsp;P[n1&amp;nbsp;]&amp;nbsp;+&amp;nbsp;dist&amp;nbsp;&amp;nbsp;/&amp;nbsp;2; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; int&amp;nbsp;mi&amp;nbsp;=&amp;nbsp;0&amp;nbsp;;&amp;nbsp;int&amp;nbsp;l=&amp;nbsp;1&amp;nbsp;;&amp;nbsp;int&amp;nbsp;r&amp;nbsp;=&amp;nbsp;N; &lt;br /&gt;&amp;nbsp; while(l&amp;nbsp;&amp;lt;=&amp;nbsp;r)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp; int&amp;nbsp;m&amp;nbsp;=&amp;nbsp;(l&amp;nbsp;+&amp;nbsp;r)&amp;nbsp;/&amp;nbsp;2; &lt;br /&gt;&amp;nbsp; if(P[m]&amp;nbsp;&amp;lt;=&amp;nbsp;mid)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp; mi&amp;nbsp;=&amp;nbsp;m; &lt;br /&gt;&amp;nbsp; l&amp;nbsp;=&amp;nbsp;m&amp;nbsp;+&amp;nbsp;1; &lt;br /&gt;&amp;nbsp; }else&amp;nbsp;{ &lt;br /&gt;&amp;nbsp; r&amp;nbsp;=&amp;nbsp;m&amp;nbsp;-&amp;nbsp;1; &lt;br /&gt;&amp;nbsp; } &lt;br /&gt;&amp;nbsp; } &lt;br /&gt;&amp;nbsp; long&amp;nbsp;sum1&amp;nbsp;=&amp;nbsp;0&amp;nbsp;;&amp;nbsp;long&amp;nbsp;sum2&amp;nbsp;=&amp;nbsp;0&amp;nbsp;;&amp;nbsp;long&amp;nbsp;sum3&amp;nbsp;=&amp;nbsp;0; &lt;br /&gt;&amp;nbsp; if(n1&amp;nbsp;&amp;lt;=&amp;nbsp;mi)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;sum1&amp;nbsp;=&amp;nbsp;sum[mi]&amp;nbsp;-&amp;nbsp;sum[n1&amp;nbsp;-&amp;nbsp;1]&amp;nbsp;-&amp;nbsp;(mi&amp;nbsp;-&amp;nbsp;n1&amp;nbsp;+&amp;nbsp;1)&amp;nbsp;*&amp;nbsp;P[n1]; &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;sum2&amp;nbsp;=&amp;nbsp;&amp;nbsp;&amp;nbsp;(N-&amp;nbsp;(mi&amp;nbsp;+&amp;nbsp;1)&amp;nbsp;+&amp;nbsp;1)&amp;nbsp;*&amp;nbsp;P[n2]&amp;nbsp;+&amp;nbsp;(L&amp;nbsp;*&amp;nbsp;(N&amp;nbsp;-&amp;nbsp;mi)&amp;nbsp;-&amp;nbsp;(sum[N]&amp;nbsp;-&amp;nbsp;sum[mi]));&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;mi&amp;nbsp;+&amp;nbsp;1&amp;nbsp;~&amp;nbsp;N &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;sum3&amp;nbsp;=&amp;nbsp;&amp;nbsp;n2&amp;nbsp;*&amp;nbsp;P[n2]&amp;nbsp;-&amp;nbsp;sum[n2];&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;1&amp;nbsp;~&amp;nbsp;n2 &lt;br /&gt;&amp;nbsp; //&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(sum1&amp;nbsp;+&amp;nbsp;&quot;&amp;nbsp;&quot;&amp;nbsp;+&amp;nbsp;sum2&amp;nbsp;+&amp;nbsp;&quot;&amp;nbsp;&quot;&amp;nbsp;+&amp;nbsp;sum3); &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; }else&amp;nbsp;{ &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;sum1&amp;nbsp;=&amp;nbsp;sum[N]&amp;nbsp;-&amp;nbsp;sum[n1&amp;nbsp;-&amp;nbsp;1]&amp;nbsp;-&amp;nbsp;(N&amp;nbsp;-&amp;nbsp;n1&amp;nbsp;+&amp;nbsp;1)&amp;nbsp;*&amp;nbsp;P[n1]; &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;sum2&amp;nbsp;=&amp;nbsp;mi&amp;nbsp;*&amp;nbsp;(L&amp;nbsp;-&amp;nbsp;P[n1])&amp;nbsp;+&amp;nbsp;sum[mi]; &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;sum3&amp;nbsp;=&amp;nbsp;(n2&amp;nbsp;-&amp;nbsp;(mi&amp;nbsp;+&amp;nbsp;1)&amp;nbsp;+&amp;nbsp;1)&amp;nbsp;*&amp;nbsp;P[n2]&amp;nbsp;-&amp;nbsp;(sum[n2]&amp;nbsp;-&amp;nbsp;sum[mi]);&amp;nbsp;&amp;nbsp;//&amp;nbsp;mi&amp;nbsp;+&amp;nbsp;1&amp;nbsp;~&amp;nbsp;n2 &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; } &lt;br /&gt;&amp;nbsp; // System.out.println(n1&amp;nbsp;+&amp;nbsp;&quot;&amp;nbsp;&quot;&amp;nbsp;+&amp;nbsp;n2&amp;nbsp;+&amp;nbsp;&quot;&amp;nbsp;mi&amp;nbsp;&quot;&amp;nbsp;&amp;nbsp;+&amp;nbsp;mi&amp;nbsp;+&amp;nbsp;&quot;&amp;nbsp;mid&amp;nbsp;&quot;&amp;nbsp;+&amp;nbsp;mid&amp;nbsp;+&amp;nbsp;&amp;nbsp;&quot;&amp;nbsp;res&amp;nbsp;&quot;&amp;nbsp;+&amp;nbsp;(sum1&amp;nbsp;+&amp;nbsp;sum2&amp;nbsp;+&amp;nbsp;sum3)); &lt;br /&gt;&amp;nbsp; return&amp;nbsp;sum1&amp;nbsp;+&amp;nbsp;sum2&amp;nbsp;+&amp;nbsp;sum3; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static&amp;nbsp;void&amp;nbsp;makeList(int&amp;nbsp;s&amp;nbsp;,&amp;nbsp;int&amp;nbsp;e&amp;nbsp;,&amp;nbsp;int&amp;nbsp;cnt)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(cnt&amp;nbsp;==&amp;nbsp;2)&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ansL.add(P[s]);&amp;nbsp;ansL.add(P[e]); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return&amp;nbsp;; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int&amp;nbsp;mid&amp;nbsp;=&amp;nbsp;(int)trace[s][e][cnt][0]; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int&amp;nbsp;cnt1&amp;nbsp;=&amp;nbsp;(int)trace[s][e][cnt][1]; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int&amp;nbsp;cnt2=&amp;nbsp;(int)trace[s][e][cnt][2]; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; makeList(s,&amp;nbsp;mid&amp;nbsp;,&amp;nbsp;cnt1);&amp;nbsp;makeList(mid,&amp;nbsp;e&amp;nbsp;,&amp;nbsp;cnt2); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>알고리즘/baekjoon(boj)</category>
      <category>boj18444</category>
      <category>백준 우체국3</category>
      <category>백준18444</category>
      <author>끄응끄응</author>
      <guid isPermaLink="true">https://jihyung1997.tistory.com/62</guid>
      <comments>https://jihyung1997.tistory.com/62#entry62comment</comments>
      <pubDate>Sun, 29 Mar 2026 05:27:01 +0900</pubDate>
    </item>
    <item>
      <title>[platinum3][풀이미확인, 분류확인]32115 돌 놓기 게임 (체감  : 플레1 ~2)</title>
      <link>https://jihyung1997.tistory.com/61</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/32115&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/32115&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;1461&quot; data-origin-height=&quot;901&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clWEgL/dJMcaaSdVTp/gnmZBpM4q4KdXKra2CI5k0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clWEgL/dJMcaaSdVTp/gnmZBpM4q4KdXKra2CI5k0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clWEgL/dJMcaaSdVTp/gnmZBpM4q4KdXKra2CI5k0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclWEgL%2FdJMcaaSdVTp%2FgnmZBpM4q4KdXKra2CI5k0%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;1461&quot; height=&quot;901&quot; data-origin-width=&quot;1461&quot; data-origin-height=&quot;901&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;아무리 봐도 플레3은 아닌 문제였다. 아이디어 발상도 흔하지 않아 떠올리기 어렵고, 구현도 내 기준 쉽지 않았다..&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게임이론에서 쓰이는 이상한 알고리즘이 있는데 그 알고리즘이면 안 푸려고 분류를 확인하였다.. (보면서 얼떨결에 그리디라는 것도 알게 되어 큰 힌트가 된듯)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;927&quot; data-origin-height=&quot;1089&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8XLT9/dJMcaflF1r4/L8N7GGHnRzKOGBSaaVPjuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8XLT9/dJMcaflF1r4/L8N7GGHnRzKOGBSaaVPjuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8XLT9/dJMcaflF1r4/L8N7GGHnRzKOGBSaaVPjuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8XLT9%2FdJMcaflF1r4%2FL8N7GGHnRzKOGBSaaVPjuk%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;927&quot; height=&quot;1089&quot; data-origin-width=&quot;927&quot; data-origin-height=&quot;1089&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 경우를 생각해보자. (초록색: 점수 검정색: 흑or백)&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;b&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;1142&quot; data-origin-height=&quot;1107&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sQPQa/dJMcafeWt4x/mMzLkCTYmU0K8mXasWLHjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sQPQa/dJMcafeWt4x/mMzLkCTYmU0K8mXasWLHjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sQPQa/dJMcafeWt4x/mMzLkCTYmU0K8mXasWLHjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsQPQa%2FdJMcafeWt4x%2FmMzLkCTYmU0K8mXasWLHjK%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;1107&quot; data-origin-width=&quot;1142&quot; data-origin-height=&quot;1107&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 묶인 그룹에는 다른 색깔이 침범할 수 없다.&amp;nbsp; 예를 들어 2번 그룹 (백으로 둘러싸임)에 흑이 들어갈 수 없다. 백은 백끼리 흑은 흑끼리 인접하면서 확장해 나가야 하기 때문.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 위의 그룹들 안의 0을 채워넣는 것은 가장 나중에 해도 될 것이다. 1번과 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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1203&quot; data-origin-height=&quot;1198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/medX1/dJMcaakmJCl/Sv3bhHadxmUwQdDAj4bPr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/medX1/dJMcaakmJCl/Sv3bhHadxmUwQdDAj4bPr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/medX1/dJMcaakmJCl/Sv3bhHadxmUwQdDAj4bPr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmedX1%2FdJMcaakmJCl%2FSv3bhHadxmUwQdDAj4bPr0%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;1203&quot; height=&quot;1198&quot; data-origin-width=&quot;1203&quot; data-origin-height=&quot;1198&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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-origin-width=&quot;907&quot; data-origin-height=&quot;275&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DhxI4/dJMcagZaxAi/atO9BRJFgkzpC11GhytbCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DhxI4/dJMcagZaxAi/atO9BRJFgkzpC11GhytbCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DhxI4/dJMcagZaxAi/atO9BRJFgkzpC11GhytbCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDhxI4%2FdJMcagZaxAi%2FatO9BRJFgkzpC11GhytbCk%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;907&quot; height=&quot;275&quot; data-origin-width=&quot;907&quot; data-origin-height=&quot;275&quot;/&gt;&lt;/span&gt;&lt;/figure&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,14,10,12,8 점 순이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;즉 오른쪽에서 멀어질 수록 먹기힘든 점수가 된다.&amp;nbsp; 그런데 만약 먹기 힘든 점수인데 그 점수가 매우 크다면?&amp;nbsp; 위험을 무릅쓰고 라도 점수를 먹으러 갈 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흑 부터 시작하므로 , 일단 흑이 먹어야 할 점수는 3번구간의 15점이라는 것은 당연하다. 15점은 가장 큰 수이고, 지금 안먹으면 백에게 빼앗기기 때문이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;그럼 흑은 일단 15점을 먹었고, 다음 턴에 백은 1번구간, 2번구간 중 어디에 두어야 할까?&amp;nbsp; &amp;nbsp;2번에 두어야 할 것 같다. 지금 2번에 두게되면, 10점은 확정적으로 먹을 수 있게 된다. 아래와 같은 순서대로 결국 백이 10점을 먹게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;303&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VDmBf/dJMcafeWvi3/zrQyWlkjVSJ7Hp7lPy9jkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VDmBf/dJMcafeWvi3/zrQyWlkjVSJ7Hp7lPy9jkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VDmBf/dJMcafeWvi3/zrQyWlkjVSJ7Hp7lPy9jkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVDmBf%2FdJMcafeWvi3%2FzrQyWlkjVSJ7Hp7lPy9jkk%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;691&quot; height=&quot;268&quot; data-origin-width=&quot;781&quot; data-origin-height=&quot;303&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면, 구간의 딱 중간을 먹기 위해서, (10점)&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;그러나 또 한편으론 의심이 든다. 일단 10점을 먹기 위해서 8점부분에 돌을 두긴 두었는데,&amp;nbsp; 10점으로 가는데, (8점 -&amp;gt; 12 점 -&amp;gt; 10점) 먹는 점수보다, 다른 구간을 먼저 선점하는게 이득일 수도 있지 않을까?&amp;nbsp;&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;841&quot; data-origin-height=&quot;371&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEic9A/dJMcajhf708/cL4fRI7HHIKd33XzcXYUE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEic9A/dJMcajhf708/cL4fRI7HHIKd33XzcXYUE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEic9A/dJMcajhf708/cL4fRI7HHIKd33XzcXYUE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEic9A%2FdJMcajhf708%2FcL4fRI7HHIKd33XzcXYUE0%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;841&quot; height=&quot;371&quot; data-origin-width=&quot;841&quot; data-origin-height=&quot;371&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들면 다음과 같다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위와 같은 경우에 백이 10점을 먹기위해 8점 -&amp;gt; 12점 -&amp;gt; 10점을 먹는 것보다&amp;nbsp; 아래구간의 20점 -&amp;gt; 20점 을 먹는게 이득 아닌가?&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그러나 그렇지 않다.&amp;nbsp; 아래의 20점&amp;nbsp; 구간은 안전지대로, 아직 백의 것이 확정인 상태이다. 즉 , 흑이 20점을 먹기위해 공격이 들어오면(흑이 초록5번에 두면) 그 때 백도 공격에 나서면 된다.(초록1에 둔다).&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;현 상황에서, 구간의 갯수가 홀수 일때 백이 먼저 돌을 둠으로써 자기의 영역이 된다고 확정지을 수 있는 구간은 중간 부분이다. (10점) .&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;744&quot; data-origin-height=&quot;386&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crZmhj/dJMcagky3iD/60klB6i2cWwLAo4yBIRkpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crZmhj/dJMcagky3iD/60klB6i2cWwLAo4yBIRkpK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crZmhj/dJMcagky3iD/60klB6i2cWwLAo4yBIRkpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrZmhj%2FdJMcagky3iD%2F60klB6i2cWwLAo4yBIRkpK%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;744&quot; height=&quot;386&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;386&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 말이다. (구간길이가 1인 경우는 중간이 곧 구간)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 구간의 갯수가 짝수인 경우는 어떻게 할까?&lt;/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-origin-width=&quot;680&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLNoVE/dJMcadOREUr/pkIA1U0dezg3IGoDfyqFo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLNoVE/dJMcadOREUr/pkIA1U0dezg3IGoDfyqFo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLNoVE/dJMcadOREUr/pkIA1U0dezg3IGoDfyqFo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLNoVE%2FdJMcadOREUr%2FpkIA1U0dezg3IGoDfyqFo1%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;680&quot; height=&quot;288&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;288&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;554&quot; data-origin-height=&quot;291&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbr6wJ/dJMcai3H3YX/yly5YhPNYuu3AoMELeT8AK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbr6wJ/dJMcai3H3YX/yly5YhPNYuu3AoMELeT8AK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbr6wJ/dJMcai3H3YX/yly5YhPNYuu3AoMELeT8AK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbbr6wJ%2FdJMcai3H3YX%2Fyly5YhPNYuu3AoMELeT8AK%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;554&quot; height=&quot;291&quot; data-origin-width=&quot;554&quot; data-origin-height=&quot;291&quot;/&gt;&lt;/span&gt;&lt;/figure&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;우선 흑은 4점짜리에 먼저 둔다고 치자. 그 이유는, 다음 턴에 백이 1점에 두게 되지 않으면&amp;nbsp; 흑이 21점을 먹을 수 있기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 백은 방어하기 위해 1점에 두게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;그 다음 마찬가지 이유로 다시 흑이 20점에 두게 되고, 백은 방어를 위해 21점에 두게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이와 같은 식으로 반복하면,&amp;nbsp; 짝수인 구간에서는 정확히 영역이 반으로 나뉘게 된다. (명쾌하다)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;짝수인 경우에, 누가 먼저 두느냐에 따라 선점할 수 있는 구간이 없고 (구간의&amp;nbsp; 절반인 구간이 홀수와 달리 없기때문) 공격이 들어오면 충분히 방어할 수 있기 때문이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;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;525&quot; data-origin-height=&quot;100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uZbYk/dJMcadg5vJS/mx6ybpAgVa8PSm0bZBTj6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uZbYk/dJMcadg5vJS/mx6ybpAgVa8PSm0bZBTj6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uZbYk/dJMcadg5vJS/mx6ybpAgVa8PSm0bZBTj6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuZbYk%2FdJMcadg5vJS%2Fmx6ybpAgVa8PSm0bZBTj6k%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;525&quot; height=&quot;100&quot; data-origin-width=&quot;525&quot; data-origin-height=&quot;100&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백의 차례에서 백이 가장 먼저 돌을 두면, 나머지 구간 (12, 10 , 14 ,2 ) 은 길이가 짝수가 되므로, 그다음부터는 백과 흑의 영역이 정확히 반으로 나뉘게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 이제 짝수구간이 되면 알아서 반반으로 나뉜다는 걸 알았으니, 어떻게 하면 되겠는가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구간 길이가 홀수인경우에만, 가운데 부분이 큰 순서대로 서로 선점해 나가면 될 것이다. 위의 경우, 백이 먼저 돌을 둠으로써 , 10 점 부분이 백의 영역이 된 것처럼 말이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론적으로,&amp;nbsp; 빈 구간은 다음과 같이 채워질 것이다. (파란점 흑 , 빨간점 백)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1114&quot; data-origin-height=&quot;1115&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBaElq/dJMb99MuP5i/iKhD5p5yoRMhKWvRMB1HK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBaElq/dJMb99MuP5i/iKhD5p5yoRMhKWvRMB1HK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBaElq/dJMb99MuP5i/iKhD5p5yoRMhKWvRMB1HK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBaElq%2FdJMb99MuP5i%2FiKhD5p5yoRMhKWvRMB1HK0%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;1114&quot; height=&quot;1115&quot; data-origin-width=&quot;1114&quot; data-origin-height=&quot;1115&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 그 이후 파란 구간 ( 같은 돌로 둘러싸인 구간은 알아서 같은 돌로 채워짐) 도 채운다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;1114&quot; data-origin-height=&quot;1050&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FVDl7/dJMcaaq8Lhw/zT5q4lMNkuogcX6KypmKn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FVDl7/dJMcaaq8Lhw/zT5q4lMNkuogcX6KypmKn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FVDl7/dJMcaaq8Lhw/zT5q4lMNkuogcX6KypmKn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFVDl7%2FdJMcaaq8Lhw%2FzT5q4lMNkuogcX6KypmKn0%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;1114&quot; height=&quot;1050&quot; data-origin-width=&quot;1114&quot; data-origin-height=&quot;1050&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 다 채웠다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요약하면 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 1번과 2번이 대치하는 구간을 찾기.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.&amp;nbsp; 그 구간의 길이가 홀수이면, 우선순위큐에 가운데 값을 넣는다. 짝수라면, 절반 씩 구간을 채운다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 우선순위큐에서 꺼내가면서, 흑백흑백흑... 순서로 가운데 값이 큰 구간부터 돌을 채우고, 구간의 나머지 부분은 짝수가 되므로, 절반씩 구간을 채운다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 나머지&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;구현도 결코 쉽지 않으며, 아이디어도 어려웠는데 왜 플레3인지 의문을 가지며, 글을 마친다.&lt;/p&gt;</description>
      <category>알고리즘/baekjoon(boj)</category>
      <category>boj32115</category>
      <category>백준 32115 돌 놓기 게임</category>
      <category>백준32115</category>
      <author>끄응끄응</author>
      <guid isPermaLink="true">https://jihyung1997.tistory.com/61</guid>
      <comments>https://jihyung1997.tistory.com/61#entry61comment</comments>
      <pubDate>Tue, 24 Mar 2026 16:32:48 +0900</pubDate>
    </item>
    <item>
      <title>[platinum3][해설, 분류 미확인] boj2315 가로등 끄기</title>
      <link>https://jihyung1997.tistory.com/60</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2315&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/2315&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1815&quot; data-origin-height=&quot;1323&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/At2eK/dJMcaaYWhXG/ekzbPUyPItL5BRMNzDwOY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/At2eK/dJMcaaYWhXG/ekzbPUyPItL5BRMNzDwOY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/At2eK/dJMcaaYWhXG/ekzbPUyPItL5BRMNzDwOY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAt2eK%2FdJMcaaYWhXG%2FekzbPUyPItL5BRMNzDwOY0%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;1815&quot; height=&quot;1323&quot; data-origin-width=&quot;1815&quot; data-origin-height=&quot;1323&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경계값을 잘 생각하고, 누적합 적용하면 그렇게 어렵진 않았었던 dp문제다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 마징가가 어떤 경향을 가지고 움직일지 생각해보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1763&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/96eJ3/dJMcajuNnt3/HiJgXAseJFcKkLJzfqb2M0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/96eJ3/dJMcajuNnt3/HiJgXAseJFcKkLJzfqb2M0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/96eJ3/dJMcajuNnt3/HiJgXAseJFcKkLJzfqb2M0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F96eJ3%2FdJMcajuNnt3%2FHiJgXAseJFcKkLJzfqb2M0%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;1763&quot; height=&quot;350&quot; data-origin-width=&quot;1763&quot; data-origin-height=&quot;350&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1661&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8c8tv/dJMcafspAoi/yVxhUrdyb0WDBdKP8GRGv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8c8tv/dJMcafspAoi/yVxhUrdyb0WDBdKP8GRGv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8c8tv/dJMcafspAoi/yVxhUrdyb0WDBdKP8GRGv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8c8tv%2FdJMcafspAoi%2FyVxhUrdyb0WDBdKP8GRGv1%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;1661&quot; height=&quot;400&quot; data-origin-width=&quot;1661&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;/figure&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;1. 왼쪽이동(파란색)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 오른쪽이동(초록색) : 이미 지나온 시작점에서 멈추는 것은 의미없다.&amp;nbsp; 즉 아래 경우는 고려하지 않는다. 켜진 불을 끄러가야 하기 때문에 이미 꺼진불은 고려할 필요가 없다. 따라서 켜진불이 있을 때까지 , 즉 오른쪽으로 5번까지 이동한다. (위에서 처럼)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1658&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UVjaL/dJMcabp20rf/Gmd3B20Lfjgh5owaNko3LK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UVjaL/dJMcabp20rf/Gmd3B20Lfjgh5owaNko3LK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UVjaL/dJMcabp20rf/Gmd3B20Lfjgh5owaNko3LK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUVjaL%2FdJMcabp20rf%2FGmd3B20Lfjgh5owaNko3LK%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;329&quot; height=&quot;80&quot; data-origin-width=&quot;1658&quot; data-origin-height=&quot;402&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;그다음 2번에 있을 경우, 아래와 같이 1번 또는 5번으로 이동할 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1827&quot; data-origin-height=&quot;444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/db5250/dJMcafspArS/zE8twJnb2lUGYeNjFyoP31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/db5250/dJMcafspArS/zE8twJnb2lUGYeNjFyoP31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/db5250/dJMcafspArS/zE8twJnb2lUGYeNjFyoP31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdb5250%2FdJMcafspArS%2FzE8twJnb2lUGYeNjFyoP31%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;1827&quot; height=&quot;444&quot; data-origin-width=&quot;1827&quot; data-origin-height=&quot;444&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단히 보면 &lt;b&gt;한번 움직일 때마다 켜진 불이 있을 때까지 좌 또는 우로 이동한다고 볼 수 있다 ! 또한 현재위치는 항상 그동안 꺼진 불의 집합( 빨간 체크) 의 맨왼쪽 or 맨 오른쪽에 존재한다는 것을 알 수 있다 !&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그렇다면, 경계값을 빨간체크 집합의 맨왼쪽 or 맨오른쪽으로 둘 수 있다.&amp;nbsp;&lt;/b&gt; 따라서 dp의 state는 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dp[idxL][idxR][0,1 (왼쪽 or 오른쪽]&amp;nbsp; = 낭비된 전력의 최솟값&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 유의해야 할 사항은 idxL ~ idxR 까지 모든 구간이 꺼져있다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경우를 따져가며&amp;nbsp; 점화식을 어떻게 세울지 생각해보자.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1829&quot; data-origin-height=&quot;469&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kEkZW/dJMcabDzffH/wFJJr6AhqWZpvEChmcGQQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kEkZW/dJMcabDzffH/wFJJr6AhqWZpvEChmcGQQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kEkZW/dJMcabDzffH/wFJJr6AhqWZpvEChmcGQQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkEkZW%2FdJMcabDzffH%2FwFJJr6AhqWZpvEChmcGQQK%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;1829&quot; height=&quot;469&quot; data-origin-width=&quot;1829&quot; data-origin-height=&quot;469&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 dp[2][5][0 (왼쪽)] 을 구하기 위한 경우들을 생각해보자.&amp;nbsp; &amp;nbsp;즉, dp[2][5][0] 에서 사람은 2에 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 왼쪽으로 계속 가고 잇었던 경우를 생각해보자.&amp;nbsp; &amp;nbsp; &amp;nbsp;이 경우는 dp[3][5][0] 인 상태에서 왼쪽으로 이동한 것이다. 이상태에서 3~ 2로 올때 소요시간 동안 , 구간(3~5)를 제외한 나머지 W의 합만큼 전력이 소모될 것이다,&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;dp[2][5][0] =&amp;nbsp; &amp;nbsp;(2~3사이&amp;nbsp; 소요 시간) * (3~5 제외 나머지 W 합)&amp;nbsp; + dp[3][5][0]&amp;nbsp; .&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 다음과 같은 경우도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1496&quot; data-origin-height=&quot;493&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qwdzQ/dJMcaaxTzBo/6arr7BSVOq3Xq4BYoEo7pk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qwdzQ/dJMcaaxTzBo/6arr7BSVOq3Xq4BYoEo7pk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qwdzQ/dJMcaaxTzBo/6arr7BSVOq3Xq4BYoEo7pk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqwdzQ%2FdJMcaaxTzBo%2F6arr7BSVOq3Xq4BYoEo7pk%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;1496&quot; height=&quot;493&quot; data-origin-width=&quot;1496&quot; data-origin-height=&quot;493&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3~5구간에서 오른쪽에 있었을 경우,&amp;nbsp; 5 -&amp;gt; 4 -&amp;gt; 3 -&amp;gt; 2 로 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;dp[2][5][0] =&amp;nbsp; &amp;nbsp;(2~5사이&amp;nbsp; 소요 시간) * (3~5 제외 나머지 W 합&amp;nbsp; =(1번, 2번 W합)&amp;nbsp; )&amp;nbsp; + dp[3][5][1( 오른쪽)]&amp;nbsp; .&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경미한 의심거리가 생긴다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dp[4][5][1] 에서도 2번까지 갈 수도 있지 않은가?&amp;nbsp; 굳이 dp[3][5][1]만 생각해야 하는가?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1422&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7kat4/dJMcabcsZYa/uMxfcjkKzLHW8Qm34pJHIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7kat4/dJMcabcsZYa/uMxfcjkKzLHW8Qm34pJHIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7kat4/dJMcabcsZYa/uMxfcjkKzLHW8Qm34pJHIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7kat4%2FdJMcabcsZYa%2FuMxfcjkKzLHW8Qm34pJHIk%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;1422&quot; height=&quot;450&quot; data-origin-width=&quot;1422&quot; data-origin-height=&quot;450&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 경우이다. 그런데 이런 상황은 고려할 필요가 없다.&amp;nbsp; dp[4][5][1] 에서 5 -&amp;gt;4-&amp;gt;3 순으로 가는데, 3번에 도착했을 때는&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dp[3][5][0] 인 상태이기 때문이다. 아래와 같다. 결국 dp[3][5][1] 외의 다른 dp[n][5][1]의 경우는 고려할 필요가 없는 것이다. 왼쪽으로 가다가 dp[3][5][0] 이 되기 때문이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1972&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k9hct/dJMcadVDfnK/v4cYCJawTmRShj4Szexc20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k9hct/dJMcadVDfnK/v4cYCJawTmRShj4Szexc20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k9hct/dJMcadVDfnK/v4cYCJawTmRShj4Szexc20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk9hct%2FdJMcadVDfnK%2Fv4cYCJawTmRShj4Szexc20%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;1972&quot; height=&quot;514&quot; data-origin-width=&quot;1972&quot; data-origin-height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 결과 적으로 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Case1:&amp;nbsp;&amp;nbsp; &amp;nbsp;(2~3사이&amp;nbsp; 소요 시간) * (3~5 제외 나머지 W 합 = (1,2번 W합))&amp;nbsp; + dp[3][5][0]&amp;nbsp; .&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;Case2:&amp;nbsp; &amp;nbsp;(2~5사이&amp;nbsp; 소요 시간) * (3~5 제외 나머지 W 합&amp;nbsp; =(1번, 2번 W합)&amp;nbsp; )&amp;nbsp; + dp[3][5][1( 오른쪽)]&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dp[2][5][0] = min(Case1, Case2).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 한가지는 dp[2][5][0] 을 구할 때,&amp;nbsp; dp[3][4][0] 과 같은 경우도 고려할 필요 없는가이다.&amp;nbsp; &amp;nbsp;그러나 아래의 왼쪽의 경우만 가능하다.오른쪽의 경우는 이미 2~5를 다껐는데 같은 구간을 한번더 되돌아오는 것이므로 불가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왼쪽의 경우는 결국 dp[3][5][1] 에서 출발하는 셈이 되므로, 고려할 필요 없다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvBG9H/dJMcaaLqeeF/rLSOpGyz17KDNQgWsvOom0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvBG9H/dJMcaaLqeeF/rLSOpGyz17KDNQgWsvOom0/img.png&quot; data-origin-width=&quot;1563&quot; data-origin-height=&quot;430&quot; data-is-animation=&quot;false&quot; style=&quot;width: 50.74%; margin-right: 10px;&quot; data-widthpercent=&quot;51.34&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvBG9H/dJMcaaLqeeF/rLSOpGyz17KDNQgWsvOom0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvBG9H%2FdJMcaaLqeeF%2FrLSOpGyz17KDNQgWsvOom0%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;1563&quot; height=&quot;430&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dStho8/dJMcajhfcaG/g65kWq8rkLYMRrZkxMfIp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dStho8/dJMcajhfcaG/g65kWq8rkLYMRrZkxMfIp1/img.png&quot; data-origin-width=&quot;1709&quot; data-origin-height=&quot;496&quot; data-is-animation=&quot;false&quot; style=&quot;width: 48.0972%;&quot; data-widthpercent=&quot;48.66&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dStho8/dJMcajhfcaG/g65kWq8rkLYMRrZkxMfIp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdStho8%2FdJMcajhfcaG%2Fg65kWq8rkLYMRrZkxMfIp1%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;1709&quot; height=&quot;496&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 dp[2][5][0] 은&amp;nbsp; dp[3][5][0] , dp[3][5][1] 만 고려하면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;dp[2][5][1] 도 마찬가지로 정확히 좌우 대칭을 해서 생각하면 된다.&amp;nbsp; dp[2][4][0] , dp[2][4][1] 만 생각하면 될 것이다.&lt;/b&gt;&lt;/p&gt;</description>
      <category>알고리즘/baekjoon(boj)</category>
      <category>boj2315</category>
      <category>백준 2315</category>
      <category>백준 가로등 끄기</category>
      <author>끄응끄응</author>
      <guid isPermaLink="true">https://jihyung1997.tistory.com/60</guid>
      <comments>https://jihyung1997.tistory.com/60#entry60comment</comments>
      <pubDate>Mon, 23 Mar 2026 16:19:24 +0900</pubDate>
    </item>
    <item>
      <title>[platinum3][해설,분류 미확인] 24515 히히 못가</title>
      <link>https://jihyung1997.tistory.com/59</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/24515&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/24515&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1941&quot; data-origin-height=&quot;1898&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yYEIl/dJMcag6ms74/rQEJVk8EyiYejs3zE9REOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yYEIl/dJMcag6ms74/rQEJVk8EyiYejs3zE9REOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yYEIl/dJMcag6ms74/rQEJVk8EyiYejs3zE9REOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyYEIl%2FdJMcag6ms74%2FrQEJVk8EyiYejs3zE9REOK%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;1941&quot; height=&quot;1898&quot; data-origin-width=&quot;1941&quot; data-origin-height=&quot;1898&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;소마 면접 준비로 너무 바빠서 브론즈로 스트릭을 연명하였고... 드디어 면접이 끝나 문제풀이를 시작할 수 있게 되었다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;나름 면접에서 내 장점을 어필하려고 최선을 다했고, 워낙 대단한 분들이 많기 때문에 결과가 어떻든 납득할 수 있을 것 같다...&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;매우 특이한 다익스트라 문제였다. 처음엔 dp 인줄 알고 경계값 문제로 고민했지만... 생각해보니 다익으로 간단히 (구현은 힘들지만) 해결 가능하다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;우선 R은 좌측 맨위, J&amp;nbsp; 는 우측 맨아래에 있는데 이둘을 못만나게 하려면 어떻게 이어야 할까?&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; 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;763&quot; data-origin-height=&quot;725&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mEu2A/dJMcahcGMKU/WRSeckvKKRJ4FXcwCdkrXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mEu2A/dJMcahcGMKU/WRSeckvKKRJ4FXcwCdkrXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mEu2A/dJMcahcGMKU/WRSeckvKKRJ4FXcwCdkrXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmEu2A%2FdJMcahcGMKU%2FWRSeckvKKRJ4FXcwCdkrXk%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;489&quot; height=&quot;465&quot; data-origin-width=&quot;763&quot; data-origin-height=&quot;725&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파란 집합 중 아무 점에서 시작하고, 빨간 집합 중 아무 점으로 도착하면&amp;nbsp; 무조건 R , J 를 나눌 수 있다.&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;그렇다면, R , J 를 나눌 수 있는 영역들은 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.파란 점들 중 아무거나 포함한 영역&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 빨간 점들 중 아무거나 포함한 영역&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 1번과 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;1 + 2 + 3 의 영역이면 R, J를 나눌 수 있을 것이다.&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; 그리고 1번 2번 3번의 모든 영역들은 모두 연결되어 있어야 한다....&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이 부분에서 직관적으로 다익스트라가 떠오를 수 있다.&amp;nbsp; &amp;nbsp;한 영역에서 다른 영역으로 가는 것은 간선으로 생각하고, 그때의 간선의 비용은 다른영역의 넓이 라고 생각할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그림으로 한번에 보면 이렇다. 4,5,9 에 대해서만 생각해보면 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HCoxp/dJMb99MtjZq/mK3iFpk2j7UhXChkHLQtq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HCoxp/dJMb99MtjZq/mK3iFpk2j7UhXChkHLQtq1/img.png&quot; data-origin-width=&quot;223&quot; data-origin-height=&quot;439&quot; data-is-animation=&quot;false&quot; style=&quot;width: 35.3547%; margin-right: 10px;&quot; data-widthpercent=&quot;35.77&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HCoxp/dJMb99MtjZq/mK3iFpk2j7UhXChkHLQtq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHCoxp%2FdJMb99MtjZq%2FmK3iFpk2j7UhXChkHLQtq1%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;223&quot; height=&quot;439&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAAE6u/dJMcaiCEyz1/y6url0QhodOruroEAaHKO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAAE6u/dJMcaiCEyz1/y6url0QhodOruroEAaHKO0/img.png&quot; data-origin-width=&quot;467&quot; data-origin-height=&quot;512&quot; data-is-animation=&quot;false&quot; style=&quot;width: 63.4825%;&quot; data-widthpercent=&quot;64.23&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAAE6u/dJMcaiCEyz1/y6url0QhodOruroEAaHKO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAAE6u%2FdJMcaiCEyz1%2Fy6url0QhodOruroEAaHKO0%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;467&quot; height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;794&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJjFj5/dJMcaduxhfL/fxVLaTdpPY0yZtItJjiBE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJjFj5/dJMcaduxhfL/fxVLaTdpPY0yZtItJjiBE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJjFj5/dJMcaduxhfL/fxVLaTdpPY0yZtItJjiBE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJjFj5%2FdJMcaduxhfL%2FfxVLaTdpPY0yZtItJjiBE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;715&quot; height=&quot;794&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;794&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 pq에는 파란 점을 포함하는 1번, 2번 , 6번 영역을 넣고 시작하고 초기 Cost는 각각 7 , 4 , 4&amp;nbsp; 이다. 그 후 위와 같이 각 영역을 노드로 두고, 다음 영역으로 갈때와, 그때의 비용 (다음 영역의 넓이) 를 간선비용으로 취급하고 다익스트라를 실행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도착지점은&amp;nbsp; 영역 3 , 8 , 9 , 7&amp;nbsp; 중 아무곳이나 도착하면 종료. 그때가 최소 비용으로 R , J 를 분리시킬 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 시작지점과 도착지점이 지정되어 있고, 그 사이를 모두 이어야 하며,&amp;nbsp; 각 영역 사이의 관계는 그래프로 나타낼 수 있으므로, 다익스트라로 구할 수 있는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;신박한 다익스트라 문제였다.&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘/baekjoon(boj)</category>
      <category>boj24515</category>
      <category>백준 히히 못가</category>
      <category>백준24515</category>
      <author>끄응끄응</author>
      <guid isPermaLink="true">https://jihyung1997.tistory.com/59</guid>
      <comments>https://jihyung1997.tistory.com/59#entry59comment</comments>
      <pubDate>Mon, 23 Mar 2026 01:53:57 +0900</pubDate>
    </item>
    <item>
      <title>[platinum3][해설, 분류 미확인] 10919 선물상자</title>
      <link>https://jihyung1997.tistory.com/58</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2232&quot; data-origin-height=&quot;1755&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qOF9F/dJMcadBIfIj/dCeqPLKFH6VDCDe9fXIej1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qOF9F/dJMcadBIfIj/dCeqPLKFH6VDCDe9fXIej1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qOF9F/dJMcadBIfIj/dCeqPLKFH6VDCDe9fXIej1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqOF9F%2FdJMcadBIfIj%2FdCeqPLKFH6VDCDe9fXIej1%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;2232&quot; height=&quot;1755&quot; data-origin-width=&quot;2232&quot; data-origin-height=&quot;1755&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1414&quot; data-origin-height=&quot;1737&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bymffS/dJMb990uYh6/K2xxhZqx5AgFCNk2UrAoPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bymffS/dJMb990uYh6/K2xxhZqx5AgFCNk2UrAoPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bymffS/dJMb990uYh6/K2xxhZqx5AgFCNk2UrAoPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbymffS%2FdJMb990uYh6%2FK2xxhZqx5AgFCNk2UrAoPK%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;1059&quot; height=&quot;1301&quot; data-origin-width=&quot;1414&quot; data-origin-height=&quot;1737&quot;/&gt;&lt;/span&gt;&lt;/figure&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;우선 아이디어를 생각해보자. N 이 10000000이라는걸&amp;nbsp; 보자마자 원형 애드훅?이라는 건 직감했는데, 이걸 어떻게 해결할지 생각하는게 쉽지 않았다. (사실 순수 애드훅도 아니였다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선&amp;nbsp; 선물을 배달할 때 한바퀴를 돌지, 반바퀴 (N / 2)되는 지점 전 까지만 돌고 다시 돌아갈지 구분해야 겠다는 생각은 금방 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 이유는 어렵지 않다. 우선 반바퀴 이상을 도는 순간,&amp;nbsp; 밑 처럼 시계방향 으로 순회할 때 5번까지 갔다면, 다시 반시계로 돌아가는 것보다(파란색) 그대로 시계방향으로 한바퀴(초록색) 으로 도는게 빠르기 때문이다.&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;821&quot; data-origin-height=&quot;627&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/U41GM/dJMb996G4Ar/7ZsyNBGkKvvdV6KYBUHtlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/U41GM/dJMb996G4Ar/7ZsyNBGkKvvdV6KYBUHtlk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/U41GM/dJMb996G4Ar/7ZsyNBGkKvvdV6KYBUHtlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FU41GM%2FdJMb996G4Ar%2F7ZsyNBGkKvvdV6KYBUHtlk%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;821&quot; height=&quot;627&quot; data-origin-width=&quot;821&quot; data-origin-height=&quot;627&quot;/&gt;&lt;/span&gt;&lt;/figure&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;아래에처럼 배치되어 있고, K = 1 이라면 아래처럼 배달하게 될 것이다. 5번에서는 1,2,3번과 다른 방향으로 왕복하는 이유는 한바퀴를 돌지 않는다는 가정하이기 때문이다. (01,2,3,4,5 번 순으로 오면 결국 6,7,8로 돌아가 한바퀴 돌기때문)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;762&quot; data-origin-height=&quot;627&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsMf8m/dJMcagY15VY/Ymsjw6I54FMOsOxaDbyKjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsMf8m/dJMcagY15VY/Ymsjw6I54FMOsOxaDbyKjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsMf8m/dJMcagY15VY/Ymsjw6I54FMOsOxaDbyKjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsMf8m%2FdJMcagY15VY%2FYmsjw6I54FMOsOxaDbyKjK%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;762&quot; height=&quot;627&quot; data-origin-width=&quot;762&quot; data-origin-height=&quot;627&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;결국, 시계방향으로 왕복하던, 반시계로 왕복하던, half를 넘냐 안넘냐가 관건이다. half를 넘는 순간, 한바퀴를 돌게 되는 것이고, 한바퀴를 한번도 안돌때는 위처럼 half기준으로 위치한 기준에 따라 시계 반시계 방향이 정해진다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼이제 저렇게 half 를 넘기전으로 왕복할 때는 어떻게 할 것인가? 이 부분은 어렵지 않다.&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;1065&quot; data-origin-height=&quot;1006&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuPMQO/dJMcabcluZx/rMZgMXSGd1nXRDsPDXvL7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuPMQO/dJMcabcluZx/rMZgMXSGd1nXRDsPDXvL7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuPMQO/dJMcabcluZx/rMZgMXSGd1nXRDsPDXvL7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuPMQO%2FdJMcabcluZx%2FrMZgMXSGd1nXRDsPDXvL7K%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;411&quot; height=&quot;388&quot; data-origin-width=&quot;1065&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;gt;반시계로 왕복한다고 치면 어떻게 이동할 것인가?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;K = 2 일때 위에 처럼 원점에 가까운 순서대로 묶으면서 갈 수도 있겠지만, 이는 최선의 선택이 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최선의 선택은 가장 먼 거리 (이를테면 4번 , 5번) 왕복을 최소화 하기 때문에, 먼 거리부터 2개씩 묶어서 왕복하는게 최선이다. 어떻게 보면 그리디 하다고 할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1072&quot; data-origin-height=&quot;1038&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/leJSE/dJMcagSh4ev/5HMm48YKjo7D6ulk3yglyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/leJSE/dJMcagSh4ev/5HMm48YKjo7D6ulk3yglyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/leJSE/dJMcagSh4ev/5HMm48YKjo7D6ulk3yglyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FleJSE%2FdJMcagSh4ev%2F5HMm48YKjo7D6ulk3yglyk%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;386&quot; height=&quot;374&quot; data-origin-width=&quot;1072&quot; data-origin-height=&quot;1038&quot;/&gt;&lt;/span&gt;&lt;/figure&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; i번째에서 i , i - 1 ... i - K + 1 개를 묶을 때, 이때 이동 거리는&amp;nbsp; 2 * Distance[i] 가 된다 . (Distance[i] : 0부터 i까지 거리)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 위의 경우 4,5번을 묶는다면&amp;nbsp; 0~5번까지 2번 왕복하는 것이다.&amp;nbsp; 그러면&amp;nbsp; i - K , 위에서는 3번째 부터 0 번째까지는 이미 계산해 놓은 대로 카운트가 되있을 것이다. 여기서 어렵지 않게 Dp를 생각할 수 있고,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;점화식은 dp[i] = 2 * Distance[i] - dp[i - K] 가 된다.왼쪽에 대해선 저렇게 했으니, 오른쪽도 마찬가지로 점화식을 이용해 Dp를 구할 수 있다.&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; Ldp[3] + Rdp[2] 가 답이 될 것이다.&amp;nbsp; (half를 넘기는 일은 없으므로)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;707&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LRGCg/dJMcaduqlXA/X5gvk7XTEDhWiueX3N4fvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LRGCg/dJMcaduqlXA/X5gvk7XTEDhWiueX3N4fvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LRGCg/dJMcaduqlXA/X5gvk7XTEDhWiueX3N4fvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLRGCg%2FdJMcaduqlXA%2FX5gvk7XTEDhWiueX3N4fvK%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;934&quot; height=&quot;707&quot; data-origin-width=&quot;934&quot; data-origin-height=&quot;707&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 이제 진짜 문제는&amp;nbsp; 한바퀴를 도는 경우가 있을 때이다. 한 바퀴를 돌때는 어떻게 해야 할까?&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 이걸 고민하기 전에 왜 한바퀴를 돌아야 하는 가를 생각해야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byQR5V/dJMcafy5ugd/NlejYTK27SLWRpgNI8saGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byQR5V/dJMcafy5ugd/NlejYTK27SLWRpgNI8saGk/img.png&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;756&quot; data-is-animation=&quot;false&quot; style=&quot;width: 48.6008%; margin-right: 10px;&quot; data-widthpercent=&quot;49.17&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byQR5V/dJMcafy5ugd/NlejYTK27SLWRpgNI8saGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyQR5V%2FdJMcafy5ugd%2FNlejYTK27SLWRpgNI8saGk%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;687&quot; height=&quot;756&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cb7ZDR/dJMcabQXA11/kxZH279VGCVqYO8pO1u8lk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cb7ZDR/dJMcabQXA11/kxZH279VGCVqYO8pO1u8lk/img.png&quot; data-origin-width=&quot;712&quot; data-origin-height=&quot;758&quot; data-is-animation=&quot;false&quot; style=&quot;width: 50.2364%;&quot; data-widthpercent=&quot;50.83&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cb7ZDR/dJMcabQXA11/kxZH279VGCVqYO8pO1u8lk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcb7ZDR%2FdJMcabQXA11%2FkxZH279VGCVqYO8pO1u8lk%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;712&quot; height=&quot;758&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 있고 K = 3 이라고 생각해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 한바퀴를 돌지 않고,&amp;nbsp; (1,2,3) , (4,5)&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;이렇듯 half지점을 지나며, 존재하는 팀들을 묶을 때는 한바퀴 도는게 유리할 수도 있다. ( 물론 상황에 따라 유리하지 않을 수도 있다.) 한바퀴 돈다는 것은 모든 좌 또는 우 왕복 보다 더 거리가 멀다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;701&quot; data-origin-height=&quot;795&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyuAlE/dJMcabXJ7Cj/k4znNQH9TYroY2RTKYXfh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyuAlE/dJMcabXJ7Cj/k4znNQH9TYroY2RTKYXfh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyuAlE/dJMcabXJ7Cj/k4znNQH9TYroY2RTKYXfh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyuAlE%2FdJMcabXJ7Cj%2Fk4znNQH9TYroY2RTKYXfh0%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;701&quot; height=&quot;795&quot; data-origin-width=&quot;701&quot; data-origin-height=&quot;795&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 여기서 당연히 떠오르는 의문이 있다. 2바퀴, 3바퀴는 어떤가?&amp;nbsp; 아래처럼 만약 K = 4 이고, L 이 매우큰데, 선물받을 사람이 half중심으로 오밀조밀 배치되어 있으면, 2바퀴를 돌아야 겠다는 생각이 들 수도 있다. 그러나 그렇지 않다. 아래의 경우 2바퀴를 돌게되면 오른쪽 처럼 2개로 묶이게 될텐데, (2바퀴돌며 8개를 전달하게 되므로) 그럼 한 묶음은 half를 넘지 않게 된다. 즉 , 이 묶음일때는 한 바퀴를 돌지 않고, 왕복만 하는게 더 최적이라는 것이다.&amp;nbsp; &amp;nbsp; 쉽게 말하면 한바퀴를 돌게 되는경우는 half를 포함하게 되는 경우인데, half를 포함하는 묶이는 경우는 딱한번 밖에 없으므로 한바퀴만 돌 수 있다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BAv9I/dJMcaibvT4M/qDKBqBBiEOkiZumGfipB9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BAv9I/dJMcaibvT4M/qDKBqBBiEOkiZumGfipB9K/img.png&quot; data-origin-width=&quot;1326&quot; data-origin-height=&quot;1152&quot; data-is-animation=&quot;false&quot; width=&quot;435&quot; height=&quot;378&quot; style=&quot;width: 51.7712%; margin-right: 10px;&quot; data-widthpercent=&quot;52.38&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BAv9I/dJMcaibvT4M/qDKBqBBiEOkiZumGfipB9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBAv9I%2FdJMcaibvT4M%2FqDKBqBBiEOkiZumGfipB9K%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;1326&quot; height=&quot;1152&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYcTVT/dJMcaf6TFDC/HEOrjBNjrIxWGkWlDGX0xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYcTVT/dJMcaf6TFDC/HEOrjBNjrIxWGkWlDGX0xk/img.png&quot; data-origin-width=&quot;1217&quot; data-origin-height=&quot;1163&quot; data-is-animation=&quot;false&quot; style=&quot;width: 47.066%;&quot; data-widthpercent=&quot;47.62&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYcTVT/dJMcaf6TFDC/HEOrjBNjrIxWGkWlDGX0xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYcTVT%2FdJMcaf6TFDC%2FHEOrjBNjrIxWGkWlDGX0xk%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;1217&quot; height=&quot;1163&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 1바퀴 초과는 돌지 않게 된다는 것을 알게 되었다. 한바퀴를 돌때는 다음과 같이 4가지의 경우로 묶일 수 있다. (K = 4 )인 경우&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1219&quot; data-origin-height=&quot;1119&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p0k39/dJMcah4Jq8D/ibx1f9N0pphKsOlX7MHkX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p0k39/dJMcah4Jq8D/ibx1f9N0pphKsOlX7MHkX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p0k39/dJMcah4Jq8D/ibx1f9N0pphKsOlX7MHkX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp0k39%2FdJMcah4Jq8D%2Fibx1f9N0pphKsOlX7MHkX0%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;681&quot; height=&quot;625&quot; data-origin-width=&quot;1219&quot; data-origin-height=&quot;1119&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; 그럼 각각의 묶인 경우,&amp;nbsp; 다음과 같이 묶였을 경우&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;result =&amp;nbsp; 한바퀴 + Ldp[i - 1] + Rdp[i + K - 1-1]&amp;nbsp; 로 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게&amp;nbsp; K 가지의 경우의 result를 따지며,&amp;nbsp; result의 최솟값을 구한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1230&quot; data-origin-height=&quot;1151&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ldhwn/dJMcaiWPfIt/oLN4PklIgO2q3fmV9FoRrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ldhwn/dJMcaiWPfIt/oLN4PklIgO2q3fmV9FoRrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ldhwn/dJMcaiWPfIt/oLN4PklIgO2q3fmV9FoRrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fldhwn%2FdJMcaiWPfIt%2FoLN4PklIgO2q3fmV9FoRrK%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;1230&quot; height=&quot;1151&quot; data-origin-width=&quot;1230&quot; data-origin-height=&quot;1151&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 , 한바퀴를 아예 안돌때의 경우도 고려해 result = LDP[i] + RDp[i + 1] 의 경우의 최솟값도 구해야 한다. (편의상 인덱싱은 신경쓰지 않았다.)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하자면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.각 시계방향 반시계방향으로의 dp를 계산하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. half를 포함하는&amp;nbsp; K 개끼리의 묶음을 구했을 때 그 묶음의 좌우에 대한 dp + 한바퀴를 고려하고 (한바퀴 돌때)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.한점&amp;nbsp; i 의 좌우에 대한 dp를 고려하면 (한바퀴 안돌때)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최솟값을 구할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아이디어가 떠올랐다고 하여도, 전달 좌표가 0에 있을 때는 dp를 고려하지 않고, 그렇게 됬을 때 K가 전체 전달 장소 수보다 클때는 좌우 DP를 고려하지 않는등 수많은 예외사항이 기다리고 있다. 해결하느라 밤새 애를 먹었다. 다시는 보지말자...&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>알고리즘/baekjoon(boj)</category>
      <category>boj10919 선물상자</category>
      <category>백준 10919 선물상자</category>
      <author>끄응끄응</author>
      <guid isPermaLink="true">https://jihyung1997.tistory.com/58</guid>
      <comments>https://jihyung1997.tistory.com/58#entry58comment</comments>
      <pubDate>Fri, 13 Mar 2026 18:47:59 +0900</pubDate>
    </item>
    <item>
      <title>[platinum3] [풀이,분류 미확인]boj8903 장비</title>
      <link>https://jihyung1997.tistory.com/57</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2039&quot; data-origin-height=&quot;1930&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6Qtvr/dJMcahc7My1/16T14j2YkGRkVGckztJWH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6Qtvr/dJMcahc7My1/16T14j2YkGRkVGckztJWH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6Qtvr/dJMcahc7My1/16T14j2YkGRkVGckztJWH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6Qtvr%2FdJMcahc7My1%2F16T14j2YkGRkVGckztJWH0%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;2039&quot; height=&quot;1930&quot; data-origin-width=&quot;2039&quot; data-origin-height=&quot;1930&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;이 문제는 플레 3치곤 생각보다 쉬웠다. 비트마스킹 + 브루트포스로 접근이 가능하기도 하고 (최대 열크기가 5이하이기 때문)&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;우선 K = 5일때 생각해보자.&lt;/p&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;basic&quot; style=&quot;background-color: #f7f7f9; color: #333333; text-align: start;&quot;&gt;&lt;code&gt;4 2
30 30 30 30 0
50 0 0 0 0
0 50 0 50 10
0 0 50 0 20&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같은 경우&amp;nbsp; &amp;nbsp;1열 ~5열까지 돌면서 그대의 최댓값일때의 행의 장비를 선택하면 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 1열, 4열이 둘다 그 열에서 최댓값이면? 개의치 않아도 된다. 2열, 4열 이 최댓값이라, 1,3,5열에서 각각 장비를 하나씩 선택하면 장비를 4개 선택했는데, 이때가 최대이므로, 나머지 한개는 아무거나 선택하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 K &amp;gt; 5 일 경우엔? K= 5일때도 최댓값을 선택할 수 있는데 K &amp;gt; 5 일땐 고민할 필요도 없이 각열마다 최댓값을 뽑으면 된다.&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-origin-width=&quot;457&quot; data-origin-height=&quot;472&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8IWiz/dJMcacPQeft/7w0KEZr5Gf22xGkLZIn7EK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8IWiz/dJMcacPQeft/7w0KEZr5Gf22xGkLZIn7EK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8IWiz/dJMcacPQeft/7w0KEZr5Gf22xGkLZIn7EK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8IWiz%2FdJMcacPQeft%2F7w0KEZr5Gf22xGkLZIn7EK%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;457&quot; height=&quot;472&quot; data-origin-width=&quot;457&quot; data-origin-height=&quot;472&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;그럼이제 K = 4일때는 어떻게 해야 할까? 여기선 문제가 좀 있다. 4개만 뽑을 수 있으므로, 일단 장비3개는 각열마다 최댓값을 뽑을 수 있는데 , 나머지 1개는 어떻게 해야 할까?&amp;nbsp; 바로 2개열의 합의 최댓값을 구하는 것이다. 다음과 같이 3,4,5열을 각 한열의 최댓값을 뽑았을 경우, 나머지 1열,2열의 합의 최댓값을 뽑아야 한다.&amp;nbsp; 즉 5C3(5개중 3개열 선택) 해서 이때는 한개의 열의 최댓값, 나머지 열은 두개의 열 합의 최댓값 을 구하면 된다.&amp;nbsp; 즉 완전탐색으로 구하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;376&quot; data-origin-height=&quot;422&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dVR3Gt/dJMcagYZz3W/qpFVsoXczVKcuw3ZKW3kd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dVR3Gt/dJMcagYZz3W/qpFVsoXczVKcuw3ZKW3kd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dVR3Gt/dJMcagYZz3W/qpFVsoXczVKcuw3ZKW3kd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdVR3Gt%2FdJMcagYZz3W%2FqpFVsoXczVKcuw3ZKW3kd1%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;376&quot; height=&quot;422&quot; data-origin-width=&quot;376&quot; data-origin-height=&quot;422&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;그러면 K = 3일때는?&amp;nbsp; 이때는 조건이 좀 많아진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(2,2,1)&amp;nbsp; :&amp;nbsp; &amp;nbsp;열2개 합 Max + 열2개합Max + 열1개합Max -&amp;gt; 5C2 * 3C2 1C1 / 2! :&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(3,1,1)&amp;nbsp; &amp;nbsp; -&amp;gt; 5C3 * 2C1 * 1C1 / 2!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런식으로 구하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 우선 할 일은 모든 경우의 수 즉 00000 , 00001 , 00010 , 00011&amp;nbsp; ... 11111 모든 경우의 수에 대한 열의 합의 값을 만드는 것이다. 즉 O(2^5&amp;nbsp; * 10000 ) 이 될 것이다. 위의 경우&amp;nbsp; bitMax[10001] = 50, bitMax[01010] = 100&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;또한 이제 K 일때&amp;nbsp; 1~K까지 의 5자리 비트에 대해 합이 11111이 되도록 하는 모든 경우의 수를 구한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시로 K = 2 이면, b[0] = 10111 b[1] = 01000 or b[0] = 10000 b[1] = 011111 이런 식으로 말이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것또한 백트래킹으로 구했다. 그 뒤, B1, B2 , ... Bk 의 비트들에 대해&amp;nbsp; bitMax[Bk] 의 값들의 총합을 구하고 이값의&amp;nbsp; 총합이 답이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1945&quot; data-origin-height=&quot;384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bj1v7P/dJMcacCjxbD/W3hBoEAntAGCbqRGPNxqdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bj1v7P/dJMcacCjxbD/W3hBoEAntAGCbqRGPNxqdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bj1v7P/dJMcacCjxbD/W3hBoEAntAGCbqRGPNxqdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbj1v7P%2FdJMcacCjxbD%2FW3hBoEAntAGCbqRGPNxqdk%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;1945&quot; height=&quot;384&quot; data-origin-width=&quot;1945&quot; data-origin-height=&quot;384&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유일한 자바 정답자!!&lt;/p&gt;</description>
      <category>알고리즘/baekjoon(boj)</category>
      <category>boj 8903</category>
      <category>백준 8903</category>
      <category>백준 8903 장비</category>
      <author>끄응끄응</author>
      <guid isPermaLink="true">https://jihyung1997.tistory.com/57</guid>
      <comments>https://jihyung1997.tistory.com/57#entry57comment</comments>
      <pubDate>Tue, 10 Mar 2026 18:51:20 +0900</pubDate>
    </item>
    <item>
      <title>[platinum3][풀이, 분류 미확인] boj5461 고용</title>
      <link>https://jihyung1997.tistory.com/56</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1755&quot; data-origin-height=&quot;1554&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6vyfD/dJMcacpmoiR/K4yBNfbcBolkpZkn3kjmGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6vyfD/dJMcacpmoiR/K4yBNfbcBolkpZkn3kjmGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6vyfD/dJMcacpmoiR/K4yBNfbcBolkpZkn3kjmGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6vyfD%2FdJMcacpmoiR%2FK4yBNfbcBolkpZkn3kjmGk%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;1755&quot; height=&quot;1554&quot; data-origin-width=&quot;1755&quot; data-origin-height=&quot;1554&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재미있는 우선순위 큐 문제였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사람마다 최저 임금 Si와 기술 비용 Qi 가 있을 때 , Qi * K&amp;nbsp; 를 했을 때 최저임금을 넘어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데, 모든 사람에게는 K가 같아야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 사람마다&amp;nbsp; Ki = Si / Qi 라고 하면,&amp;nbsp; 그 사람의 비용 &amp;gt;= Qi * Ki = Si&amp;nbsp; 가 되어야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;각 사람마다 Ki가 다를 수 있는데, 이 문제에선 K가 모든 사람에게 동일하게 적용되어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Qi * K&amp;nbsp; = i번째 사람의 비용 이기 때문이다.&amp;nbsp; &amp;nbsp; 즉 모든 사람에겐 동일한 K값이 주어지므로, K는 뽑은 사람중 K값이 가장 큰 사람의 값이어야 한다.&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;692&quot; data-origin-height=&quot;304&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dAiDDF/dJMcadA7MN1/IuDeSexvVAmqaRR1ZNIvf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dAiDDF/dJMcadA7MN1/IuDeSexvVAmqaRR1ZNIvf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dAiDDF/dJMcadA7MN1/IuDeSexvVAmqaRR1ZNIvf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdAiDDF%2FdJMcadA7MN1%2FIuDeSexvVAmqaRR1ZNIvf1%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;692&quot; height=&quot;304&quot; data-origin-width=&quot;692&quot; data-origin-height=&quot;304&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 예시가 있을 K는 3.5가 될 것이다. K가 3.5보다 작으면 사람3의 최소비용이 충족되지 않기 때문이다.&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;즉 사람을 뽑았을 때 뽑은 사람들의 Ki중 최댓값을 고려해야 할 것이다.&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;총 비용은 (Qi 총합 ) * (Ki 최댓값) 이 될 것이다.&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; 생각은 모든 사람들의 Ki값들을 오름차순으로 정렬한 후, 반복문을 돌며 i번째 사람들중 Qi값을 고려하면 될 것이라는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;i 번째에서 Ki의 값은&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;K1 ~ Ki-1 값보다 크기 때문에, 무조건 Ki가 최댓값이고, 그렇다면, 이제 총 비용은 (Qi총합) *(Ki최댓값)인데 Ki 최댓값은 정해졌으므로, Qi만 고려하면 된다는 생각이다. 그럼 이제 사람수를 최대로 하면서, 사람수가 같다면 Qi의 총합을 최소로 해야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이것은 우선순위 큐로 해결이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;i번째에서 Q의 값을 내림차순으로 설정한 우선순위큐 (qpq 라 한다). 가 있으면, 일단 i번째의 Qi값을 qpq에 넣는다. 그럼 이대 넣었을 때 Qi의 총합 * (K의 최댓값) &amp;gt; W(가지고 있는 돈의 최댓값) 이라면&amp;nbsp; pqp에서 한개를 poll한다. 그럼 제일 큰 Q값이빠지므로, 무조건 W보다 작거나 같아진다. Qi의 총합 * (K의 최댓값) &amp;lt;= W&amp;nbsp; 라면 pqp를 poll하지 않는다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 이제 qpq의 사이즈가 i번째에서 가능한 최대로 고를 수 있는 사람의 수가 된다.&amp;nbsp; 1~K번째까지의 사람들 중 Q가 가장 작은 순서대로, Q의 총합이&amp;nbsp; (W) / Ki 까지일때의 사람들만 pqp에 남았기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 i 번째에서&amp;nbsp; 사람의 최댓값을 얻을 수 있고, 만약 최댓값이 기존의 최댓값과 같다면 기존의 pqp의 총합 * 기존의 K최댓값 과 비교해 비용이 낮은 것을 답으로 하면 된다.&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; 첫번 째 pq에선 최대 사람수,&amp;nbsp; 그대의 최소 비용을 구한후,&amp;nbsp; 같은 원리의 pq를 다시한번 반복하다가 이미 구한 최대사람수, 최소 비용이 나오면 정답의 pqp에 있는 사람들을 출력하도록 하였다. 또한 k는 정수가 아닐 수도 있으므로, k끼리 비교시 (S1 / Q1 &amp;gt; S2 / Q2)시 (S1 * Q2 &amp;gt; S2 * Q1)식으로 분모가 없도록 비교하였다.(이때 오버플로우&amp;nbsp; 조심하자)&lt;/p&gt;</description>
      <category>알고리즘/baekjoon(boj)</category>
      <category>boj5461</category>
      <category>백준 5461 고용</category>
      <category>백준5461</category>
      <author>끄응끄응</author>
      <guid isPermaLink="true">https://jihyung1997.tistory.com/56</guid>
      <comments>https://jihyung1997.tistory.com/56#entry56comment</comments>
      <pubDate>Mon, 9 Mar 2026 16:55:09 +0900</pubDate>
    </item>
    <item>
      <title>[platinum4] [풀이, 분류 미확인]16156 장애물 달리기</title>
      <link>https://jihyung1997.tistory.com/55</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1747&quot; data-origin-height=&quot;1756&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceJxoH/dJMcaaqWa3d/KWVheE9lN5k08HFK2EXlMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceJxoH/dJMcaaqWa3d/KWVheE9lN5k08HFK2EXlMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceJxoH/dJMcaaqWa3d/KWVheE9lN5k08HFK2EXlMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceJxoH%2FdJMcaaqWa3d%2FKWVheE9lN5k08HFK2EXlMk%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;1747&quot; height=&quot;1756&quot; data-origin-width=&quot;1747&quot; data-origin-height=&quot;1756&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제의 어려운 점은 어떻게 처음에 잘 시작해서 다익스트라를 한번만 돌려 끝낼 것이냐 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막 열은 어떤 행이든 , 도착만 하면 끝나므로 마지막 열들의 점들을 (1,4) (2,4) ... 한점으로 생각해도 될 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 마지막 열부터 시작해서 (1,1), (2,1) (3,1 ).... (N, 1)들에 도착할때의 최단 경로들을 카운트하면 다익스트라를 한번만 돌려도 될 것이다.&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;651&quot; data-origin-height=&quot;662&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8NpKT/dJMcaadpnJB/kyLBLedeWrS4UHYxUBK2j1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8NpKT/dJMcaadpnJB/kyLBLedeWrS4UHYxUBK2j1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8NpKT/dJMcaadpnJB/kyLBLedeWrS4UHYxUBK2j1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8NpKT%2FdJMcaadpnJB%2FkyLBLedeWrS4UHYxUBK2j1%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;651&quot; height=&quot;662&quot; data-origin-width=&quot;651&quot; data-origin-height=&quot;662&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 마지막열에서 그 전열까지의 경로는 초록색 경로는 되지만, 빨간색 경로는 불가능 하다. (1,4)에서 시작하던 (3,4)에서 시작하던, 상관 없는데 굳이 (3,4) 에서 (2,4) -&amp;gt; (1,4) -&amp;gt; (1,3) 을 거쳐가며 구할 필요는 없다.&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-origin-width=&quot;596&quot; data-origin-height=&quot;585&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uThTw/dJMcac3jYs0/eqAhGmuGLqmcMlHus0s1lk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uThTw/dJMcac3jYs0/eqAhGmuGLqmcMlHus0s1lk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uThTw/dJMcac3jYs0/eqAhGmuGLqmcMlHus0s1lk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuThTw%2FdJMcac3jYs0%2FeqAhGmuGLqmcMlHus0s1lk%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;596&quot; height=&quot;585&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;585&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과같이 (2,5,8,10 ) 을 하나의 점으로 나타내고, (1,3) 사이 간선은 거리가 2, (2,3)은 5, ... 으로 나타낼 수 있을 것이다.&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;그러나 추상적으로 하나의 점으로 나타낸거지 경로를 추적할때 원래 출발점이 몇행인지 알아야 (i,M)에 몇개를 배치할 지&amp;nbsp; 카운트가 가능하므로,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pq에 (1,4)(2,4)(3,4)(4,4)를 넣고 시작한다.&amp;nbsp; 또한 dp[1][4] , dp[2][4] ... dp[4][4] 는 0 으로 시작하게 되면 다익스트라 돌릴때&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(1,4) -&amp;gt;(2,4)&amp;nbsp; (3,4) -&amp;gt;(4,4) ... 와 같은 과정을 생략 할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pq에 마지막열을 한꺼번에 넣고 시작하는게 중요했다. 마지막 열의 어떤 행에서 시작하던, 동등하기 때문이다.&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; pq 를 poll 했을 때(i , 1)이면, i 일때 방문했는지 확인하고 방문안했으면 저장해놓은 최단경로의 시작점의 행의 카운트 + 1 하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pq는&amp;nbsp; { 현재 x&amp;nbsp; , 현재 y , 그동안 방문한 총합, 시작 행} 이렇게 저장하면 될 것이다.&lt;/p&gt;</description>
      <category>알고리즘/baekjoon(boj)</category>
      <category>boj 16156</category>
      <category>백준 16156</category>
      <author>끄응끄응</author>
      <guid isPermaLink="true">https://jihyung1997.tistory.com/55</guid>
      <comments>https://jihyung1997.tistory.com/55#entry55comment</comments>
      <pubDate>Sun, 8 Mar 2026 19:39:01 +0900</pubDate>
    </item>
    <item>
      <title>[platinum4] [해설, 분류 미확인]boj9446  아이템 제작</title>
      <link>https://jihyung1997.tistory.com/54</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1894&quot; data-origin-height=&quot;1633&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9XFbb/dJMcafl5E8Z/M3m7k5ShVSx1Nn4M27uE8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9XFbb/dJMcafl5E8Z/M3m7k5ShVSx1Nn4M27uE8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9XFbb/dJMcafl5E8Z/M3m7k5ShVSx1Nn4M27uE8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9XFbb%2FdJMcafl5E8Z%2FM3m7k5ShVSx1Nn4M27uE8k%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;1894&quot; height=&quot;1633&quot; data-origin-width=&quot;1894&quot; data-origin-height=&quot;1633&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재밌는 다익스트라 활용 문제였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다익스트라의 그리디한 성질을 잘 활용하면 아이디어를 떠올리기 어렵지 않을 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아이템 조합은 두가지를 조합해 한개를 만드는 것인데,&amp;nbsp; 아이템1 + 아이템2 = 아이템3&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이라면 아이템3 가격은 아이템1가격 + 아이템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;즉 우선순위큐에 아이템들을 합친값이 원래 가격보다 작다면, 새로운 아이템을 넣는다.&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;우선순위큐에서 poll 하면&amp;nbsp; 그게 새로 업데이트된 아이템 가격중 최소의 가격이 될 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;425&quot; data-origin-height=&quot;377&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PORUL/dJMcaaj9qGv/OGZtZk4DyNkFJRmS41GMT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PORUL/dJMcaaj9qGv/OGZtZk4DyNkFJRmS41GMT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PORUL/dJMcaaj9qGv/OGZtZk4DyNkFJRmS41GMT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPORUL%2FdJMcaaj9qGv%2FOGZtZk4DyNkFJRmS41GMT1%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;425&quot; height=&quot;377&quot; data-origin-width=&quot;425&quot; data-origin-height=&quot;377&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이&amp;nbsp; 큐에서 poll한 값이 1번이면,&amp;nbsp; 1번이 지금 합성할 수 있는 아이템 중에 비용합이 최소임이 확정되는 것이다. 그럼 이제&amp;nbsp; &amp;nbsp;1번을 재료로 하는 4번 , 5번도 새로 업데이트해 우선순위큐에 넣어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 이제 불안요소가 있다. 4번 , 5번을 큐에 넣긴 할텐데, 재료가 되는 2번, 3번은&amp;nbsp; 업데이트가 되지 않았는데 그냥 넣어도 되는가? 이다.&amp;nbsp; 그러나 걱정할 필요 없다. 2번이 업데이트되면 2번을 재료로 하는 4번도 새로 업데이트해 우선순위큐에 넣을 것이고, 3번 업데이트시 업데이트된 5번을 새로 넣을 것이기 때문.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 또 한가지 불안요소가 발생한다. 만약 1번 + 2번 합쳐 4번을 큐에 넣었는데,&amp;nbsp; &amp;nbsp;다음에 poll한 값이 4번이라면? 아직 2번은 채 업데이트도 못했는데?&amp;nbsp; 그것도 걱정할 필요 없다. 4번을 뽑았을 때는 합성아이템중 4번 비용이 최소라는 뜻인데,&amp;nbsp; 2번이 아직 업데이트가 안됬다는 것은 4번비용보다 크다는 뜻이 된다.따라서 나중에 2번을 업데이트 한다 한들 1번과 새로 업데이트 된 2번을 합성하면 현재 뽑은 4번보다 값이 커질 것이므로, 말이 안된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뇌절이지만 그럼 또 하나의 불안. 그럼 한가지 아이템이 업데이트될 때마다,&amp;nbsp; 새로 합성되는 아이템들을 모두 업데이트해 큐에 넣어야 하는데, 메모리 시간 초과가 나지 않을까?&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;사실 이부분으로 좀 헷갈렸는데,&amp;nbsp; &amp;nbsp; 그렇지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선순위큐에서 n을 뽑을 때마다 n의 최솟값이 확정된 상태이므로, 이때 n이 재료가 되는 아이템을 모두 업데이트 후큐에 넣는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 모든 n은 한번 씩만 업데이트 된다. 위에서 1번이 업데이트 되면 , 4,5번을 업데이트, 2번이 업데이트 되면 4번 업데이트, 3번이 업데이트 되면 5번을 업데이트 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 큐에 넣는 횟수는 간선의 수(2*N)만큼이다. 따라서 시간,메모리 초과는 걱정 할 필요 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면 이렇다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.dp에 우선 각 아이템의 원래가격을 넣는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.각 아이템 합성된 값이 원래가격보다 작다면, pq(우선순위큐)에 넣는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 우선순위큐를 poll하면서, poll한 값을 재료로 하는 아이템들 가격을 새로 업데이트하고&amp;nbsp; pq에 넣는다. 당연히 업데이트 된 가격이 기존 dp값보다 크거나 같으면 넣지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 이렇게 다익스트라를 종료한 후 dp[1]값 출력&lt;/p&gt;</description>
      <category>알고리즘/baekjoon(boj)</category>
      <category>boj9446 아이템 제작</category>
      <category>백준 9446</category>
      <category>백준 아이템 제작</category>
      <author>끄응끄응</author>
      <guid isPermaLink="true">https://jihyung1997.tistory.com/54</guid>
      <comments>https://jihyung1997.tistory.com/54#entry54comment</comments>
      <pubDate>Fri, 6 Mar 2026 16:39:29 +0900</pubDate>
    </item>
  </channel>
</rss>