<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>이미난</title>
    <link>https://hvvan.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Fri, 10 Apr 2026 05:41:22 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>hvv_an</managingEditor>
    <image>
      <title>이미난</title>
      <url>https://tistory1.daumcdn.net/tistory/4045239/attach/784944b036df4d22bfe707ff9724fbf6</url>
      <link>https://hvvan.tistory.com</link>
    </image>
    <item>
      <title>백준 1213 - 팰린드롬 만들기</title>
      <link>https://hvvan.tistory.com/700</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script&gt;  MathJax = {    tex: {inlineMath: [['$', '$']]}  };&lt;/script&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;문제 설명&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;임한수와 임문빈은 서로 사랑하는 사이이다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;임한수는 세상에서 팰린드롬인 문자열을 너무 좋아하기 때문에, 둘의 백일을 기념해서 임문빈은 팰린드롬을 선물해주려고 한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;임문빈은 임한수의 영어 이름으로 팰린드롬을 만들려고 하는데, 임한수의 영어 이름의 알파벳 순서를 적절히 바꿔서 팰린드롬을 만들려고 한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;임문빈을 도와 임한수의 영어 이름을 팰린드롬으로 바꾸는 프로그램을 작성하시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1213&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/1213&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;제한 사항&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1150&quot; data-origin-height=&quot;93&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbrb8Y/btsPFi3Sk5y/fRoxlHbOYG2RTikn82KkR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbrb8Y/btsPFi3Sk5y/fRoxlHbOYG2RTikn82KkR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbrb8Y/btsPFi3Sk5y/fRoxlHbOYG2RTikn82KkR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbbrb8Y%2FbtsPFi3Sk5y%2FfRoxlHbOYG2RTikn82KkR1%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;1150&quot; height=&quot;93&quot; data-origin-width=&quot;1150&quot; data-origin-height=&quot;93&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;1142&quot; data-origin-height=&quot;222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mipEe/btsPCTdLf9M/mzzvIE1js1Px95F6WWZyl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mipEe/btsPCTdLf9M/mzzvIE1js1Px95F6WWZyl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mipEe/btsPCTdLf9M/mzzvIE1js1Px95F6WWZyl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmipEe%2FbtsPCTdLf9M%2FmzzvIE1js1Px95F6WWZyl1%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;222&quot; data-origin-width=&quot;1142&quot; data-origin-height=&quot;222&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&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;홀수인 문자의 개수가 1개 이하일 때만 팰린드롬을 만들 수 있다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 모든 문자의 개수를 세고 홀수인 문자가 1개 초과라면 종료한다.&lt;/p&gt;
&lt;pre id=&quot;code_1754023952213&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for (int i = 0; i &amp;lt; str.length(); i++)
{
    spellCnt[str[i] - 'A']++;
}

int odd = 0;
char oddChar = ' ';
for (auto spell = 'A'; spell &amp;lt;= 'Z'; spell++)
{
    auto cnt = spellCnt[spell - 'A'];
    if (cnt % 2 == 1)
    {
        odd++;
        oddChar = spell;
    }
}

if (odd &amp;gt; 1)
{
    cout &amp;lt;&amp;lt; &quot;I'm Sorry Hansoo&quot;;
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 팰린드롬은 만들 수 있기 때문에 모든 문자의 절반을 차례로 더해가며 팰린드롬의 왼쪽을 구성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 만약 홀수인 문자가 있다면 추가하고 나머지 절반을 뒤집어 더해주면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1754024022417&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string ans;
for (auto spell = 'A'; spell &amp;lt;= 'Z'; spell++)
{
    auto cnt = spellCnt[spell - 'A'];
    auto half = cnt / 2;

    for (int i = 0; i &amp;lt; half; i++)
    {
        ans += spell;
    }
}

auto rev = ans;
reverse(rev.begin(), rev.end());

if (odd == 1)
{
    ans += oddChar;
}
ans += rev;

cout &amp;lt;&amp;lt; ans;&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;전체 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1754024029977&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;bits/stdc++.h&amp;gt;
#include &amp;lt;unordered_set&amp;gt;
using namespace std;
#define INPUT_OPTIMIZE cin.tie(NULL); cout.tie(NULL); ios::sync_with_stdio(false);
#define INF 2e9
#define MAX 987654321

using namespace std;
string str;
vector&amp;lt;int&amp;gt; spellCnt(26, 0);

int main()
{
    INPUT_OPTIMIZE;

    cin &amp;gt;&amp;gt; str;

    for (int i = 0; i &amp;lt; str.length(); i++)
    {
        spellCnt[str[i] - 'A']++;
    }

    int odd = 0;
    char oddChar = ' ';
    for (auto spell = 'A'; spell &amp;lt;= 'Z'; spell++)
    {
        auto cnt = spellCnt[spell - 'A'];
        if (cnt % 2 == 1)
        {
            odd++;
            oddChar = spell;
        }
    }

    if (odd &amp;gt; 1)
    {
        cout &amp;lt;&amp;lt; &quot;I'm Sorry Hansoo&quot;;
        return 0;
    }

    string ans;
    for (auto spell = 'A'; spell &amp;lt;= 'Z'; spell++)
    {
        auto cnt = spellCnt[spell - 'A'];
        auto half = cnt / 2;

        for (int i = 0; i &amp;lt; half; i++)
        {
            ans += spell;
        }
    }

    auto rev = ans;
    reverse(rev.begin(), rev.end());

    if (odd == 1)
    {
        ans += oddChar;
    }
    ans += rev;

    cout &amp;lt;&amp;lt; ans;

    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;</description>
      <category>알고리즘/기타</category>
      <category>1213</category>
      <category>C++</category>
      <category>팰린드롬 만들기</category>
      <author>hvv_an</author>
      <guid isPermaLink="true">https://hvvan.tistory.com/700</guid>
      <comments>https://hvvan.tistory.com/700#entry700comment</comments>
      <pubDate>Fri, 1 Aug 2025 13:54:04 +0900</pubDate>
    </item>
    <item>
      <title>백준 9084 - 동전</title>
      <link>https://hvvan.tistory.com/699</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script&gt;  MathJax = {    tex: {inlineMath: [['$', '$']]}  };&lt;/script&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;문제 설명&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;우리나라 화폐단위, 특히 동전에는 1원, 5원, 10원, 50원, 100원, 500원이 있다. 이 동전들로는 정수의 금액을 만들 수 있으며 그 방법도 여러 가지가 있을 수 있다. 예를 들어, 30원을 만들기 위해서는 1원짜리 30개 또는 10원짜리 2개와 5원짜리 2개 등의 방법이 가능하다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;동전의 종류가 주어질 때에 주어진 금액을 만드는 모든 방법을 세는 프로그램을 작성하시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/9084&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/9084&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;제한 사항&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1141&quot; data-origin-height=&quot;87&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDMTte/btsPC46eyXe/zcjYUcHMhyfKPvRwLB62N1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDMTte/btsPC46eyXe/zcjYUcHMhyfKPvRwLB62N1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDMTte/btsPC46eyXe/zcjYUcHMhyfKPvRwLB62N1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDMTte%2FbtsPC46eyXe%2FzcjYUcHMhyfKPvRwLB62N1%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;1141&quot; height=&quot;87&quot; data-origin-width=&quot;1141&quot; data-origin-height=&quot;87&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;1157&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xeGT6/btsPBLT1uRU/Zp1InkaFnkIBwvfi52yWZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xeGT6/btsPBLT1uRU/Zp1InkaFnkIBwvfi52yWZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xeGT6/btsPBLT1uRU/Zp1InkaFnkIBwvfi52yWZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxeGT6%2FbtsPBLT1uRU%2FZp1InkaFnkIBwvfi52yWZ1%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;1157&quot; height=&quot;313&quot; data-origin-width=&quot;1157&quot; data-origin-height=&quot;313&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제를 요약하면 동전 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;해당 문제는 유명한 dp문제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dp에는 i를 만들 수 있는 경우의 수를 기록할 것이다.&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에 i를 만드는 수를 기록하는 방법은 i에서 돈을 뺐을 때 경우의 수를 합하여 만들 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 돈이 1, 2가 있다고 해 보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 i를 만드는 방법은 dp[i-1] + dp[i-2]로 만들 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 1과 2를 여러 번 사용할 수 있기 때문에 이렇게 두 개만 확인하면 안 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 사용할 동전을 정해놓고 해당 동전을 사용해 만들 수 있는 i를 업데이트하면서 진행하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1753844594969&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;dp[0] = 1;

for (auto&amp;amp; coin : coins)
{
    for (int i = coin; i &amp;lt;= target; i++)
    {
        dp[i] += dp[i - coin];
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;전체 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1753844725385&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;bits/stdc++.h&amp;gt;
#include &amp;lt;unordered_set&amp;gt;
using namespace std;
#define INPUT_OPTIMIZE cin.tie(NULL); cout.tie(NULL); ios::sync_with_stdio(false);
#define INF 2e9
#define MAX 987654321

using namespace std;
int T;

int main()
{
    INPUT_OPTIMIZE;

    cin &amp;gt;&amp;gt; T;

    while (T--)
    {
        int N, target;
        cin &amp;gt;&amp;gt; N;

        vector&amp;lt;int&amp;gt; coins;
        vector&amp;lt;int&amp;gt; dp;
        coins.resize(N);

        for (int i = 0; i &amp;lt; N; i++)
        {
            cin &amp;gt;&amp;gt; coins[i];
        }

        cin &amp;gt;&amp;gt; target;
        dp.resize(target + 1, 0);
        dp[0] = 1;

        for (auto&amp;amp; coin : coins)
        {
            for (int i = coin; i &amp;lt;= target; i++)
            {
                dp[i] += dp[i - coin];
            }
        }

        cout &amp;lt;&amp;lt; dp[target] &amp;lt;&amp;lt; &quot;\n&quot;;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;</description>
      <category>알고리즘/동적 계획법</category>
      <category>9084</category>
      <category>C++</category>
      <category>DP</category>
      <category>동전</category>
      <author>hvv_an</author>
      <guid isPermaLink="true">https://hvvan.tistory.com/699</guid>
      <comments>https://hvvan.tistory.com/699#entry699comment</comments>
      <pubDate>Wed, 30 Jul 2025 12:05:45 +0900</pubDate>
    </item>
    <item>
      <title>백준 2458 - 키 순서</title>
      <link>https://hvvan.tistory.com/698</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script&gt;  MathJax = {    tex: {inlineMath: [['$', '$']]}  };&lt;/script&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;문제 설명&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1번부터 N번까지 번호가 붙여져 있는 학생들에 대하여 두 학생끼리 키를 비교한 결과의 일부가 주어져 있다. 단, N명의 학생들의 키는 모두 다르다고 가정한다. 예를 들어, 6명의 학생들에 대하여 6번만 키를 비교하였고, 그 결과가 다음과 같다고 하자.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;1번 학생의 키 &amp;lt; 5번 학생의 키&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;3번 학생의 키 &amp;lt; 4번 학생의 키&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;5번 학생의 키 &amp;lt; 4번 학생의 키&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;4번 학생의 키 &amp;lt; 2번 학생의 키&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;4번 학생의 키 &amp;lt; 6번 학생의 키&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;5번 학생의 키 &amp;lt; 2번 학생의 키&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 비교 결과로부터 모든 학생 중에서 키가 가장 작은 학생부터 자신이 몇 번째인지 알 수 있는 학생들도 있고 그렇지 못한 학생들도 있다는 사실을 아래처럼 그림을 그려 쉽게 확인할 수 있다. a번 학생의 키가 b번 학생의 키보다 작다면, a에서 b로 화살표를 그려서 표현하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;117&quot; data-origin-height=&quot;154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7HKSF/btsPATYu3zy/zqgWKheucO3CeLj3iJm6V0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7HKSF/btsPATYu3zy/zqgWKheucO3CeLj3iJm6V0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7HKSF/btsPATYu3zy/zqgWKheucO3CeLj3iJm6V0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7HKSF%2FbtsPATYu3zy%2FzqgWKheucO3CeLj3iJm6V0%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;117&quot; height=&quot;154&quot; data-origin-width=&quot;117&quot; data-origin-height=&quot;154&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1번은 5번보다 키가 작고, 5번은 4번보다 작기 때문에, 1번은 4번보다 작게 된다. 그러면 1번, 3번, 5번은 모두 4번보다 작게 된다. 또한 4번은 2번과 6번보다 작기 때문에, 4번 학생은 자기보다 작은 학생이 3명이 있고, 자기보다 큰 학생이 2명이 있게 되어 자신의 키가 몇 번째인지 정확히 알 수 있다. 그러나 4번을 제외한 학생들은 자신의 키가 몇 번째인지 알 수 없다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;학생들의 키를 비교한 결과가 주어질 때, 자신의 키가 몇 번째인지 알 수 있는 학생들이 모두 몇 명인지 계산하여 출력하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2458&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/2458&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;제한 사항&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1154&quot; data-origin-height=&quot;96&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4Hewe/btsPB3MBCcO/CzeKmoCkWAHAbBfil1uSFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4Hewe/btsPB3MBCcO/CzeKmoCkWAHAbBfil1uSFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4Hewe/btsPB3MBCcO/CzeKmoCkWAHAbBfil1uSFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4Hewe%2FbtsPB3MBCcO%2FCzeKmoCkWAHAbBfil1uSFK%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;1154&quot; height=&quot;96&quot; data-origin-width=&quot;1154&quot; data-origin-height=&quot;96&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;1129&quot; data-origin-height=&quot;284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHUVO4/btsPAj4tuKE/H599EfrkiydsdVrkGoaZLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHUVO4/btsPAj4tuKE/H599EfrkiydsdVrkGoaZLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHUVO4/btsPAj4tuKE/H599EfrkiydsdVrkGoaZLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHUVO4%2FbtsPAj4tuKE%2FH599EfrkiydsdVrkGoaZLK%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;1129&quot; height=&quot;284&quot; data-origin-width=&quot;1129&quot; data-origin-height=&quot;284&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제를 요약하면 키를 비교한 관계가 M개 주어졌을 때 위치를 정확히 알 수 있는 노드의 개수를 구하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 문제를 보았을 때는 위상 정렬을 통해 풀 수 있다고 생각했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 위상 정렬은 느슨한 정렬을 수행하므로 정확한 위치를 알 수 있는 개수를 구하지 못한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 다른 접근이 필요한데 생각보다 간단하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 노드 a에서 다른 노드들까지의 거리를 구한다고 해보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 모든 노드까지의 거리를 구했을 때 그 거리를 모두 알고 있다면 a의 위치는 명확해진다.&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;모든 노드의 거리를 구해야 했기 때문이다.&lt;/p&gt;
&lt;pre id=&quot;code_1753666392455&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for (int k = 1; k &amp;lt;= N; k++)
{
    for (int i = 1; i &amp;lt;= N; i++)
    {
        for (int j = 1; j &amp;lt;= N; j++)
        {
            if (dist[i][j] &amp;gt; dist[i][k] + dist[k][j])
            {
                dist[i][j] = dist[i][k] + dist[k][j];
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 거리가 기록된 개수를 세고 그 개수가 N-1개이면 정확한 위치가 구해진 노드로 판정했다.&lt;/p&gt;
&lt;pre id=&quot;code_1753666426094&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int ans = 0;
for (int i = 1; i &amp;lt;= N; i++)
{
    int cnt = 0;
    for (int j = 1; j &amp;lt;= N; j++)
    {
        if (dist[i][j] != MAX || dist[j][i] != MAX) cnt++;
    }

    if (cnt == N - 1) ans++;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;전체 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1753666433548&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;bits/stdc++.h&amp;gt;
#include &amp;lt;unordered_set&amp;gt;
using namespace std;
#define INPUT_OPTIMIZE cin.tie(NULL); cout.tie(NULL); ios::sync_with_stdio(false);
#define INF 2e9
#define MAX 987654321

using namespace std;
int N, M;
vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; adj;
vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; dist;

int main()
{
    INPUT_OPTIMIZE;

    cin &amp;gt;&amp;gt; N &amp;gt;&amp;gt; M;

    adj.resize(N + 1, vector&amp;lt;int&amp;gt;());
    dist.resize(N + 1, vector&amp;lt;int&amp;gt;(N+1, MAX));

    for (int i = 0; i &amp;lt; M; i++)
    {
        int a, b;
        cin &amp;gt;&amp;gt; a &amp;gt;&amp;gt; b;

        dist[a][b] = 1;
    }

    for (int k = 1; k &amp;lt;= N; k++)
    {
        for (int i = 1; i &amp;lt;= N; i++)
        {
            for (int j = 1; j &amp;lt;= N; j++)
            {
                if (dist[i][j] &amp;gt; dist[i][k] + dist[k][j])
                {
                    dist[i][j] = dist[i][k] + dist[k][j];
                }
            }
        }
    }

    int ans = 0;
    for (int i = 1; i &amp;lt;= N; i++)
    {
        int cnt = 0;
        for (int j = 1; j &amp;lt;= N; j++)
        {
            if (dist[i][j] != MAX || dist[j][i] != MAX) cnt++;
        }

        if (cnt == N - 1) ans++;
    }

    cout &amp;lt;&amp;lt; ans;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;</description>
      <category>알고리즘/그래프 알고리즘</category>
      <category>2458</category>
      <category>C++</category>
      <category>그래프</category>
      <category>키 순서</category>
      <category>플로이드 와샬</category>
      <author>hvv_an</author>
      <guid isPermaLink="true">https://hvvan.tistory.com/698</guid>
      <comments>https://hvvan.tistory.com/698#entry698comment</comments>
      <pubDate>Mon, 28 Jul 2025 10:34:10 +0900</pubDate>
    </item>
    <item>
      <title>백준 2812 - 크게 만들기</title>
      <link>https://hvvan.tistory.com/697</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script&gt;  MathJax = {    tex: {inlineMath: [['$', '$']]}  };&lt;/script&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;문제 설명&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;사이클 게임은 두 명의 플레이어가 차례대로 돌아가며 진행하는 게임으로, 선 플레이어가 홀수 번째 차례를, 후 플레이어가 짝수 번째 차례를 진행한다. 게임 시작 시 0 부터&amp;nbsp;n&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;minus; 1 까지 고유한 번호가 부여된 평면 상의 점&lt;span&gt;&amp;nbsp;&lt;/span&gt;n&lt;span&gt;&amp;nbsp;&lt;/span&gt;개가 주어지며, 이 중 어느 세 점도 일직선 위에 놓이지 않는다. 매 차례 마다 플레이어는 두 점을 선택해서 이를 연결하는 선분을 긋는데, 이전에 그린 선분을 다시 그을 수는 없지만 이미 그린 다른 선분과 교차하는 것은 가능하다. 게임을 진행하다가 처음으로 사이클을 완성하는 순간 게임이 종료된다. 사이클&lt;span&gt;&amp;nbsp;&lt;/span&gt;C는 플레이어가 그린 선분들의 부분집합으로, 다음 조건을 만족한다.&lt;/p&gt;
&lt;blockquote style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;C에 속한 임의의 선분의 한 끝점에서 출발하여 모든 선분을 한 번씩만 지나서 출발점으로 되돌아올 수 있다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;문제는 선분을 여러 개 그리다 보면 사이클이 완성 되었는지의 여부를 판단하기 어려워 이미 사이클이 완성되었음에도 불구하고 게임을 계속 진행하게 될 수 있다는 것이다. 이 문제를 해결하기 위해서 게임의 진행 상황이 주어지면 몇 번째 차례에서 사이클이 완성되었는지, 혹은 아직 게임이 진행 중인지를 판단하는 프로그램을 작성하려 한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;입력으로 점의 개수&lt;span&gt;&amp;nbsp;&lt;/span&gt;n과&lt;span&gt;&amp;nbsp;&lt;/span&gt;m&lt;span&gt;&amp;nbsp;&lt;/span&gt;번째 차례까지의 게임 진행 상황이 주어지면 사이클이 완성 되었는지를 판단하고, 완성되었다면 몇 번째 차례에서 처음으로 사이클이 완성된 것인지를 출력하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/20040&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/20040&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;제한 사항&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1153&quot; data-origin-height=&quot;89&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Fy09a/btsPAjDpbnS/777jGBngoCtsXRCUkHZymK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Fy09a/btsPAjDpbnS/777jGBngoCtsXRCUkHZymK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Fy09a/btsPAjDpbnS/777jGBngoCtsXRCUkHZymK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFy09a%2FbtsPAjDpbnS%2F777jGBngoCtsXRCUkHZymK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1153&quot; height=&quot;89&quot; data-origin-width=&quot;1153&quot; data-origin-height=&quot;89&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;1155&quot; data-origin-height=&quot;306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blHKVU/btsPzW9nJGa/Sw4XOtMaHUyWvdm4t3Hu11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blHKVU/btsPzW9nJGa/Sw4XOtMaHUyWvdm4t3Hu11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blHKVU/btsPzW9nJGa/Sw4XOtMaHUyWvdm4t3Hu11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblHKVU%2FbtsPzW9nJGa%2FSw4XOtMaHUyWvdm4t3Hu11%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;1155&quot; height=&quot;306&quot; data-origin-width=&quot;1155&quot; data-origin-height=&quot;306&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제를 요약하면 선분을 하나씩 그어갈 때 사이클이 생기는지 여부를 판단하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 모든 성분을 그어도 사이클이 생기지 않는다면 0을 중간에 사이클이 생긴다면 해당 차례를 출력하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 완성된 그래프에서 사이클을 판정하는 것이 아니라 하나씩 선분을 만들어 가면서 사이클을 판정해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 유니온 파인드로 판단할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부모를 정하는 기준을 정하고 각 선분을 그으며 최상위 부모가 무엇인지 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 최상위 부모가 같다면 사이클에 포함되었다고 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 부모를 정하는 기준은 크게 중요하지 않고 일관되기만 하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1753591675497&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int Find(int a)
{
    if (parent[a] == a) return a;
    return parent[a] = Find(parent[a]);
}

void Union(int a, int b)
{
    a = Find(a);
    b = Find(b);

    if (a != b)
    {
        if (a &amp;gt; b) swap(a, b);
        parent[b] = a;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작은 번호가 부모가 되도록 설정하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 과정을 각 입력마다 처리하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1753591871240&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for (int i = 0; i &amp;lt; M; i++)
{
    int a, b;
    cin &amp;gt;&amp;gt; a &amp;gt;&amp;gt; b;

    a = Find(a);
    b = Find(b);

    if (a == b)
    {
        cout &amp;lt;&amp;lt; i + 1;
        return 0;
    }

    Union(a, b);
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;전체 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1753591881778&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;bits/stdc++.h&amp;gt;
#include &amp;lt;unordered_set&amp;gt;
using namespace std;
#define INPUT_OPTIMIZE cin.tie(NULL); cout.tie(NULL); ios::sync_with_stdio(false);
#define INF 2e9
#define MAX 987654321

using namespace std;
int N, M;
vector&amp;lt;int&amp;gt; parent;

int Find(int a)
{
    if (parent[a] == a) return a;
    return parent[a] = Find(parent[a]);
}

void Union(int a, int b)
{
    a = Find(a);
    b = Find(b);

    if (a != b)
    {
        if (a &amp;gt; b) swap(a, b);
        parent[b] = a;
    }
}

int main()
{
    INPUT_OPTIMIZE;

    cin &amp;gt;&amp;gt; N &amp;gt;&amp;gt; M;
    parent.resize(N);

    for (int i = 0; i &amp;lt; N; i++)
    {
        parent[i] = i;
    }

    for (int i = 0; i &amp;lt; M; i++)
    {
        int a, b;
        cin &amp;gt;&amp;gt; a &amp;gt;&amp;gt; b;

        a = Find(a);
        b = Find(b);

        if (a == b)
        {
            cout &amp;lt;&amp;lt; i + 1;
            return 0;
        }

        Union(a, b);
    }

    cout &amp;lt;&amp;lt; 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;</description>
      <category>알고리즘/기타</category>
      <category>20040</category>
      <category>C++</category>
      <category>사이클 게임</category>
      <category>유니온 파인드</category>
      <author>hvv_an</author>
      <guid isPermaLink="true">https://hvvan.tistory.com/697</guid>
      <comments>https://hvvan.tistory.com/697#entry697comment</comments>
      <pubDate>Sun, 27 Jul 2025 13:51:48 +0900</pubDate>
    </item>
    <item>
      <title>백준 2812 - 크게 만들기</title>
      <link>https://hvvan.tistory.com/696</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script&gt;  MathJax = {    tex: {inlineMath: [['$', '$']]}  };&lt;/script&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;문제 설명&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;N자리 숫자가 주어졌을 때, 여기서 숫자 K개를 지워서 얻을 수 있는 가장 큰 수를 구하는 프로그램을 작성하시오.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2812&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/2812&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;제한 사항&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1144&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5ja9I/btsPtCuqVSZ/BvhzJjlp9GxWM8bmj9dGjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5ja9I/btsPtCuqVSZ/BvhzJjlp9GxWM8bmj9dGjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5ja9I/btsPtCuqVSZ/BvhzJjlp9GxWM8bmj9dGjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5ja9I%2FbtsPtCuqVSZ%2FBvhzJjlp9GxWM8bmj9dGjk%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;1144&quot; height=&quot;88&quot; data-origin-width=&quot;1144&quot; data-origin-height=&quot;88&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;1147&quot; data-origin-height=&quot;264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVXwjc/btsPs1Ifh60/4i57GJmrdGvVxXTWQcq90K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVXwjc/btsPs1Ifh60/4i57GJmrdGvVxXTWQcq90K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVXwjc/btsPs1Ifh60/4i57GJmrdGvVxXTWQcq90K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVXwjc%2FbtsPs1Ifh60%2F4i57GJmrdGvVxXTWQcq90K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1147&quot; height=&quot;264&quot; data-origin-width=&quot;1147&quot; data-origin-height=&quot;264&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제를 요약하면 길이가 N인 숫자가 주어졌을 때 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;시간을 제외하고 풀이를 생각해 보면 K개의 숫자 조합을 만들고 이를 제거해 보며 최댓값을 구하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 N, K가 최대 500,000이기 때문에 시간 초과가 발생할 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 다른 전략이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 가장 큰 수를 만들기 위해서는 왼쪽(앞쪽)수가 커야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 앞에서 부터 가장 큰 수를 선택하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 보자.&lt;/p&gt;
&lt;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
1924&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;1은 앞에 아무 것도 없기 때문에 선택할 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9를 선택할지 결정할 때 1을 제거하고 9를 선택하는 것이 가장 큰 수를 만드는 방법이다.&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;2를 검사할 때는 뒤에 어떤 수가 있는지 모르기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4를 선택하는 상황에서는 2를 제거하고 4를 선택하는 것이 정답이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 i번째 수를 포함할지 결정할 때 i번째 수보다 앞의 수가 작다면 제거하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 제거하는 수를 K에서 빼주며 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;한 가지 의문이 들 수 있는 부분이 있는데 앞에서 수를 제거하지 않는 경우 최적해가 나올 수 있지 않을까 생각할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 앞에서 작은 수를 선택하면 뒤에 9999로 아무리 큰 수를 선택해도 앞이 작아 결국 작은 수가 완성된다.&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;i번째 수보다 스택에 top에 있는 수가 작다면 하나씩 제거하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1753144788518&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int num = input[i] - '0';
while (K &amp;gt; 0 &amp;amp;&amp;amp; !temp.empty() &amp;amp;&amp;amp; temp.back() &amp;lt; num)
{
    temp.pop_back();
    K--;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;마지막으로 주의할 점은 N이 500,000이기 때문에 int, long long으로 표현이 불가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 정답을 string으로 구성해야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1753144829282&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;string ans;
for (int i = 0; i &amp;lt; temp.size(); i++)
{
    ans += temp[i] + '0';
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;전체 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1753144834959&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;bits/stdc++.h&amp;gt;
#include &amp;lt;unordered_set&amp;gt;
using namespace std;
#define INPUT_OPTIMIZE cin.tie(NULL); cout.tie(NULL); ios::sync_with_stdio(false);
#define INF 2e9
#define MAX 987654321

using namespace std;
int N, K;
string input;

int main()
{
	INPUT_OPTIMIZE;
	
	cin &amp;gt;&amp;gt; N &amp;gt;&amp;gt; K;
	cin &amp;gt;&amp;gt; input;

	vector&amp;lt;int&amp;gt; temp;
	for (int i = 0; i &amp;lt; N; i++)
	{
		int num = input[i] - '0';
		while (K &amp;gt; 0 &amp;amp;&amp;amp; !temp.empty() &amp;amp;&amp;amp; temp.back() &amp;lt; num)
		{
			temp.pop_back();
			K--;
		}

		temp.push_back(num);
	}
		
	while (K &amp;gt; 0)
	{
		K--;
		temp.pop_back();
	}

	string ans;
	for (int i = 0; i &amp;lt; temp.size(); i++)
	{
		ans += temp[i] + '0';
	}

	cout &amp;lt;&amp;lt; ans;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;</description>
      <category>알고리즘/탐욕법</category>
      <category>2812</category>
      <category>C++</category>
      <category>그리디</category>
      <category>크게 만들기</category>
      <category>탐욕법</category>
      <author>hvv_an</author>
      <guid isPermaLink="true">https://hvvan.tistory.com/696</guid>
      <comments>https://hvvan.tistory.com/696#entry696comment</comments>
      <pubDate>Tue, 22 Jul 2025 09:41:11 +0900</pubDate>
    </item>
    <item>
      <title>백준 17135 - 캐슬 디펜스</title>
      <link>https://hvvan.tistory.com/695</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script&gt;  MathJax = {    tex: {inlineMath: [['$', '$']]}  };&lt;/script&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;문제 설명&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;캐슬 디펜스는 성을 향해 몰려오는 적을 잡는 턴 방식의 게임이다. 게임이 진행되는 곳은 크기가 N&amp;times;M인 격자판으로 나타낼 수 있다. 격자판은 1&amp;times;1 크기의 칸으로 나누어져 있고, 각 칸에 포함된 적의 수는 최대 하나이다. 격자판의 N번행의 바로 아래(N+1번 행)의 모든 칸에는 성이 있다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;성을 적에게서 지키기 위해 궁수 3명을 배치하려고 한다. 궁수는 성이 있는&amp;nbsp;칸에 배치할 수 있고, 하나의 칸에는 최대 1명의 궁수만 있을 수 있다.&amp;nbsp;각각의 턴마다 궁수는 적 하나를 공격할 수 있고, 모든 궁수는 동시에 공격한다. 궁수가 공격하는 적은 거리가 D이하인 적 중에서 가장 가까운 적이고, 그러한 적이 여럿일 경우에는 가장 왼쪽에 있는 적을 공격한다. 같은 적이 여러 궁수에게 공격당할 수 있다. 공격받은 적은 게임에서 제외된다. 궁수의 공격이 끝나면, 적이 이동한다. 적은 아래로 한 칸 이동하며, 성이 있는 칸으로 이동한 경우에는 게임에서 제외된다. 모든 적이 격자판에서 제외되면 게임이 끝난다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;게임 설명에서 보다시피 궁수를 배치한 이후의 게임 진행은 정해져있다. 따라서, 이 게임은 궁수의 위치가 중요하다. 격자판의 상태가 주어졌을 때, 궁수의 공격으로 제거할 수 있는 적의 최대 수를 계산해보자.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;격자판의 두 위치 (r1, c1), (r2, c2)의 거리는 |r1-r2| + |c1-c2|이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/17135&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/17135&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;제한 사항&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1141&quot; data-origin-height=&quot;93&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8rI6i/btsPqnd9af5/ubk3lqHzAEMYX7xqZmLSJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8rI6i/btsPqnd9af5/ubk3lqHzAEMYX7xqZmLSJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8rI6i/btsPqnd9af5/ubk3lqHzAEMYX7xqZmLSJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8rI6i%2FbtsPqnd9af5%2Fubk3lqHzAEMYX7xqZmLSJk%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;1141&quot; height=&quot;93&quot; data-origin-width=&quot;1141&quot; data-origin-height=&quot;93&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;1158&quot; data-origin-height=&quot;362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sbiJ7/btsPreU8i0d/cOlMbwK6TK04ZaDie1yH10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sbiJ7/btsPreU8i0d/cOlMbwK6TK04ZaDie1yH10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sbiJ7/btsPreU8i0d/cOlMbwK6TK04ZaDie1yH10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsbiJ7%2FbtsPreU8i0d%2FcOlMbwK6TK04ZaDie1yH10%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;1158&quot; height=&quot;362&quot; data-origin-width=&quot;1158&quot; data-origin-height=&quot;362&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제를 요약하면 N x M 격자에 적들에 대한 정보가 주어졌을 때 궁수 3명을 배치해 최대한 많은 적을 처리한다면 몇 명을 처리하는지 구하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;적들은 한 턴에 한 칸씩 아래로 전진한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;궁수가 처리할 수 있는 적은 D거리 이내에 위치해야 하고 만약 거리가 같은 적이 여러 명이라면 가장 왼쪽의 적을 처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;거리 공식은 &lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;|r&lt;/span&gt;1&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;-r&lt;/span&gt;2&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;| + |c&lt;/span&gt;1&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;-c&lt;/span&gt;2&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;|이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;해당 문제는 주어진 조건대로 구현하면 되는 문제이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #555555;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;구현해야 하는 부분을 정리하면 다음과 같다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;궁수 3명을 배치한다.&lt;/li&gt;
&lt;li&gt;적들이 한 칸씩 이동한다.&lt;/li&gt;
&lt;li&gt;가장 가까운(가장 왼쪽인) 적을 탐색한다.&lt;/li&gt;
&lt;li&gt;적을 처리한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 궁수 3명을 배치하는 방법을 알아보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제의 조건은 N, M이 15 이하이므로 매우 작은 경우의 수가 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 3명의 궁수를 배치하는 조합을 만들어 처리하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1752989348640&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void DFS(vector&amp;lt;int&amp;gt;&amp;amp; archers, int idx)
{
    if (archers.size() == 3)
    {
        ans = max(ans, Simulate(archers));
        return;
    }

    for (int i = idx; i &amp;lt; M; i++)
    {
        archers.push_back(i);
        DFS(archers, i + 1);
        archers.pop_back();
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 적들이 이동하고 처리하는 부분을 구현해 보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;적은 한 턴에 한 칸씩 움직인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;격자의 모든 적을 찾아 한 칸씩 밑으로 내려주는 방법도 있겠지만 시간이 오래 걸릴 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 처음 위치에서 몇 턴이 지났는지 기록한다면 위치를 계산할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 적들이 이동하여 성벽에 도달한다면 더 이상 공격할 수 없으므로 체크해 주고 다음 적을 이동시킨다.&lt;/p&gt;
&lt;pre id=&quot;code_1752989439258&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for (int j = 0; j &amp;lt; enemies.size(); j++)
{
    if (!movable[j]) continue;
    auto [y, x] = enemies[j];
    y += moves;
    
    if (y &amp;gt;= N)
    {
        movable[j] = false;
        enemiesCnt--;
        continue;
    }
    ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 이제 배치된 궁수들에서 적들과의 거리를 계산하여 타깃을 설정하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;거리는 위에서 언급된 공식으로 간단하게 구할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 거리가 D초과라면 공격이 불가능하므로 다음 적을 탐색한다.&lt;/p&gt;
&lt;pre id=&quot;code_1752989583727&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int dist = abs(y - N) + abs(x - archers[i]);
if (dist &amp;gt; D) continue;

if (dist &amp;lt; minDist)
{
    minDist = dist;
    minEnemy = j;
}


if (minEnemy != -1)
{
    target.insert(minEnemy);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;거리가 가장 가까운 적을 찾았다면 바로 처리하지 않고 타깃에 추가한 후 모든 궁수의 타겟 설정이 완료되었을 때 동시에 처리해야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇지 않으면 다른 궁수가 먼저 처리한 적을 제외하고 다른 타깃을 찾을 수 있기 때문에 문제의 조건에 맞지 않게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 주의할 점이 거리가 같은 적이 있으면 왼쪽의 적을 타깃으로 설정해야 하기 때문에 적들을 x좌표 기준으로 정렬을 해줘야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1752989644481&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool cmp(pair&amp;lt;int, int&amp;gt;&amp;amp; a, pair&amp;lt;int, int&amp;gt;&amp;amp; b)
{
    return a.second &amp;lt; b.second;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 반복하며 모든 적이 처리되거나 성벽에 도달하여 공격할 수 없게 되면 종료한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정에서 처치한 적의 수의 최댓값을 갱신하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;전체 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1752989800612&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;bits/stdc++.h&amp;gt;
#include &amp;lt;unordered_set&amp;gt;
using namespace std;
#define INPUT_OPTIMIZE cin.tie(NULL); cout.tie(NULL); ios::sync_with_stdio(false);
#define INF 2e9
#define MAX 987654321

using namespace std;
int N, M, D;
vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; grid;
vector&amp;lt;pair&amp;lt;int, int&amp;gt;&amp;gt; enemies;
int ans = 0;

int Simulate(vector&amp;lt;int&amp;gt;&amp;amp; archers)
{
    int moves = 0;
    int killCnt = 0;
    int enemiesCnt = enemies.size();
    vector&amp;lt;bool&amp;gt; movable(enemiesCnt, true);
    while (enemiesCnt &amp;gt; 0)
    {
        set&amp;lt;int&amp;gt; target;

        for (int i = 0 ; i &amp;lt; archers.size(); i++)
        {
            int minDist = MAX;
            int minEnemy = -1;

            for (int j = 0; j &amp;lt; enemies.size(); j++)
            {
                if (!movable[j]) continue;
                auto [y, x] = enemies[j];
                y += moves;
                if (y &amp;gt;= N)
                {
                    movable[j] = false;
                    enemiesCnt--;
                    continue;
                }

                int dist = abs(y - N) + abs(x - archers[i]);
                if (dist &amp;gt; D) continue;

                if (dist &amp;lt; minDist)
                {
                    minDist = dist;
                    minEnemy = j;
                }
            }

            if (minEnemy != -1)
            {
                target.insert(minEnemy);
            }
        }

        for (auto enemy : target)
        {
            movable[enemy] = false;
            enemiesCnt--;
            killCnt++;
        }

        moves++;
    }

    return killCnt;
}

void DFS(vector&amp;lt;int&amp;gt;&amp;amp; archers, int idx)
{
    if (archers.size() == 3)
    {
        ans = max(ans, Simulate(archers));
        return;
    }

    for (int i = idx; i &amp;lt; M; i++)
    {
        archers.push_back(i);
        DFS(archers, i + 1);
        archers.pop_back();
    }
}

bool cmp(pair&amp;lt;int, int&amp;gt;&amp;amp; a, pair&amp;lt;int, int&amp;gt;&amp;amp; b)
{
    return a.second &amp;lt; b.second;
}

int main()
{
    INPUT_OPTIMIZE;

    cin &amp;gt;&amp;gt; N &amp;gt;&amp;gt; M &amp;gt;&amp;gt; D;

    grid.resize(N, vector&amp;lt;int&amp;gt;(M));
    for (int i = 0; i &amp;lt; N; i++)
    {
        for (int j = 0; j &amp;lt; M; j++)
        {
            cin &amp;gt;&amp;gt; grid[i][j];
            if (grid[i][j])
            {
                enemies.push_back({ i,j });
            }
        }
    }

    sort(enemies.begin(), enemies.end(), cmp);

    vector&amp;lt;int&amp;gt; temp;
    DFS(temp, 0);

    cout &amp;lt;&amp;lt; ans;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;</description>
      <category>알고리즘/기타</category>
      <category>17135</category>
      <category>C++</category>
      <category>DFS</category>
      <category>조합</category>
      <category>캐슬 디펜스</category>
      <author>hvv_an</author>
      <guid isPermaLink="true">https://hvvan.tistory.com/695</guid>
      <comments>https://hvvan.tistory.com/695#entry695comment</comments>
      <pubDate>Sun, 20 Jul 2025 14:37:16 +0900</pubDate>
    </item>
    <item>
      <title>백준 1915 - 가장 큰 정사각형</title>
      <link>https://hvvan.tistory.com/694</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script&gt;  MathJax = {    tex: {inlineMath: [['$', '$']]}  };&lt;/script&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;문제 설명&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;n&amp;times;m의 0, 1로 된 배열이 있다. 이 배열에서 1로 된 가장 큰 정사각형의 크기를 구하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;table style=&quot;background-color: #ffffff; color: #333333; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위와 같은 예제에서는 가운데의 2&amp;times;2 배열이 가장 큰 정사각형이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1915&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/1915&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;제한 사항&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1149&quot; data-origin-height=&quot;97&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdMTis/btsPhEHFopN/ns6EJhtYqLf5sLfjnLIN5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdMTis/btsPhEHFopN/ns6EJhtYqLf5sLfjnLIN5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdMTis/btsPhEHFopN/ns6EJhtYqLf5sLfjnLIN5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdMTis%2FbtsPhEHFopN%2Fns6EJhtYqLf5sLfjnLIN5k%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;1149&quot; height=&quot;97&quot; data-origin-width=&quot;1149&quot; data-origin-height=&quot;97&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;1141&quot; data-origin-height=&quot;215&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RM096/btsPi1n26C4/ZZ0l7c6erbhffOA4iKTpg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RM096/btsPi1n26C4/ZZ0l7c6erbhffOA4iKTpg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RM096/btsPi1n26C4/ZZ0l7c6erbhffOA4iKTpg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRM096%2FbtsPi1n26C4%2FZZ0l7c6erbhffOA4iKTpg1%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;1141&quot; height=&quot;215&quot; data-origin-width=&quot;1141&quot; data-origin-height=&quot;215&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제를 요약하면 주어진 2차원 배열에서 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;table style=&quot;background-color: #ffffff; color: #333333; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 입력이 있다고 가정해 보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 (0 ,0)은 0이기 때문에 정사각형을 그릴 수 없다.&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;(0, 1)은 1이기 때문에 정사각형을 그려볼 수 있다.&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인 정사각형을 그리려 했을 때 오른쪽 칸이 0이기 때문에 크기가 2인 정사각형은 그리지 못한다.&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;(1, 1)에도 동일한 방법을 통해 정사각형을 그렸을 때 최대 크기가 4인 정사각형을 그릴 수 있다.&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;하지만 이렇게 모든 칸을 다 더해보면 시간 초과가 발생할 것이다.&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;즉, 누적합을 이용하면 효율적으로 개선할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2차원 누적합을 통해 현재 탐색 지점을 기준으로 한 변의 길이가 x인 정사각형을 그린다 했을 때 다음과 같은 식으로 계산할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1752542551364&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;bool Check(int i, int j)
{
    int next = ans + 1;
    if (i + ans &amp;gt; N || j + ans &amp;gt; M) return false;
    return next * next == sum[i + ans][j + ans] - sum[i - 1][j + ans] - sum[i + ans][j - 1] + sum[i - 1][j - 1];
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 ans는 현재 알고 있는 최대 크기의 정사각형의 한 변의 길이이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 이미 찾은 최대 크기 이전은 검사하지 않도록 하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것을 이제 모든 칸에서 진행하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1752542631646&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for (int i = 0; i &amp;lt; N; i++)
{
    for (int j = 0; j &amp;lt; M; j++)
    {
        if (grid[i][j] == '0') continue;

        while (Check(i + 1, j + 1))
        {
            ans++;
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 누적합을 구하는 방법은 다음과 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1752542649138&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//가로
for (int i = 1; i &amp;lt;= N; i++)
{
    for (int j = 1; j &amp;lt;= M; j++)
    {
        sum[i][j] = sum[i][j - 1] + (grid[i-1][j-1] - '0');
    }
}

//세로
for (int j = 1; j &amp;lt;= M; j++)
{
    for (int i = 1; i &amp;lt;= N; i++)
    {
        sum[i][j] += sum[i - 1][j];
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;전체 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1752542663448&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;bits/stdc++.h&amp;gt;
#include &amp;lt;unordered_set&amp;gt;
using namespace std;
#define INPUT_OPTIMIZE cin.tie(NULL); cout.tie(NULL); ios::sync_with_stdio(false);
#define INF 2e9
#define MAX 987654321

using namespace std;
int N, M;
vector&amp;lt;string&amp;gt; grid;
vector&amp;lt;vector&amp;lt;int&amp;gt;&amp;gt; sum;
int ans = 0;

bool Check(int i, int j)
{
    int next = ans + 1;
    if (i + ans &amp;gt; N || j + ans &amp;gt; M) return false;
    return next * next == sum[i + ans][j + ans] - sum[i - 1][j + ans] - sum[i + ans][j - 1] + sum[i - 1][j - 1];
}

int main()
{
    INPUT_OPTIMIZE;

    cin &amp;gt;&amp;gt; N &amp;gt;&amp;gt; M;
    grid.resize(N);
    sum.resize(N + 1, vector&amp;lt;int&amp;gt;(M + 1, 0));

    for (int i = 0; i &amp;lt; N; i++)
    {
        cin &amp;gt;&amp;gt; grid[i];
    }

    //가로
    for (int i = 1; i &amp;lt;= N; i++)
    {
        for (int j = 1; j &amp;lt;= M; j++)
        {
            sum[i][j] = sum[i][j - 1] + (grid[i-1][j-1] - '0');
        }
    }

    //세로
    for (int j = 1; j &amp;lt;= M; j++)
    {
        for (int i = 1; i &amp;lt;= N; i++)
        {
            sum[i][j] += sum[i - 1][j];
        }
    }

    for (int i = 0; i &amp;lt; N; i++)
    {
        for (int j = 0; j &amp;lt; M; j++)
        {
            if (grid[i][j] == '0') continue;

            while (Check(i + 1, j + 1))
            {
                ans++;
            }
        }
    }

    cout &amp;lt;&amp;lt; ans * ans;

    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;</description>
      <category>알고리즘/기타</category>
      <category>191</category>
      <category>2차원 누적합</category>
      <category>C++</category>
      <category>가장 큰 정사각형</category>
      <category>누적합</category>
      <author>hvv_an</author>
      <guid isPermaLink="true">https://hvvan.tistory.com/694</guid>
      <comments>https://hvvan.tistory.com/694#entry694comment</comments>
      <pubDate>Tue, 15 Jul 2025 10:25:03 +0900</pubDate>
    </item>
    <item>
      <title>백준 1744 - 수 묶기</title>
      <link>https://hvvan.tistory.com/693</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script&gt;  MathJax = {    tex: {inlineMath: [['$', '$']]}  };&lt;/script&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;문제 설명&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에 상관없이 묶을 수 있다. 하지만, 같은 위치에 있는 수(자기 자신)를&amp;nbsp;묶는 것은 불가능하다. 그리고 어떤 수를 묶게 되면, 수열의 합을 구할 때 묶은 수는 서로 곱한 후에 더한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들면, 어떤 수열이 {0, 1, 2, 4, 3, 5}일 때, 그냥 이 수열의 합을 구하면 0+1+2+4+3+5 = 15이다. 하지만, 2와 3을 묶고, 4와 5를 묶게 되면, 0+1+(2*3)+(4*5) = 27이 되어 최대가 된다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;수열의 모든 수는 단 한번만 묶거나, 아니면 묶지 않아야한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;수열이 주어졌을 때, 수열의 각 수를 적절히 묶었을 때, 그 합이 최대가 되게 하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1744&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/1744&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;제한 사항&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;87&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drG1eq/btsPg81WCEQ/vN2uVEmbhVEaUvAlDqHmf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drG1eq/btsPg81WCEQ/vN2uVEmbhVEaUvAlDqHmf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drG1eq/btsPg81WCEQ/vN2uVEmbhVEaUvAlDqHmf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdrG1eq%2FbtsPg81WCEQ%2FvN2uVEmbhVEaUvAlDqHmf1%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;1138&quot; height=&quot;87&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;87&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;1145&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byNMQm/btsPftl9nQu/remV9EMKDJUvbiHEII6tuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byNMQm/btsPftl9nQu/remV9EMKDJUvbiHEII6tuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byNMQm/btsPftl9nQu/remV9EMKDJUvbiHEII6tuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyNMQm%2FbtsPftl9nQu%2FremV9EMKDJUvbiHEII6tuk%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;1145&quot; height=&quot;246&quot; data-origin-width=&quot;1145&quot; data-origin-height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제를 요약하면 주어진 수들의 합을 최대로 만드는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 임의의 두 수를 한 번씩만 곱해서 더할 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;합을 최대로 만들어야 하므로 큰 수는 큰 수끼리 곱하는 것이 이득이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;음수끼리의 곱도 해당된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 음수와 양수를 구분하여 저장한 후 정렬을 통해 절댓값이 큰 수부터 곱하며 합을 구해 나가면 된다.&lt;/p&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;cpp&quot; style=&quot;background-color: #f7f7f9; color: #333333; text-align: start;&quot; data-ke-language=&quot;cpp&quot;&gt;&lt;code&gt;-1 2 1 3&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;4개의 입력이 주어졌다고 가정해 보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 음수와 양수로 나누면 {-1}, {1, 2, 3}으로 나눌 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 큰 수부터 차례로 곱해서 더하면 $2*3$을 더할 수 있고 남은 수들은 곱할 것이 없어 그대로 더하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$2*3 + 1 + (-1) = 6$이 된다.&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과 0에 대해 처리해줘야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 1은 양수이지만 곱해도 이득이 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 1은 곱하는 것보다 바로 더해주는 것이 합을 최대로 만드는 전략이 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1752454585449&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (num == 1) ans += num;
else positive.push_back(num);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 0에 대해 처리해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0은 사실 양수도 아니고 음수도 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 합을 최대로 만들기 위해서는 0을 음수 쪽에 포함해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;음수와 0을 곱해 0으로 만들게 되면 음수를 더하지 않을 수 있기 때문이다.&lt;/p&gt;
&lt;pre id=&quot;code_1752454652290&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (num &amp;lt;= 0)
{
    negative.push_back(num);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 정렬 기준에 대해서만 유의하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;양수의 경우 당연히 큰 수부터 곱해 나간 뒤 남은 요소는 더해주는 방법이 최대를 만드는 전략이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;음수의 경우 절댓값이 큰 수(더 작은 수)끼리 곱해야 최댓값을 만드는 전략이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 다음과 같이 정렬해 주어야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1752454838612&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sort(negative.begin(), negative.end(), greater&amp;lt;int&amp;gt;());
sort(positive.begin(), positive.end());&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 음수, 양수에서 각각 2개씩 뽑아 곱해서 더하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1752454882053&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;while (negative.size() &amp;gt; 1)
{
    int a = negative.back();
    negative.pop_back();
    
    int b = negative.back();
    negative.pop_back();
    
    ans += a * b;
}

while (!negative.empty())
{
    ans += negative.back();
    negative.pop_back();
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;전체 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1752454899334&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;bits/stdc++.h&amp;gt;
#include &amp;lt;unordered_set&amp;gt;
using namespace std;
#define INPUT_OPTIMIZE cin.tie(NULL); cout.tie(NULL); ios::sync_with_stdio(false);
#define INF 2e9
#define MAX 987654321

using namespace std;
int N;
vector&amp;lt;int&amp;gt; positive, negative;

int main()
{
	INPUT_OPTIMIZE;
	
	cin &amp;gt;&amp;gt; N;
	int ans = 0;

	for (int i = 0; i &amp;lt; N; i++)
	{
		int num;
		cin &amp;gt;&amp;gt; num;

		if (num &amp;lt;= 0)
		{
			negative.push_back(num);
		}
		else
		{
			if (num == 1) ans += num;
			else positive.push_back(num);
		}
	}

	sort(negative.begin(), negative.end(), greater&amp;lt;int&amp;gt;());
	sort(positive.begin(), positive.end());

	while (negative.size() &amp;gt; 1)
	{
		int a = negative.back();
		negative.pop_back();

		int b = negative.back();
		negative.pop_back();

		ans += a * b;
	}

	while (!negative.empty())
	{
		ans += negative.back();
		negative.pop_back();
	}

	while (positive.size() &amp;gt; 1)
	{
		int a = positive.back();
		positive.pop_back();

		int b = positive.back();
		positive.pop_back();

		ans += a * b;
	}

	while (!positive.empty())
	{
		ans += positive.back();
		positive.pop_back();
	}

	cout &amp;lt;&amp;lt; ans;

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;</description>
      <category>알고리즘/수학</category>
      <category>1744</category>
      <category>C++</category>
      <category>수 묶기</category>
      <author>hvv_an</author>
      <guid isPermaLink="true">https://hvvan.tistory.com/693</guid>
      <comments>https://hvvan.tistory.com/693#entry693comment</comments>
      <pubDate>Mon, 14 Jul 2025 10:01:55 +0900</pubDate>
    </item>
    <item>
      <title>백준 10799 - 쇠막대기</title>
      <link>https://hvvan.tistory.com/692</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script&gt;  MathJax = {    tex: {inlineMath: [['$', '$']]}  };&lt;/script&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;문제 설명&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;여러 개의 쇠막대기를 레이저로 절단하려고 한다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자른다. 쇠막대기와 레이저의 배치는 다음 조건을 만족한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;쇠막대기는 자신보다 긴 쇠막대기 위에만 놓일 수 있다. - 쇠막대기를 다른 쇠막대기 위에 놓는 경우 완전히 포함되도록 놓되, 끝점은 겹치지 않도록 놓는다.&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;각 쇠막대기를 자르는 레이저는 적어도 하나 존재한다.&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;레이저는 어떤 쇠막대기의 양 끝점과도 겹치지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;아래 그림은 위 조건을 만족하는 예를 보여준다. 수평으로 그려진 굵은 실선은 쇠막대기이고, 점은 레이저의 위치, 수직으로 그려진 점선 화살표는 레이저의 발사 방향이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;534&quot; data-origin-height=&quot;284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwuE9x/btsPfYyUNcT/O6J8Tkc2bfB4AYPQDX9pKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwuE9x/btsPfYyUNcT/O6J8Tkc2bfB4AYPQDX9pKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwuE9x/btsPfYyUNcT/O6J8Tkc2bfB4AYPQDX9pKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwuE9x%2FbtsPfYyUNcT%2FO6J8Tkc2bfB4AYPQDX9pKK%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;534&quot; height=&quot;284&quot; data-origin-width=&quot;534&quot; data-origin-height=&quot;284&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이러한 레이저와 쇠막대기의 배치는 다음과 같이 괄호를 이용하여 왼쪽부터 순서대로 표현할 수 있다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;레이저는 여는 괄호와 닫는 괄호의 인접한 쌍 &amp;lsquo;( ) &amp;rsquo; 으로 표현된다. 또한, 모든 &amp;lsquo;( ) &amp;rsquo;는 반드시 레이저를 표현한다.&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;쇠막대기의 왼쪽 끝은 여는 괄호 &amp;lsquo; ( &amp;rsquo; 로, 오른쪽 끝은 닫힌 괄호 &amp;lsquo;) &amp;rsquo; 로 표현된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위 예의 괄호 표현은 그림 위에 주어져 있다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;쇠막대기는 레이저에 의해 몇 개의 조각으로 잘려지는데, 위 예에서 가장 위에 있는 두 개의 쇠막대기는 각각 3개와 2개의 조각으로 잘려지고, 이와 같은 방식으로 주어진 쇠막대기들은 총 17개의 조각으로 잘려진다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;쇠막대기와 레이저의 배치를 나타내는 괄호 표현이 주어졌을 때, 잘려진 쇠막대기 조각의 총 개수를 구하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/10799&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/10799&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;제한 사항&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1130&quot; data-origin-height=&quot;87&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SHmo7/btsPhslc7O3/ABmjzTJOzADzbtEiMyZH9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SHmo7/btsPhslc7O3/ABmjzTJOzADzbtEiMyZH9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SHmo7/btsPhslc7O3/ABmjzTJOzADzbtEiMyZH9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSHmo7%2FbtsPhslc7O3%2FABmjzTJOzADzbtEiMyZH9K%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;1130&quot; height=&quot;87&quot; data-origin-width=&quot;1130&quot; data-origin-height=&quot;87&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;1159&quot; data-origin-height=&quot;221&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/22sq4/btsPgBQvSqy/L4vplGOHkwiQvdvhLl4Kc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/22sq4/btsPgBQvSqy/L4vplGOHkwiQvdvhLl4Kc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/22sq4/btsPgBQvSqy/L4vplGOHkwiQvdvhLl4Kc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F22sq4%2FbtsPgBQvSqy%2FL4vplGOHkwiQvdvhLl4Kc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1159&quot; height=&quot;221&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;221&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제를 요약하면 (, )로 이루어진 문자열로 막대와 레이저를 표현할 때 레이저에 의해 토막 난 막대의 총개수를 구하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레이저는 인접한 ()로 표현된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 문제는 stack을 이용하여 풀 수 있다.&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;534&quot; data-origin-height=&quot;284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwuE9x/btsPfYyUNcT/O6J8Tkc2bfB4AYPQDX9pKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwuE9x/btsPfYyUNcT/O6J8Tkc2bfB4AYPQDX9pKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwuE9x/btsPfYyUNcT/O6J8Tkc2bfB4AYPQDX9pKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwuE9x%2FbtsPfYyUNcT%2FO6J8Tkc2bfB4AYPQDX9pKK%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;300&quot; height=&quot;160&quot; data-origin-width=&quot;534&quot; data-origin-height=&quot;284&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;두 번째 레이저는 이전에 막대가 3개 존재했다.&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;세 번째 레이저도 마찬가지이다.&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;레이저라면 레이저 이전의 토막의 개수를 막대의 끝이라면 1을 더해주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 레이저 이전의 막대의 개수를 관리하기 위해 stack을 통해 '('가 나오면 추가해 주자.&lt;/p&gt;
&lt;pre id=&quot;code_1752370088035&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for (int i = 0; i &amp;lt; stick.length(); i++)
{
	auto current = stick[i];

	if (current == '(')
	{
		temp.push_back(current);
	}
	else
	{
		if (prev == '(')
		{
			// 레이저
			temp.pop_back();
			ans += temp.size();
		}
		else
		{
			//막대 끝
			temp.pop_back();
			ans++;
		}
	}

	prev = current;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;전체 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1752370097883&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;bits/stdc++.h&amp;gt;
#include &amp;lt;unordered_set&amp;gt;
using namespace std;
#define INPUT_OPTIMIZE cin.tie(NULL); cout.tie(NULL); ios::sync_with_stdio(false);
#define INF 2e9
#define MAX 987654321

using namespace std;
string stick;

int main()
{
	INPUT_OPTIMIZE;
	
	cin &amp;gt;&amp;gt; stick;
	
	vector&amp;lt;char&amp;gt; temp;
	char prev = ' ';

	int ans = 0;

	for (int i = 0; i &amp;lt; stick.length(); i++)
	{
		auto current = stick[i];

		if (current == '(')
		{
			temp.push_back(current);
		}
		else
		{
			if (prev == '(')
			{
				// 레이저
				temp.pop_back();
				ans += temp.size();
			}
			else
			{
				//막대 끝
				temp.pop_back();
				ans++;
			}
		}

		prev = current;
	}

	cout &amp;lt;&amp;lt; ans;

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;</description>
      <category>알고리즘/기타</category>
      <category>10799</category>
      <category>C++</category>
      <category>stack</category>
      <category>쇠막대기</category>
      <author>hvv_an</author>
      <guid isPermaLink="true">https://hvvan.tistory.com/692</guid>
      <comments>https://hvvan.tistory.com/692#entry692comment</comments>
      <pubDate>Sun, 13 Jul 2025 10:28:38 +0900</pubDate>
    </item>
    <item>
      <title>백준 1016 - 제곱 ㄴㄴ 수</title>
      <link>https://hvvan.tistory.com/691</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script&gt;  MathJax = {    tex: {inlineMath: [['$', '$']]}  };&lt;/script&gt;
&lt;script src=&quot;https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
&lt;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;문제 설명&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;어떤 정수 X가 1보다 큰 제곱수로 나누어 떨어지지 않을 때, 그 수를 제곱ㄴㄴ수라고 한다. 제곱수는 정수의 제곱이다. min과 max가 주어지면, min보다 크거나 같고, max보다 작거나 같은 제곱ㄴㄴ수가 몇 개 있는지 출력한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1016&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/1016&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;제한 사항&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cODEyC/btsPgxgfAfo/RbzKesLBcfa81qmTSBP1aK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cODEyC/btsPgxgfAfo/RbzKesLBcfa81qmTSBP1aK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cODEyC/btsPgxgfAfo/RbzKesLBcfa81qmTSBP1aK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcODEyC%2FbtsPgxgfAfo%2FRbzKesLBcfa81qmTSBP1aK%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;1152&quot; height=&quot;88&quot; data-origin-width=&quot;1152&quot; data-origin-height=&quot;88&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;1156&quot; data-origin-height=&quot;356&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BzR40/btsPfs1H1EW/0aVHKMNQk9DZVH8Ld5QvA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BzR40/btsPfs1H1EW/0aVHKMNQk9DZVH8Ld5QvA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BzR40/btsPfs1H1EW/0aVHKMNQk9DZVH8Ld5QvA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBzR40%2FbtsPfs1H1EW%2F0aVHKMNQk9DZVH8Ld5QvA1%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;1156&quot; height=&quot;356&quot; data-origin-width=&quot;1156&quot; data-origin-height=&quot;356&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;풀이&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제를 요약하면 min과 max사이의 수 중 제곱수로 나누어 떨어지지 않는 수의 개수를 세면 된다.&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;i에 제곱으로 나누어 떨어지지 않는지 확인하면 되기 때문이다.&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;2부터 시작하여 제곱으로 min을 나눈 몫부터 시작하여 false를 체크해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 아직 체크되지 않은 숫자라면 개수를 하나씩 줄여나가면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1752302443035&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;auto cnt = Max - Min + 1;

for (long long i = 2; i * i &amp;lt;= Max; i++)
{
	auto n = Min / (i * i);
	if (Min % (i * i)) n++;

	while (n * i * i &amp;lt;= Max)
	{
		if (!dp[n * i * i - Min])
		{
			cnt--;
			dp[n * i * i - Min] = true;
		}

		n++;
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 style=&quot;font-weight: bold; border-bottom: 1px solid #BBBBBB; margin: 10px 0px 5px; border-left: 5px solid #BBBBBB; letter-spacing: -0.07em; line-height: 30px; padding: 0px 10px 1px;&quot; data-ke-size=&quot;size23&quot;&gt;전체 코드&lt;/h3&gt;
&lt;pre id=&quot;code_1752302473230&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;bits/stdc++.h&amp;gt;
#include &amp;lt;unordered_set&amp;gt;
using namespace std;
#define INPUT_OPTIMIZE cin.tie(NULL); cout.tie(NULL); ios::sync_with_stdio(false);
#define INF 2e9
#define MAX 987654321

using namespace std;
long long Min, Max;

vector&amp;lt;bool&amp;gt; dp(1000001, false);

int main()
{
	INPUT_OPTIMIZE;
	
	cin &amp;gt;&amp;gt; Min &amp;gt;&amp;gt; Max;
	auto cnt = Max - Min + 1;

	for (long long i = 2; i * i &amp;lt;= Max; i++)
	{
		auto n = Min / (i * i);
		if (Min % (i * i)) n++;

		while (n * i * i &amp;lt;= Max)
		{
			if (!dp[n * i * i - Min])
			{
				cnt--;
				dp[n * i * i - Min] = true;
			}

			n++;
		}
	}

	cout &amp;lt;&amp;lt; cnt;

	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;</description>
      <category>알고리즘/기타</category>
      <category>1016</category>
      <category>C++</category>
      <category>에라토스테네스의 체</category>
      <category>제곱 ㄴㄴ 수</category>
      <author>hvv_an</author>
      <guid isPermaLink="true">https://hvvan.tistory.com/691</guid>
      <comments>https://hvvan.tistory.com/691#entry691comment</comments>
      <pubDate>Sat, 12 Jul 2025 15:41:35 +0900</pubDate>
    </item>
  </channel>
</rss>